Benutzer ändern
-
Hallo,
ich versuche gerade eine kleines CGI-Progrämmchen zu schreiben, das Benutzerspezifische Dateien ändern muß. Hierzu lasse ich mir den Benutzernamen und das Kennwort geben. Nun soll der Prozess unter der angegebenen Benutzerkennung (mit dessen Rechten etc.) weiterlaufen.
In meinen Handbüchern und im Netz habe ich nur setuid gefunden. Das funktioniert aber nur als Superuser so wie ich es will und das würde ich gerne vermeiden. Gibt es noch eine andere Lösung?
Vielen Dank schon mal für das Lesen dieser Frage, das Nachdenken darüber und/oder natürlich auch für eine Antwort.
mfg Martin
-
mgaeckler schrieb:
ich versuche gerade eine kleines CGI-Progrämmchen zu schreiben, das Benutzerspezifische Dateien ändern muß. Hierzu lasse ich mir den Benutzernamen und das Kennwort geben. Nun soll der Prozess unter der angegebenen Benutzerkennung (mit dessen Rechten etc.) weiterlaufen.
Ein Programm, das nach einem User-Passwort fragt, ist überhaupt keine gute Idee. Das sollte man unter Linux nie machen, weil das Sicherheitslücken aufreißt.
Normalerweise nimmt man dafür man: su(1) oder man: sudo(8). Diese Befehle fragen dann selbst nach dem Passwort. Das ist viel sicherer, denn dann hat dein Programm zu keiner Zeit das Passwort im Speicher.
Falls dich interessiert, wie das funktioniert: Diese Programme können intern mit der Funktion setuid() arbeiten, weil sowohl su als auch sudo setuid root besitzen:
% ls -l $(which su sudo) -rwsr-xr-x 1 root root 36864 2010-01-26 18:09 /bin/su* -rwsr-xr-x 2 root root 148024 2010-06-18 23:07 /usr/bin/sudo*
Das Flag "s" bei den Rechten steht für "setuid", d.h. diese Programme laufen automatisch unter dem root-Nutzer und können deswegen die Funktion setuid() benutzen.
-
Christoph schrieb:
Ein Programm, das nach einem User-Passwort fragt, ist überhaupt keine gute Idee. Das sollte man unter Linux nie machen, weil das Sicherheitslücken aufreißt.
Ich bin bei Dir, wenn es ein CLI-Progrämmchen (Command Line Interface) wäre. Es ist aber ein CGI-Progrämmchen (Common Gateway Interface). Das Programm wird also mit der Benutzerkennung vom Webserver aufgerufen und es gibt kein Terminalfenster für den Benutzer, in dem ich su oder was auch immer starten kann.
Trotzdem danke für Deine Gedanken.
mfg Martin
-
Klingt trotzdem nach einer sehr schlechten Idee. Beschreib mal ein bisschen genauer, was Du tun möchtest, es gibt bestimmt eine schönere und sicherere Lösung.
-
nman schrieb:
Klingt trotzdem nach einer sehr schlechten Idee. Beschreib mal ein bisschen genauer, was Du tun möchtest, es gibt bestimmt eine schönere und sicherere Lösung.
Ziel ist es, eine Weboberfläche zu erstellen, mit der Benutzer im LAN verschiedene Steuerdateien (ohne deren Syntax kennen zu müssen) für das Mailsystem (wie z.B. .procmail, .forward etc.) ändern können. Also z.B. den Abwesenheitsassisten einrichten, automatische Verteilung der Mails in Ordnern etc. Derzeit editiere ich diese Dateien mit vi. Andere Benutzer des LANs können das aber nicht.
Meine Idee ist nun, ein CGI-Programm zu schreiben, das diese Dateien entsprechend modifiziert. Natürlich soll jeder Benutzer nur seine eigenen Einstellungen ändern können.
Grundsätzlich wäre es natürlich möglich, die Authentifizierung von Apache vornehmen zu lassen. Der Webserver schreibt dann im Environment des CGI-Programmes den Benutzernamen.
Aber ich habe keinen Weg gefunden, wie ich Apache beibringen kann, das Betriebssystem zu fragen, ob der Benutzer bekannt ist und dessen Passwort stimmt. Eine eigene Benutzerdatenbank für die Sache will ich schon alleine aus dem Grund nicht benutzen, weil es dann nicht so leicht möglich ist, das Kennwort zu ändern.
Und selbst, wenn das mit Appache funktionieren würde, dann müsste mein Programm auf jedem Fall mit setuid-bit versehen werden.
Inakzeptabel ist auch eine Lösung, daß ein Windowsprogramm via SMBFS die Dateien ändert, da es auch von Linux selber und auch MAC OS X funktionieren soll. Mit Java will ich diese Anwendung auch nicht implementieren, da das Starten von Javaanwendungen bei mir zu lange dauert. Ganz abgesehen davon, daß es keinen standardisierten Pfad zu den Dateien gibt, der bei allen Clients identisch ist.
mfg Martin
-
Waere es eine Option die Aenderungen in eine Datei / Datenbank zu schreiben und diese dann via Cronjob zu synchronisieren? Ein Daemon-Prozess, welcher die Synchronisierung uebernimmt, waere natuerlich auch moeglich, so dass dann keine Latenzen entstehen und die Aenderungen umgehend nach Erzeugung der Datei uebernommen werden.
-
Gimbli schrieb:
Waere es eine Option die Aenderungen in eine Datei / Datenbank zu schreiben und diese dann via Cronjob zu synchronisieren? Ein Daemon-Prozess, welcher die Synchronisierung uebernimmt, waere natuerlich auch moeglich, so dass dann keine Latenzen entstehen und die Aenderungen umgehend nach Erzeugung der Datei uebernommen werden.
Hallo Gimbli,
wo soll darin der Sicherheitsgewinn liegen? Die Kritik an meiner Lösung ist, daß das Linuxpassword des Benutzers zumindest für kurze Zeit im Speicher meiner Anwendung vorliegen muß und durch eine Sicherheitslücke von einem Angreifer abgegriffen werden könnte. Samba umgeht das Problem, indem es ein eigenes Kennwort verwendet, das nicht identisch mit dem Linuxpasswort sein muß. So etwas könnte ich natürlich auch machen. Dort besteht aber immer noch das Problem, daß SAMBA mit Superuserrechten arbeiten muß, um den Benutzer zu wechseln. Im übrigen könnte auch bei SAMBA ein Angreifer zumindest das SMB-Kennwort abgreifen und somit Zugriff auf das System erlangen. Zwar nur über das SMB Protokoll aber immerhin.
Scheinbar gibt es keinen Systemcall, den ich benutzen kann. Ich werde es also so machen, daß
- die Anwendung läuft mit Superuserrechten 8-(
- Wenn der Benutzer den Namen und das Kennwort schickt, wird dieses verschlüsselt und mit /etc/passwd verglichen.
- Im Cookie wird nur das verschlüsselte Passwort gespeichert.
- Vor dem Zugriff auf die Benutzerdateien, wird mit setuid der effektive Benutzer gewechselt.
Vorerst habe ich nicht vor, daß Programm zu veröffentlichen, wenn doch, kann ich es aber immer noch so machen wie SAMBA und zusätzlich eine weitere Authentifizierungsmethode implementieren. Dann brauche ich aber noch Funktionen für die Benutzer, das Kennwort zu ändern.
Wenn jemand noch andere evt. bessere Ideen hat, nur her damit.
Auif jeden Fall mal Danke an alle, die sich Gedanken um dieses Problem gemacht haben.
mfg Martin
-
Zur Authentifizierung kannst Du http://code.google.com/p/mod-auth-external/ oä. verwenden, das lässt Du gegen PAM fahren, dann braucht Dein Webtool schonmal keinen Zugriff auf /etc/shadow mehr.
Die .procmail .forward etc. aller User machst Du schreibbar für eine Gruppe, der Dein Tool angehört und zugleich schränkst Du den Zugriff auf Dateien mit Besitzer x noch auf den authentifizierten Benutzer x ein.
Damit hast Du schon etwas deutlich sichereres, als Deinen alten Entwurf.
-
nman schrieb:
Zur Authentifizierung kannst Du http://code.google.com/p/mod-auth-external/ oä. verwenden, das lässt Du gegen PAM fahren, dann braucht Dein Webtool schonmal keinen Zugriff auf /etc/shadow mehr.
Die .procmail .forward etc. aller User machst Du schreibbar für eine Gruppe, der Dein Tool angehört und zugleich schränkst Du den Zugriff auf Dateien mit Besitzer x noch auf den authentifizierten Benutzer x ein.
Damit hast Du schon etwas deutlich sichereres, als Deinen alten Entwurf.
Das klingt nicht schlecht. Ist zwar nicht ganz so eine simple Lösung, die ich mir gewünscht hätte, aber ein durchaus gangbarer Weg. Danke.
mfg Martin