J'utilise sudo-1.8.6 sur CentOS 6.5. Ma question est très simple: comment empêcher SHELL de se propager de l'environnement d'un utilisateur vers un environnement sudo?
Habituellement, les gens vont dans l'autre sens - ils veulent conserver une variable d'environnement. Cependant, j'ai un problème où mon utilisateur "zabbix" dont le shell /sbin/nologinessaie d'exécuter une commande via sudo. Sudo préserve le /sbin/nologinafin que root ne puisse pas exécuter de sous-shell. (Mise à jour: cette partie est vraie, mais ce n'est pas la variable d'environnement SHELL. C'est la valeur du shell qui est extraite de / etc / passwd qui est le problème.)
J'inclus un test qui illustre le problème; ce n'est pas mon cas d'utilisation réel, mais cela illustre simplement que le SHELL de l'utilisateur appelant est préservé. J'ai un programme qui fonctionne en tant qu'utilisateur zabbix. Il appelle /usr/bin/sudo -u root /tmp/doit(la programmation fonctionnant comme zabbixun démon, donc le /sbin/nologinshell dans le fichier de mot de passe ne l'empêche pas). /tmp/doitest un script shell qui a simplement:
#!/bin/sh
env > /tmp/outfile
(son mode est 755, évidemment). En outfileje peux voir que SHELLc'est /sbin/nologin. Cependant, à ce stade, le script s'exécute en tant que root, via sudo, donc il ne devrait pas avoir les variables d'environnement de l'utilisateur précédent, non?
Voici mon / etc / sudoers:
Valeurs par défaut requises Par défaut! Visiblepw Valeurs par défaut always_set_home Par défaut env_reset Def_ults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS" Valeurs par défaut env_keep + = "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" Valeurs par défaut env_keep + = "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" Paramètres par défaut env_keep + = "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" Valeurs par défaut env_keep + = "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY" Par défaut secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin: / usr / local / sbin ## Autoriser root à exécuter n'importe quelle commande n'importe où root ALL = (ALL) ALL #includedir /etc/sudoers.d
Et voici mon /etc/sudoers.d/zabbix:
Paramètres par défaut: zabbix! zabbix ALL = (root) NOPASSWD: / tmp / doit
Edit: Un peu plus d'informations:
Le processus exécutant le sudo est zabbix_agentd, à partir du logiciel de surveillance Zabbix. Il y a une entrée dans le /etc/zabbix/zabbix_agentd.d/userparameter_disk.conffichier qui ressemble à:
UserParameter = example.disk.discovery, / usr / local / bin / zabbix_raid_discovery
/usr/local/bin/zabbix_raid_discoveryest un script Python. Je l'ai modifié pour faire simplement ceci:
print subprocess.check_output (['/ usr / bin / sudo', '-u', 'root', '/ tmp / doit'])
/tmp/doit fait simplement ceci:
#! / bin / sh env >> / tmp / outfile
J'exécute ce qui suit sur mon serveur Zabbix pour exécuter le /usr/local/bin/zabbix_raid_discoveryscript:
zabbix_get -s client_hostname -k 'example.disk.discovery'
Ensuite, je vérifie le /tmp/outfile, et je vois:
SHELL = / sbin / nologin TERM = linux USER = root SUDO_USER = zabbix SUDO_UID = 497 USERNAME = root CHEMIN = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin: / usr / local / sbin MAIL = / var / mail / root PWD = / LANG = en_US.UTF-8 SHLVL = 1 SUDO_COMMAND = / tmp / doit ACCUEIL = / root LOGNAME = root SUDO_GID = 497 _ = / bin / env
Cette SHELLligne me dérange vraiment. Le fichier appartient à root, donc je sais qu'il est créé par l'utilisateur root, mais le shell vient de l'utilisateur appelant ( zabbix).
env_delete, mais je suis d' accord le nœud du problème est que le comportement par défaut de env_reset ...causes commands to be executed with a new, minimal environment.Nous avons un système Linux avec PAM, donc en fonction de la page de manuel, The new environment contains the ... SHELL ... (variable). Comme vous pouvez le voir dans mon /etc/sudoersfichier ci-dessus, nous n'autorisons pas SHELLle env_keep. Il SHELLne faut donc pas le conserver; nous devrions avoir l'utilisateur root SHELL.
zabbix ALL=(root) NOPASSWD: /bin/env SHELL=/bin/sh /tmp/doit *à mon /etc/sudoers/zabbixfichier, et il a un bon shell. Merci, j'ai maintenant une solution de contournement. La question est, pourquoi ai-je besoin de l'inclure? Il semble dangereux (et cassé) de passer le SHELL de l'appelant mais je ne trouve aucun endroit où sudo est configuré pour le modifier. J'ai couru find /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;et je ne trouve aucun drapeau rouge; /etc/sudoerscontient la seule env_chaîne. Je ne pense donc pas qu'il y ait un drapeau sudoers qui interfère ...
sudo bashdevrait démarrer un shell bash en tant que root et il DOIT avoir la variable SHELL définie sur la valeur de / etc / password. Vous signalez que SHELL est défini sur (ou conservé sous) /sbin/nologin. C'est un problème de sécurité, le shell démarré par root ne doit pas être contrôlé par une variable d'environnement définie par un utilisateur. C'est quelque chose que vous devez étudier.
sudo env SHELL=/bin/sh shune invite avec / bin / sh défini comme variable SHELL dans votre système?