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
).
quelle
sudo env SHELL=/bin/sh sh
es eine Eingabeaufforderung mit / bin / sh als SHELL-Variable in Ihrem System?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 istThe new environment contains the ... SHELL ... (variable)
. Wie Sie aus meiner/etc/sudoers
Datei oben sehen können, erlauben wir nichtSHELL
in derenv_keep
. Sollte alsoSHELL
nicht erhalten bleiben; Wir sollten die Root-Benutzer habenSHELL
.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 gelaufenfind /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;
und finde keine roten Fahnen;/etc/sudoers
enthält die einzigeenv_
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.Antworten:
Dann ist die Antwort, dass
sudo
es einen Fehler gibt. Zunächst die Problemumgehung: Ich habe dies in meine/etc/sudoers.d/zabbix file
:und jetzt Unterbefehle von der
zabbix_raid_discovery
Arbeit aufgerufen .Ein Patch, um dies zu beheben, wird in sudo 1.8.15 sein. Vom Betreuer Todd Miller:
quelle
Provide default values for $SHELL, $TERM and $PATH if not set.
ist :... if not set.
. Jeder eingestellte Wert wird von sudo beibehalten. Wer setzt SHELL?Die Frage war, wo ich dachte, dass das Problem liegt, aber es stellt sich heraus, dass das Problem nicht darin besteht, was mit der SHELL-Variablen passiert, sondern was sudo tatsächlich tut. Zum Beispiel:
So weit, ist es gut. ... aber das Problem ist, dass sudo im Gegensatz zu den Dokumenten die Shell des Anrufers anstelle des Angerufenen verwendet. Wenn ich meine Shell durch Bearbeiten von / etc / passwd ändere, können Sie sehen, dass sudo der Shell des Aufrufers folgt und nicht
SHELL
:Ich kann nicht verwenden,
sudo -i
da ich keine erste Anmeldung simulieren möchte.sudo -s
wird funktionieren, solange ich den richtigen Befehl in der sudoers-Datei habe. Das erwartete Verhalten (wie in der Manpage angegeben: "The new environment contains the TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME and SUDO_* variables
") ist jedoch, dass die Shell der Angerufene ist. Wenn Sie auf der SuchePATH
,HOME
,LOGNAME
, undUSER
Variablen für sudo env werden Sie root Sachen sehen.SHELL
sollte auch die Wurzelschale sein.quelle