Sto eseguendo sudo-1.8.6 su CentOS 6.5. La mia domanda è molto semplice: come posso impedire a SHELL di propagarsi dall'ambiente di un utente a un ambiente sudo?
Di solito le persone vanno dall'altra parte, vogliono preservare una variabile d'ambiente. Tuttavia, sto riscontrando un problema in cui il mio utente "zabbix", la cui shell /sbin/nologin
tenta di eseguire un comando tramite sudo. Il Sudo sta preservando il /sbin/nologin
modo in cui root non può eseguire subshells. (Aggiornamento: questa parte è vera, ma non è la variabile di ambiente SHELL. È il valore della shell che viene estratto da / etc / passwd che è il problema.)
Includo un test che illustra il problema; questo non è il mio caso d'uso reale ma illustra semplicemente che lo SHELL dell'utente chiamante viene preservato. Ho un programma che funziona come utente zabbix
. Chiama /usr/bin/sudo -u root /tmp/doit
(la programmazione in esecuzione come zabbix
è un demone, quindi la /sbin/nologin
shell nel file delle password non lo impedisce). /tmp/doit
è uno script di shell che ha semplicemente:
#!/bin/sh
env > /tmp/outfile
(la sua modalità è 755, ovviamente). In outfile
posso vedere che SHELL
è /sbin/nologin
. Tuttavia, a questo punto lo script viene eseguito come root, tramite sudo, quindi non dovrebbe avere le variabili di ambiente dell'utente precedente, giusto?
Ecco il mio / etc / sudoers:
Predefiniti richiesti Predefiniti! Visiblepw Predefiniti always_set_home Predefiniti env_reset Valori predefiniti env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS" Valori predefiniti env_keep + = "MAIL PS1 PS2 QTDIR NOME UTENTE LANG LC_ADDRESS LC_CTYPE" Valori predefiniti env_keep + = "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" Valori predefiniti env_keep + = "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" Valori predefiniti env_keep + = "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY" Valori predefiniti secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin: / usr / local / sbin ## Consenti a root di eseguire qualsiasi comando ovunque root ALL = (ALL) ALL #includedir /etc/sudoers.d
Ed ecco il mio /etc/sudoers.d/zabbix
:
Valori predefiniti: zabbix! Requiretty zabbix ALL = (root) NOPASSWD: / tmp / doit
Modifica: qualche informazione in più:
Il processo che esegue il sudo è zabbix_agentd
, dal software di monitoraggio Zabbix. C'è una voce nel /etc/zabbix/zabbix_agentd.d/userparameter_disk.conf
file che assomiglia a:
UserParameter = example.disk.discovery, / usr / local / bin / zabbix_raid_discovery
/usr/local/bin/zabbix_raid_discovery
è uno script Python. L'ho modificato per fare semplicemente questo:
print subprocess.check_output (['/ usr / bin / sudo', '-u', 'root', '/ tmp / doit'])
/tmp/doit
fa semplicemente questo:
#! / Bin / sh env >> / tmp / outfile
Eseguo quanto segue sul mio server Zabbix per eseguire lo /usr/local/bin/zabbix_raid_discovery
script:
zabbix_get -s nome_host client -k 'esempio.disk.discovery'
Quindi controllo il /tmp/outfile
e vedo:
SHELL = / sbin / nologin TERM = linux USER = radice SUDO_USER = Zabbix SUDO_UID = 497 USERNAME = radice PATH = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin: / usr / local / sbin MAIL = / var / mail / root PWD = / LANG = it_IT.UTF-8 SHLVL = 1 SUDO_COMMAND = / tmp / doit HOME = / root LOGNAME = radice SUDO_GID = 497 _ = / Bin / ENV
Quella SHELL
linea mi infastidisce davvero. Il file è di proprietà di root, quindi so che viene creato dall'utente root, ma la shell proviene dall'utente chiamante ( zabbix
).
env_delete
, ma sono d'accordo il nocciolo del problema è che il comportamento predefinito di env_reset ...causes commands to be executed with a new, minimal environment.
Abbiamo un sistema Linux con PAM, così secondo la pagina man, The new environment contains the ... SHELL ... (variable)
. Come puoi vedere dal mio /etc/sudoers
file sopra, non consentiamo SHELL
nel env_keep
. Quindi SHELL
non dovrebbe essere preservato; dovremmo avere l'utente root SHELL
.
zabbix ALL=(root) NOPASSWD: /bin/env SHELL=/bin/sh /tmp/doit *
al mio /etc/sudoers/zabbix
file e ha una shell corretta. Grazie, ora ho una soluzione alternativa. La domanda è: perché ho dovuto includerlo? Sembra pericoloso (e rotto) passare SHELL del chiamante ma non riesco a trovare un posto in cui sudo è impostato per modificarlo. Ho corso find /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;
e non trovo bandiere rosse; /etc/sudoers
contiene l'unica env_
stringa. Quindi non penso che ci sia una bandiera sudoers che interferisce ...
sudo bash
dovrebbe avviare una shell bash come root e DEVE avere la variabile SHELL impostata sul valore da / etc / password. Si segnala che SHELL è impostato su (o conservato come) /sbin/nologin
. Questo è un problema di sicurezza, la shell avviata da root non deve essere controllata da una variabile d'ambiente impostata da un utente. Questo è qualcosa che devi investigare.
sudo env SHELL=/bin/sh sh
fornire una con / bin / sh set pronta come variabile SHELL nel vostro sistema?