CPAN: Befehl asuführen

Beitrag lesen

my $test = /usr/bin/chsh -s /bin/false benutzer;``
Die Shell des Benutzers wird jedoch nicht geändert.
Was mache ich falsch?

Wenn Suid gesetzt ist, wird Perl mit Taint-Checks ausgeführt - ein Merkmal von Perl, welches sicheres Programmieren unterstützt. Das Programm muss speziell dafür geschrieben/angepasst werden. Leider hast du überhaupt keine Fehlerbehandlung eingebaut und auch die Meldungen im Webserverlog ignoriert, das hätte schon deutliche Hinweise auf die Problematik gegeben.

Sollte/Muss ich noch auf etwas anderes achten?

Suid ist ein Hack. Der C-Wrapper verschiebt das Problem auf eine höhere Abstraktionsebene, ist also ein Hack auf einem Hack. Es entspricht nicht der guten Praxis, die Komplexität zu erhöhen, wenn es um sicherheitsrelevante Programme geht.

Die korrekte Lösung benutzt Entkopplung vom Web, somit wird auch das Thema Suid/Taint am Webserver hinfällig. Statt einem Programm, das alles macht, spalte die Funktionalität auf, so dass jede Komponente genau eine Sache macht:

1. Ein Webprogramm, das Anfragen zur Shell-Änderung entgegennimmt und in eine Warteschlange einreiht.
2. Die Jobwarteschlange. Dies kann auch einfacherweise eine dumme Datei sein, wenn du korrektes Locking beherrschst.
3. Ein Systemprogramm, das aus der Warteschlange liest und die Shell-Änderung ausführt. Dieses kann dann mit normalen Root-Rechten laufen, wahlweise als Daemon oder regelmäßig (Cron).

Garniere mit Fehlerbehandlung und Logging. Es gibt für alles Module.