Ich verwende sudo-1.8.6 unter CentOS 6.5. Meine Frage ist sehr einfach: Wie verhindere ich, dass SHELL von einer Benutzerumgebung in eine Sudo-Umgebung übertragen wird?
Normalerweise gehen die Leute in die andere Richtung - sie möchten eine Umgebungsvariable beibehalten. Ich habe jedoch ein Problem, bei dem mein Benutzer "zabbix", dessen Shell /sbin/nologin
versucht, einen Befehl über sudo auszuführen. Sudo /sbin/nologin
behält das bei, damit root keine Subshells ausführen kann. (Update: Dieser Teil ist wahr, aber es ist nicht die Umgebungsvariable SHELL. Es ist der Shell-Wert, der aus / etc / passwd abgerufen wird, der das Problem darstellt.)
Ich füge einen Test hinzu, der das Problem veranschaulicht. Dies ist nicht mein realer Anwendungsfall, sondern zeigt lediglich, dass die SHELL des anrufenden Benutzers erhalten bleibt. Ich habe ein Programm, das als Benutzer ausgeführt wird zabbix
. Es wird aufgerufen /usr/bin/sudo -u root /tmp/doit
(die Programmierung zabbix
wird als Daemon ausgeführt, sodass die /sbin/nologin
Shell in der Kennwortdatei dies nicht verhindert). /tmp/doit
ist ein Shell-Skript, das einfach hat:
#!/bin/sh
env > /tmp/outfile
(sein Modus ist offensichtlich 755). In outfile
ich sehen kann , dass SHELL
ist /sbin/nologin
. Zu diesem Zeitpunkt wird das Skript jedoch über sudo als root ausgeführt, sodass es nicht die Umgebungsvariablen des vorherigen Benutzers enthalten sollte, oder?
Hier sind meine / etc / sudoers:
Standardeinstellungen erforderlich Standardeinstellungen! Visiblepw Standardmäßig always_set_home Standardmäßig env_reset Defaults env_keep = "FARBENANZEIGE HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS" Standardeinstellungen env_keep + = "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" Standardwert env_keep + = "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" Standardwerte env_keep + = "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" Standardeinstellungen env_keep + = "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY" Standardmäßig ist secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin: / usr / local / sbin ## Erlaube root, Befehle überall auszuführen root ALL = (ALL) ALL #includedir /etc/sudoers.d
Und hier ist mein /etc/sudoers.d/zabbix
:
Standardeinstellungen: zabbix! Requiretty zabbix ALL = (root) NOPASSWD: / tmp / doit
Edit: Ein bisschen mehr Information:
Der Prozess, auf dem der sudo ausgeführt wird zabbix_agentd
, stammt von der Zabbix-Überwachungssoftware. Die /etc/zabbix/zabbix_agentd.d/userparameter_disk.conf
Datei enthält einen Eintrag, der wie folgt aussieht:
UserParameter = example.disk.discovery, / usr / local / bin / zabbix_raid_discovery
/usr/local/bin/zabbix_raid_discovery
ist ein Python-Skript. Ich habe es geändert, um dies einfach zu tun:
print subprocess.check_output (['/ usr / bin / sudo', '-u', 'root', '/ tmp / doit'])
/tmp/doit
macht einfach das:
#! / bin / sh env >> / tmp / outfile
Ich führe auf meinem Zabbix-Server Folgendes aus, um das /usr/local/bin/zabbix_raid_discovery
Skript auszuführen :
zabbix_get -s client_hostname -k 'example.disk.discovery'
Dann überprüfe ich das /tmp/outfile
und sehe:
SHELL = / sbin / nologin TERM = Linux USER = root SUDO_USER = zabbix SUDO_UID = 497 USERNAME = root PATH = / 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 HOME = / root LOGNAME = root SUDO_GID = 497 _ = / bin / env
Diese SHELL
Linie nervt mich wirklich. Die Datei gehört root, daher weiß ich, dass sie vom Root-Benutzer erstellt wird, aber die Shell stammt vom aufrufenden Benutzer ( zabbix
).
env_delete
, aber ich stimme zu, dass der Kern des Problems darin besteht, dass das Standardverhalten von env_reset ...causes commands to be executed with a new, minimal environment.
ein Linux-System mit PAM ist The new environment contains the ... SHELL ... (variable)
. Wie Sie aus meiner /etc/sudoers
Datei oben sehen können, erlauben wir nicht SHELL
in der env_keep
. Sollte also SHELL
nicht erhalten bleiben; Wir sollten die Root-Benutzer haben SHELL
.
zabbix ALL=(root) NOPASSWD: /bin/env SHELL=/bin/sh /tmp/doit *
meiner /etc/sudoers/zabbix
Datei hinzugefügt , und sie hat eine richtige Shell. Danke, ich habe jetzt eine Problemumgehung. Die Frage ist, warum musste ich es aufnehmen? Es scheint gefährlich (und kaputt) zu sein, die SHELL des Anrufers zu übergeben, aber ich kann keinen Ort finden, an dem sudo eingestellt ist, um sie zu ändern. Ich bin gelaufen find /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;
und finde keine roten Fahnen; /etc/sudoers
enthält die einzige env_
Zeichenfolge. Ich glaube also nicht, dass eine Sudoers-Flagge stört ...
sudo bash
sollte eine Bash-Shell als root starten und die Variable SHELL muss auf den Wert von / etc / password gesetzt sein. Sie melden, dass SHELL auf gesetzt (oder beibehalten) wird /sbin/nologin
. Dies ist ein Sicherheitsproblem. Die von root gestartete Shell darf nicht von einer von einem Benutzer festgelegten Umgebungsvariablen gesteuert werden. Das müssen Sie untersuchen.
sudo env SHELL=/bin/sh sh
es eine Eingabeaufforderung mit / bin / sh als SHELL-Variable in Ihrem System?