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
).
fonte
sudo env SHELL=/bin/sh sh
fornecer um tempo com / bin / sh conjunto como a variável SHELL em seu sistema?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 manualThe new environment contains the ... SHELL ... (variable)
. Como você pode ver no meu/etc/sudoers
arquivo acima, não permitimosSHELL
noenv_keep
. PortantoSHELL
, não deve ser preservado; devemos ter o usuário rootSHELL
.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 corrifind /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;
e não encontro bandeiras vermelhas;/etc/sudoers
contém a únicaenv_
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.Respostas:
Então a resposta é que
sudo
tem um bug. Primeiro, a solução alternativa: coloquei isso no meu/etc/sudoers.d/zabbix file
:e agora subcomandos chamados do
zabbix_raid_discovery
trabalho.Um patch para corrigir isso estará no sudo 1.8.15. Do mantenedor, Todd Miller:
fonte
Provide default values for $SHELL, $TERM and $PATH if not set.
é:... if not set.
. Qualquer conjunto de valores será preservado pelo sudo. Quem está definindo o SHELL?A pergunta era sobre onde eu achava que estava o problema, mas acontece que o problema não é o que acontece com a variável SHELL, mas o que o sudo realmente faz. Por exemplo:
Por enquanto, tudo bem. ... mas o problema é que o sudo usa o shell do chamador em vez do chamado, ao contrário dos documentos. De fato, se eu mudar meu shell editando / etc / passwd, você pode ver que o sudo segue o shell do chamador e não
SHELL
:Não posso usar
sudo -i
porque não quero simular um login inicial.sudo -s
funcionará, desde que eu tenha o comando apropriado no arquivo sudoers. No entanto, o comportamento esperado (conforme refletido na página de manual: "The new environment contains the TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME and SUDO_* variables
") é que o shell seja o chamado. Se você olhar oPATH
,HOME
,LOGNAME
, eUSER
variáveis para sudo env você vai ver as coisas de raiz.SHELL
deve ser o shell da raiz também.fonte