PATH durch sudo weitergeben

13

Kurz gesagt : Wie kann Sudo dazu gebracht werden, PATH nicht jedes Mal zu löschen?

Ich habe einige Websites auf meinem Server bereitgestellt (Debian-Tests), die mit Ruby on Rails geschrieben wurden. Ich verwende Mongrel + Nginx, um sie zu hosten, aber es gibt ein Problem, das auftritt, wenn ich Mongrel neu starten muss (z. B. nachdem ich einige Änderungen vorgenommen habe).

Alle Sites werden in VCS (Git, aber es ist nicht wichtig) überprüft und haben Eigentümer und Gruppe auf meinen Benutzer festgelegt, während Mongrel unter dem, huh, Mongrel-Benutzer ausgeführt wird, dessen Rechte stark eingeschränkt sind. Daher muss Mongrel unter root (es kann automatisch die UID ändern) oder mongrel gestartet werden.

Um mongrel zu verwalten, verwende ich mongrel_cluster gem, da es das Starten oder Stoppen einer beliebigen Anzahl von Mongrel-Servern mit nur einem Befehl ermöglicht. Das Verzeichnis /var/lib/gems/1.8/bin muss sich jedoch in PATH befinden. Dies reicht nicht aus, um es mit einem absoluten Pfad zu starten .

Das Ändern von PATH in root .bashrc hat nichts geändert, das Ändern von sudos env_reset und env_keep auch nicht.

Also die Frage: Wie füge ich ein Verzeichnis zu PATH hinzu oder behalte den PATH des Benutzers in sudo?

Update: einige Beispiele

$ env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/var/lib/gems/1.8/bin
$ sudo cat /etc/sudoers | egrep -v '^$|^#'
Defaults    env_keep = "PATH"
root    ALL=(ALL) ALL
%sudo ALL=NOPASSWD: ALL
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Ich kann auch sagen, dass es genau so auch in Debian Stable (Lenny) funktioniert.

Whitequark
quelle

Antworten:

12

Kämpfte mit dem gleichen Problem für ein paar Stunden. In Debian Lenny können Sie dies durch Hinzufügen beheben

Defaults        exempt_group=<your group> 

in die sudoers-Datei.

Dies ist die einzige Möglichkeit, die kompilierte Option --secure-path zu umgehen (soweit ich weiß).

Bemerkenswert ist , wird dies auch Benutzer enthebt benötigen ihr Passwort einzugeben , wenn sie sudo.

rauben
quelle
3

Wenn Sie sich secure_pathfestgelegt haben /etc/sudoers, können Sie mit env_reset/ spielen, env_keepwas Sie möchten, und es wird keinen Unterschied für den Pfad machen. Wenn Sie so etwas sehen, kommentieren Sie es aus.

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Draemon
quelle
Nein, natürlich war es nicht festgelegt.
Whitequark
0

Ich würde sagen, schauen Sie sich die Optionen env_reset und env_keep in man sudo an . Aber es hört sich so an, als hätten Sie das bereits getan (Sie nennen env_keep fälschlicherweise "keepenv"). Wenn Sie die Option env_reset deaktivieren (Standardeinstellung ist aktiviert), sollte sie meiner Meinung nach keine env-Variablen löschen . Dies ist jedoch weniger sicher.

Es gibt auch eine secure_path-Option für sudo. Ich denke, das ist standardmäßig aktiviert. Sie können versuchen, es zu deaktivieren.

Die vorhergehenden Optionen werden in Ihrer / etc / sudoers-Datei festgelegt. Es gibt auch die -iBefehlszeilenoption für sudo. Das führt dazu, dass sudo /root/.profile oder /root/.login ausführt. Sie können dort Ihren gewünschten Pfad festlegen.

dubiousjim
quelle
1
Nein, wenn env_reset deaktiviert ist, ändert (nicht löscht) es immer noch PATH. Wahrscheinlich wird dies getan, um / * / sbin-Verzeichnisse hinzuzufügen. Nein, die Option -i ist nicht geeignet, da sie eine interaktive Shell startet und ich nur einen Befehl ausführen muss.
Whitequark
Okay, das Problem verschwand nach der Neuinstallation von Debian (wegen der Migration auf LVM) und auch RubyGems. Ihre Antwort war die nützlichste von allen, damit sie jetzt akzeptiert werden kann.
Whitequark
-1

Nun, du machst etwas falsch. Außerdem haben Sie nicht angegeben, was Sie mit Ihrer Datei / etc / sudoers gemacht haben. Folgendes hättest du tun sollen - das ist übrigens ein CentOS-System:

Erstens ist dies mit der richtigen env_keep-Einstellung (beachten Sie, dass PATH dort enthalten ist):

Sudo grep -5 PATH / etc / sudoers Defaults env_keep = "-Farben HOST HISTSIZE INPUTRC KDEDIR \ LS_COLORS MAIL PS1 PS2 QTDIR NUTZERNAME \ LANG LC_ADDRESS DARSTELLEN LC_CTYPE LC_COLLATE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \ _XKB_CHARSET XAUTHORITY PATH"

Defaults   timestamp_timeout = 15 

## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple

-> export PATH=$PATH:hithere
-> sudo sh -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/bin:hithere

Sieht gut aus. Entfernen wir nun die Einstellung env_keep und versuchen es erneut:

-> sudo visudo
-> sudo grep -5 PATH /etc/sudoers
                    LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                    LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                    LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                    LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                    _XKB_CHARSET XAUTHORITY"
 #_XKB_CHARSET XAUTHORITY PATH"

Was für ein trauriger WEG:

 -> sudo sh -c 'echo $PATH'
 /usr/bin:/bin
Emmel
quelle
1
Ich habe das MEHR als zweimal überprüft! Überprüfen Sie das Update in der Post.
Whitequark
Ich habe das gleiche Problem, ich habe definitiv die richtigen Einstellungen, die Sie erwähnen
Draemon