2012-04-22 4 views

Antwort

16

sudo bietet einige Umgebungsvariablen, die Sie mit genau diesem Fall helfen:

SUDO_UID  Set to the user ID of the user who invoked 
        sudo 

    SUDO_USER  Set to the login of the user who invoked sudo 

steveayre in den Kommentaren klargestellt hat, dass der Benutzer diese Umgebungsvariablen in einigen Fällen festlegen; die sudo(8) manpage umfasst unter anderem:

The sudoers policy subjects variables 
passed on the command line to the same restrictions as normal 
environment variables with one important exception. If the 
setenv option is set in sudoers, the command to be run has the 
SETENV tag set or the command matched is ALL, the user may set 
variables that would otherwise be forbidden. See sudoers(5) 
for more information. 

So sicher sein, dass Sie ALL Befehle an Benutzer nicht erteilen, wenn Sie auf diese Funktion verlassen müssen.

+1

Ich hasse wirklich die Verwendung von Umgebungsvariablen, gibt es einen anderen Weg? (Der Hauptgrund, warum ich sie hasse, ist, weil sie nicht zuverlässig sind: von einem Sicherheits-POV oder einem kompatiblen POV) – chacham15

+1

Die Umgebungsvariablen sollten vertrauenswürdig sein - Sie müssen 'sudo' vollständig vertrauen, um es auf diese Weise zu verwenden.Jeder Angriff gegen 'sudo', der marginal vertrauenswürdigen Benutzern erlaubt, Programme mit modifizierten Umgebungsvariablen auszuführen, wird den Fokus von Dutzenden von Sicherheitsteams auf der ganzen Welt bringen, um den Fehler zu beheben (oder das Feature zu entfernen, wenn es nicht behoben werden kann). Was die Kompatibilität anbelangt, ist dies tragbarer als die andere Option, an die ich gerade gedacht habe - sie wurde separat für ihre eigenen Kommentare beantwortet. Und das ist wahrscheinlich sicherer als das Schreiben eines eigenen setuid-root-Programms. – sarnold

+0

Das Sicherheitsproblem, auf das ich Bezug nehme, stammt entweder von anderen Programmen, die auf dem System laufen, oder von Plugin-Code, der Umgebungsvariablen ändern kann. Aber wenn man sieht, wie die andere Lösung nicht funktioniert, werde ich wahrscheinlich damit anfangen und die Variable selbst beim Programmstart zwischenspeichern (also hoffentlich wird sie vorher niemand modifizieren). – chacham15

3

Eine Linux-spezifische audit_getloginuid()-Funktion, die vom Überwachungssystem bereitgestellt wird, kann möglicherweise helfen; Da pam_loginuid(8) nur für die "Haupt" -Dämonen (sshd, login, gdm usw.) installiert wird, bleibt die Audit-UID unverändert, wenn sudo(8) ausgeführt wird.

Dies erfordert eine kleine Konfiguration; hinzufügen:

session required  pam_loginuid.so 

zur /etc/pam.d/sshd Datei - und welcher auch immer andere Dienste, die Sie Ihre Benutzer erlauben, zu verwenden.

Stellen Sie sicher, dass pam_loginuid.so nicht in der Konfigurationsdatei /etc/pam.d/sudo geladen ist.

+0

großartige Idee, aber es funktioniert nicht: 'audit_getloginuid()' gibt -1 zurück. – chacham15

+0

Ah, alberne mich, vorausgesetzt, es war bereits konfiguriert; Bei meinem Ubuntu 11.04 ist 'pam_loginuid' standardmäßig nicht geladen. Ich habe meinen Beitrag so bearbeitet, dass er eine Zeile enthält, in der das 'pam_loginuid'-Modul für' sshd' geladen werden kann - wenn Sie möchten, dass es für GUI, Konsole oder anderswo funktioniert, müssen Sie das PAM-Modul in den entsprechenden Diensten laden. – sarnold

2

Sie haben zwei gute Wahl ...

  1. sudo Vertrauen und seine gerade Umgebung verwenden
  2. Sie Ihr Programm setuid-on-Ausführung und dann geteuid, et al, wird gut funktionieren

Update:

The setuid bit ist ein Zugriffsrecht-Flag im Dateimodus, der bewirkt, dass ein Programm mit den Fähigkeiten des Eigentümers der ausführbaren Datei ausgeführt wird. So kann sudo (1) Dinge als root ausführen ... das sudo-Programm selbst hat diesen Modus.

$ ls -l /usr/bin/sudo 
-r-s--x--x 1 root wheel 272384 Jun 22 2009 /usr/bin/sudo* 

Um ein Programm setuid root machen eine Macht:

$ chown root a.out 
$ chmod +s a.out 

Unnötig zu sagen, sorgfältig setuid root Programme geschrieben werden sollen. Sie können auf einen weniger privilegierten Benutzer zugreifen, wenn Sie nur auf ein geschütztes Verzeichnis oder eine geschützte Datei zugreifen müssen.

+0

'setuid-on-execution' kannst du das erklären? – chacham15

+0

Ok, siehe Update ... – DigitalRoss