kostenloser Webspace werbefrei: lima-city


PHP - Neuen Benutzer auf Debian System anlegen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Hallo,

    ich stehe derzeit vor einem kleinen Problem.
    Wir programmieren einen E-Mail Client, der Mails über einen Postfix-Server auf einem Debian System anzeigen soll.
    Zusätzlich soll es einen Admin-Bereich in diesem Client geben, über den man neue Benutzer für den Mail-Server anlegen, verwalten und auch wieder löschen kann.

    Nun ist es aber so, dass zum Anlegen eines neuen Benutzers auf dem Server natürlich root-Rechte erforderlich sind.

    Der Befehl....
    $usr = $_POST['username'];
    $pwd = $_POST['password'];
    
    shell_exec("useradd ".$usr." -s /bin/false -p ".crypt("'".$pwd."'").";");

    ....funktioniert daher nicht, weill "www-data" natürlich keine Admin-Rechte besitzt.

    Nun wurde mir vorgeschlagen, www-data für diesen Zweck einfach Admin-Rechte zu geben....ich halte das aber für eine Sicherheitslücke.
    Aber gibt es denn eine andere Möglichkeit?

    Mir wurde auch geraten, das Root-Passwort in einer Datei am System zu hinterlegen und dann darüber den Befehl auszuführen....das hat aber irgendwie nicht geklappt....bekam ständig die Meldung: "Command needs to be executed from shell"....


    Wie würdet ihr das am besten Lösen?
    Danke schon mal.

    Beitrag zuletzt geändert: 13.1.2013 19:11:52 von adelwoehrer
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Mehrere unterschiedlich unsichere Möglichkeiten:
    1) SSH-Login von PHP aus als "root" → user anlegen
    2) C-Programm schreiben, das als Parameter den Usernamen nimmt, dem Benutzer root geben und mit
    chomd u+s
    immer als root laufen lassen, aus PHP heraus ganz normal aufrufen.
    3) …
  4. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    SSH-Login von PHP aus als "root" → user anlegen

    Wie würde ich das machen?

    <?php
    $connection = ssh2_connect('shell.example.com', 22);
    ssh2_auth_password($connection, 'username', 'password');
    
    $stream = ssh2_shell($connection, 'vt102', null, 80, 24, SSH2_TERM_UNIT_CHARS);
    ?>


    Mal schnell über google gefunden....würde das funktionieren?
    Entschuldige, dass ich extra frage....aber ich hab im Moment leider nicht die Möglichkeit, es zu testen. :smile:

    Beitrag zuletzt geändert: 13.1.2013 19:28:07 von adelwoehrer
  5. Du musst dir im klaren sein das was du vor hast, i9n jedem Falle ein Risiko ist.

    Mir fallen noch folgende Ideen ein:

    a) Versuche die Rechte via ACL hinzubiegen, wenn der Server aber sonst keine ACLs verwendet kann das die zukünftige Administration erschweren

    b) du könntest die Rechte des Programms zum anlegen von Nutzern so ändern das www-data dieses Kommando ausführen darf, das ist natürlich potentiell gefährlich

    c) du könntest deine Benutzerverwaltung auf ein Datenbanksystem umbauen und den Benutzer in der Datenbank anlegen

    d) Du könntest die Angaben zum anzulegenden Benutzer in einer Datei hinterlegen und zyklisch ein Script auf dem Server mit root rechten laufen lassen das sich die Daten aus der Datei nimmt und die Nutzer dann anlegt, dann funktioniert das ganze aber nicht sofort sondern eben erst beim nächsten durchlauf des Scripts (was sich aber triggern lassen würde).
  6. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Du könntest die Angaben zum anzulegenden Benutzer in einer Datei hinterlegen und zyklisch ein Script auf dem Server mit root rechten laufen lassen das sich die Daten aus der Datei nimmt und die Nutzer dann anlegt, dann funktioniert das ganze aber nicht sofort sondern eben erst beim nächsten durchlauf des Scripts (was sich aber triggern lassen würde).

    Die Idee hatte ich bereits, hab sie dann aber eben wegen der verspäteten Ausführung der Kommandos wieder verworfen.
    Wie könnte ich denn die Ausführung über PHP triggern?
    Und würde das Triggern ohne Root Rechte funktionieren?
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Was spricht gegen
    setuid(0);
    und
    chown root:root programm; chmod u+s programm
    ?

    Damit würdest du ein einzelnes Programm (kein Scritp!) als root laufen lassen können, das deinen Benutzer anlegen kann… vor allem sparst du dir ein zyklisch als root laufendes Script, musst nichts triggern und auch kein Passwort wie bei SSH zugänglich haben.
  8. Am einfachsten kannst du über einen Eintrag in einem Controlfile triggern...das Script zum User anlegen wird in sehr schneller Folge aufgerufen oder läuft ständig und aktualisiert den Inhalt der Control Datei wenn es etwas zu tun gibt holt es die Daten der anzulegenden User aus dem Daten File und legt die Nutzer an zund setzt am schluss das control file wieder zurück, du wartest im PHP drauf das das Control, File wieder zurückgesetzt wurde und erlaubst erst dann weitere Aktionen. Etwas gefährlich ist das ganze wenn du zur selben Zeit von mehreren Ausfertigungen der Admin Oberfläche versuchst einen Nutzer anzulegen, aber man kann den Zugriff auf die entsprechenden Dateien ja sperren während man sie bearbeitet sodass ein "2. Admin" erst einen Nutzer anlegen kann wenn es gerade kein anderer tut.
  9. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Was spricht gegen
    setuid(0);
    und
    chown root:root programm; chmod u+s programm
    ?


    Ich fürchte einfach, ich kann dir da nicht ganz folgen.
    Habe bisher immer nur mit Scripts auf Linux Systemen gearbeitet.
    Wie genau würde dieses Programm aussehen?
    Was wird dann über PHP übergeben?
    Wie führe ich darüber dann im Endeffekt den useradd Befehl aus?

    Ich downloade grade mal die Virtual Box samt Debian Image, damit ich mal die Vorschläge testen kann.

    Beitrag zuletzt geändert: 13.1.2013 20:19:57 von adelwoehrer
  10. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    adelwoehrer schrieb:
    Wie genau würde dieses Programm aussehen?
    Was wird dann über PHP übergeben?
    Wie führe ich darüber dann im Endeffekt den useradd Befehl aus?
    Ein Beispiel, wie es aussehen könnte, allerdings ist das sehr unsicher. Du müsstest die Übergabe des Parameters (Benutzername) so schaffen, dass kein anderes Kommando ausgeführt werden kann, also soetwas wie |code=inline]useradd bla; evil-command[/code] darf nicht möglich sein. Aber daran darfst du spielen ;-)

    mkuser.c:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char** argv) {
    	char buffer[1024];
    	if(argc < 3) // argv[1] = username, argv[2] = password
    		return 1;
    	setuid(0);
    	// ab hier bin ich root
    	// aber Achtung: wenn argv[2] = 'bla; evil-cmd',
    	// dann wird 'evil-cmd' als root ausgeführt!
    	// argv[1] und argv[2] dürfen also nur Buchstaben und Zahlen
    	// enthalten!
    	sprintf(buffer, "useradd %s -s /bin/false -p %s", argv[1], argv[2]);
    	system(buffer);
    }
    Das übersetzt du mit
    gcc -o mkuser mkuser.c
    Die entstandene Datei |code=inline]mkuser[/code] muss dem Benutzer
    root
    gehören. Als nächste musst du das suid-Bit setzen:
    chmod u+s mkuser
    Wenn du nun
    ls -l mkuser
    ausführst sollte es ungefähr so aussehen:
    -rwsr-xr-x 1 root root 47808 Jan 13 20:25 mkuser


    In PHP nutzt du das nun so:
    <?php
    $usr = escapeshellarg($_POST['username']);
    $pwd = crypt($_POST['password']);
    shell_exec("mkuser $usr $pwd;");


    Beitrag zuletzt geändert: 13.1.2013 20:31:26 von hackyourlife
  11. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Habe jetzt mal debian fertig installiert, apache und php drauf gepackt und die C-Datei kompiliert.
    Besitzer ist root, suid ist gesetzt.

    In PHP hab ich mal der Einfachheit halber keine Variablen verwendet, sondern das Kommando direkt ausgeführt.

    test.php
    <?php
    shell_exec("mkuser testbenutzer testpasswort;");
    ?>


    Wenn ich jetzt als root über den Befehl "php5 test.php" das Script ausführe, wird der Benutzer angelegt.
    Wenn ich nun aber auf einen Benutzer ohne Admin-Rechte am System wechsle, und das selbe mache, schreibt er mir die Meldung: "sh: useradd: not found"

    Woran liegt das?
  12. weil usradd vermutlich in /sbin liegt, mach mal nen link in /bin
  13. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Liegt in "/usr/sbin/", ja.
    Hab den Link mal im C-Program vollständig eingefügt (/usr/sbin/useradd).
    Nun findet er den useradd-Befehl, schreibt mir aber eine andere Fehlermeldung: "useradd: /etc/passwd konnte nicht gesperrt werden, versuchen Sie es später noch einmal."

    Ist das jetzt ein Rechteproblem?


    EDIT:
    War meine Schuld.....nachdem ich useradd direkt verlinkt hab, hatte ich vergessen, nach dem neuen Kompilieren die suid wieder zu setzen.
    Es funktioniert Alles....danke. :-)

    Beitrag zuletzt geändert: 14.1.2013 9:29:03 von adelwoehrer
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!