it-swarm.com.de

Wie kann ich sicher zulassen, dass eine PHP-basierte Website einen Linux-Benutzer erstellt und mit der Umgebung interagiert?

Mein Unternehmen verfügt über einen Webhosting-Service, für den sich Nutzer anmelden. Nachdem der Anmeldevorgang abgeschlossen ist, werden wir manuell eingreifen und eine Test-/Entwicklungsumgebung für diesen Client erstellen. Im Allgemeinen läuft der Prozess folgendermaßen ab:

  1. erstellen Sie einen Linux-Benutzer und wechseln Sie zu diesem Benutzer
  2. führen Sie Skripts aus, um eine Gruppe von Dateien und Verzeichnissen mit Vorlagen in ihrem Ausgangsverzeichnis zu installieren
  3. erstellen Sie eine Apache .conf-Datei
  4. starte Apache neu
  5. Senden Sie eine E-Mail, um mitzuteilen, dass der Server eingerichtet und für den Zugriff bereit ist
  6. Schließlich kann der Client auf ihre Site als somerandomstring.devserver.com zugreifen.

Obwohl wir dazu Skripte verwenden, ist es laut Volume unpraktisch, sich manuell anzumelden und diese auszuführen. Daher möchten wir diesen Prozess automatisieren, der unmittelbar nach Abschluss des Client-Anmeldevorgangs ausgelöst wird.

Ich habe mir ein paar Möglichkeiten ausgedacht, um damit umzugehen.

1) Geben Sie einem Benutzer die Fähigkeit adduser und verwenden Sie die Funktion PHP exec(), um diesen Benutzer zu erstellen. Ich müsste diese Fähigkeit allerdings www-data geben, oder? Wenn PHP im abgesicherten Modus ausgeführt wird, sind Befehle für exec () auf ein bestimmtes Verzeichnis beschränkt. Wenn ich also/usr/sbin/adduser nach/my/custom/dir kopieren würde, wo nur dieser Befehl verfügbar ist, welche Sicherheitsbedenken bestünden dann noch? Ich bin jedoch immer noch ratlos, wie ich den für Websites verfügbaren Ordner mit der neuen Website aktualisieren würde, da diese im Besitz von root sind.

2) Lassen Sie cron es tun: Eine Person muss sich für den Service anmelden, damit standardmäßig ein Benutzername und andere Kundendaten in mysql gespeichert sind. Lassen Sie cron von einem Konto mit den Funktionen adduser ein Routineskript ausführen, das nach neuen Konten sucht (möglicherweise alle 30 bis 60 Sekunden). Wenn gefunden, erstelle ein Linux-Konto für sie, fülle die Home-Verzeichnisse auf, schreibe die Apache conf virtualhost-Datei und lade Apache neu.

Option 2 scheint der sicherste Weg zu sein, dass ein isoliertes Administratorkonto dies erledigt, ohne dass WWW-Daten oder die Website Systemskripte und -programme ausführen müssen. Das Problem ist die Charge. Am liebsten würde ich eine Lösung für Option 1 finden, damit ein Client sofort angemeldet wird und auf seine installierte und einsatzbereite Serverinstanz umgeleitet wird. Ich mag es auch nicht, dass ich Apache so oft neu laden/neu starten muss.

Unternehmen tun dies jeden Tag, insbesondere Webhosting-Unternehmen. Bluehost zum Beispiel hat nach Abschluss des Anmeldevorgangs sofort Zugriff auf/home/user/public_html, mit dem Sie interagieren können. Da es kommerzielle Lösungen gibt, bin ich sicher, dass viel darüber nachgedacht wurde, wie dies sicher und sicher erreicht werden kann. Was ich versuche zu erreichen, ist identisch, nur in einem viel kleineren Maßstab.

5
user658182

WARNING


Dies ist ein inhärentes Sicherheitsrisiko und kann jederzeit viel nach Süden gehen. Ich würde dringend davon abraten, aber na ja.

Ich bin nicht verantwortlich für irgendetwas, das passiert, wenn Sie irgendetwas in diesem Beitrag befolgen. Ich rate Ihnen auch nicht, diesem System zu folgen. Dies dient hauptsächlich zu Bildungs-/Forschungszwecken.

Linux hat etwas, das als setuid bekannt ist und das es jedem gegebenen Programm (wie Sudo) ermöglicht, mit höheren Rechten als dem aktuell ausführenden Benutzer ausgeführt zu werden. Sie können ein Shell-Skript schreiben, um alles zu tun, was Sie brauchen.

Da Shell-Skripte nicht setuid sein können, müssen Sie sie von dort aus in eine Binärdatei konvertieren. Sie können dafür so etwas wie shc verwenden.

Sobald Sie Ihre Shell-Pseudobinärdatei (Beispielname: bootstrap_user) haben, die alles enthält, was Sie benötigen, können Sie einige unterhaltsame Änderungen vornehmen, um sie fertig zu machen. Das heißt:

  1. Setzen Sie es auf root und gruppieren Sie www-data.

    chown root:www-data ./bootstrap_user
    
  2. Weisen Sie RWX-Berechtigungen für den Eigentümer (root) zu, lesen und führen Sie sie für die Gruppe aus, keine für andere:

    chmod 750 ./bootstrap_user
    
  3. Verschieben Sie die Binärdatei an einen Ort, an dem PHP exec() ausgeführt werden kann.

  4. Fügen Sie schließlich das setuid-Bit hinzu, damit es als root ausgeführt wird:

    chmod u+s ./bootstrap_user
    

In PHP können Sie jetzt bootstrap_user als Ihre ausführbare Datei aufrufen und alle erforderlichen Parameter übergeben. Achten Sie darauf, dass Sie nicht eindringen und die Eingabe desinfizieren.

2
Kaz Wolfe

Ich denke, ich wäre vorsichtig mit allem, was einem Browser-Benutzer die Möglichkeit gibt, einen Unix-Benutzer automatisch zu generieren. Wenn Sie dies getan haben, sollte es wahrscheinlich sowohl einen Warteschlangenmechanismus als auch ein Protokoll oder eine Datenbank enthalten, damit Folgendes nicht auftritt:

  1. Der Benutzer drückt die Taste, um dies zu ermöglichen
  2. Ihr Prozess beginnt
  3. Der Benutzer drückt F5 oder klickt auf die Schaltfläche zum erneuten Laden
  4. Der Benutzer drückt später die Rücktaste, um eine Seite in seinem Verlauf zu sichern
  5. Der Benutzer erstellt ein Lesezeichen auf dieser Seite und besucht es mehrmals

Was passiert also, wenn der Benutzer etwas neu initiiert, was entweder getan wurde oder noch geschieht?

1
Justin Case