Estou executando o sudo-1.8.6 no CentOS 6.5. Minha pergunta é muito simples: como impedir que o SHELL se propague do ambiente de um usuário para um ambiente sudo?
Normalmente, as pessoas estão indo para o outro lado - elas querem preservar uma variável de ambiente. No entanto, estou tendo um problema em que meu usuário "zabbix", cujo shell /sbin/nologin
tenta executar um comando via sudo. O Sudo está preservando o arquivo /sbin/nologin
para que o root não possa executar subshells. (Atualização: Esta parte é verdadeira, mas não é a variável de ambiente SHELL. É o valor do shell que está sendo extraído de / etc / passwd que é o problema.)
Eu incluo um teste que ilustra o problema; esse não é meu caso de uso do mundo real, mas simplesmente ilustra que o SHELL do usuário que está chamando é preservado. Eu tenho um programa que roda como usuário zabbix
. Ele chama /usr/bin/sudo -u root /tmp/doit
(a programação sendo executada como zabbix
é um daemon, para que o /sbin/nologin
shell no arquivo de senhas não o impeça). /tmp/doit
é um shell script que simplesmente possui:
#!/bin/sh
env > /tmp/outfile
(seu modo é 755, obviamente). Em outfile
posso ver que SHELL
é /sbin/nologin
. No entanto, neste ponto, o script está sendo executado como root, via sudo, portanto, não deve ter as variáveis de ambiente do usuário anterior, certo?
Aqui está o meu / etc / sudoers:
Padrões requiretty Padrões! Visiblepw Padrões always_set_home Padrões env_reset Padrões env_keep = "NOME DO NOME DE HOSPEDAGEM DE CORES HISTSIZE INPUTRC KDEDIR LS_COLORS" Padrões env_keep + = "MAIL PS1 PS2 QTDIR NOME DO USUÁRIO LANG LC_ADDRESS LC_CTYPE" Padrões env_keep + = "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" Padrões env_keep + = "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" Padrões env_keep + = "LC_TIME LC_ALL LINGUAS IDIOMAS _XKB_CHARSET XAUTHORITY" O caminho padrão é secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin: / usr / local / sbin ## Permitir que o root execute qualquer comando em qualquer lugar raiz ALL = (ALL) ALL #includedir /etc/sudoers.d
E aqui está o meu /etc/sudoers.d/zabbix
:
Padrões: zabbix! Requiretty zabbix ALL = (raiz) NOPASSWD: / tmp / doit
Edit: Um pouco mais de informação:
O processo que executa o sudo é zabbix_agentd
, a partir do software de monitoramento Zabbix. Há uma entrada no /etc/zabbix/zabbix_agentd.d/userparameter_disk.conf
arquivo que se parece com:
UserParameter = example.disk.discovery, / usr / local / bin / zabbix_raid_discovery
/usr/local/bin/zabbix_raid_discovery
é um script Python. Eu o modifiquei para fazer isso simplesmente:
print subprocess.check_output (['/ usr / bin / sudo', '-u', 'raiz', '/ tmp / doit'])
/tmp/doit
simplesmente faz isso:
#! / bin / sh env >> / tmp / outfile
Eu executo o seguinte no meu servidor Zabbix para executar o /usr/local/bin/zabbix_raid_discovery
script:
zabbix_get -s client_hostname -k 'example.disk.discovery'
Então eu verifico /tmp/outfile
e vejo:
SHELL = / sbin / nologin TERM = linux USER = raiz SUDO_USER = zabbix SUDO_UID = 497 USERNAME = root PATH = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin: / usr / local / sbin CORREIO = / var / mail / root PWD = / LANG = pt_BR.UTF-8 SHLVL = 1 SUDO_COMMAND = / tmp / doit HOME = / root LOGNAME = root SUDO_GID = 497 _ = / bin / env
Essa SHELL
frase realmente me incomoda. O arquivo pertence à raiz, então eu sei que está sendo criado pelo usuário raiz, mas o shell é do usuário que está chamando ( zabbix
).
env_delete
, mas concordo que o cerne do problema é que o comportamento padrão de env_reset ...causes commands to be executed with a new, minimal environment.
Temos um sistema Linux com PAM, de acordo com a página de manual The new environment contains the ... SHELL ... (variable)
. Como você pode ver no meu /etc/sudoers
arquivo acima, não permitimos SHELL
no env_keep
. Portanto SHELL
, não deve ser preservado; devemos ter o usuário root SHELL
.
zabbix ALL=(root) NOPASSWD: /bin/env SHELL=/bin/sh /tmp/doit *
ao meu /etc/sudoers/zabbix
arquivo e ele possui um shell apropriado. Obrigado, agora tenho uma solução alternativa. A questão é: por que eu preciso incluí-lo? Parece perigoso (e quebrado) passar o SHELL do chamador, mas não consigo encontrar um lugar onde o sudo esteja configurado para modificá-lo. Eu corri find /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;
e não encontro bandeiras vermelhas; /etc/sudoers
contém a única env_
string. Então eu não acho que há uma bandeira sudoers interferir ...
sudo bash
deve iniciar um shell bash como root e DEVE ter a variável SHELL definida como o valor de / etc / password. Você informa que SHELL está sendo definido como (ou preservado como) /sbin/nologin
. Esse é um problema de segurança, o shell iniciado pelo root não deve ser controlado por uma variável de ambiente definida por um usuário. Isso é algo que você deve investigar.
sudo env SHELL=/bin/sh sh
fornecer um tempo com / bin / sh conjunto como a variável SHELL em seu sistema?