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/nologin
essaie d'exécuter une commande via sudo. Sudo préserve le /sbin/nologin
afin 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 zabbix
un démon, donc le /sbin/nologin
shell dans le fichier de mot de passe ne l'empêche pas). /tmp/doit
est un script shell qui a simplement:
#!/bin/sh
env > /tmp/outfile
(son mode est 755, évidemment). En outfile
je peux voir que SHELL
c'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.conf
fichier qui ressemble à:
UserParameter = example.disk.discovery, / usr / local / bin / zabbix_raid_discovery
/usr/local/bin/zabbix_raid_discovery
est 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_discovery
script:
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 SHELL
ligne 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
).
la source
sudo env SHELL=/bin/sh sh
une invite avec / bin / sh défini comme variable SHELL dans votre système?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/sudoers
fichier ci-dessus, nous n'autorisons pasSHELL
leenv_keep
. IlSHELL
ne faut donc pas le conserver; nous devrions avoir l'utilisateur rootSHELL
.zabbix ALL=(root) NOPASSWD: /bin/env SHELL=/bin/sh /tmp/doit *
à mon/etc/sudoers/zabbix
fichier, 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 courufind /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;
et je ne trouve aucun drapeau rouge;/etc/sudoers
contient la seuleenv_
chaîne. Je ne pense donc pas qu'il y ait un drapeau sudoers qui interfère ...sudo bash
devrait 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.Réponses:
Alors la réponse est qu'il y
sudo
a un bug. Tout d'abord, la solution de contournement: je mets ceci dans mon/etc/sudoers.d/zabbix file
:et maintenant des sous-commandes appelées depuis le
zabbix_raid_discovery
travail.Un correctif pour résoudre ce problème sera dans sudo 1.8.15. Du responsable, Todd Miller:
la source
Provide default values for $SHELL, $TERM and $PATH if not set.
est:... if not set.
. Tout ensemble de valeurs sera conservé par sudo. Qui met SHELL?La question était de savoir où je pensais que le problème était, mais il s'avère que le problème n'est pas ce qui arrive à la variable SHELL, mais ce que fait réellement sudo. Par exemple:
Jusqu'ici tout va bien. ... mais le problème est que sudo utilise le shell de l'appelant au lieu de l'appelé, contrairement aux docs. En effet, si je change de shell en éditant / etc / passwd, vous pouvez voir que sudo suit le shell de l'appelant et non
SHELL
:Je ne peux pas l'utiliser
sudo -i
car je ne veux pas simuler une connexion initiale.sudo -s
fonctionnera, tant que j'ai la commande appropriée dans le fichier sudoers. Cependant, le comportement attendu (tel que reflété dans la page de manuel: "The new environment contains the TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME and SUDO_* variables
") est que le shell appartient à l'appelé. Si vous regardez lePATH
,HOME
,LOGNAME
etUSER
variables pour env sudo vous verrez des choses de la racine.SHELL
devrait également être le shell de root.la source