PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ssh user erstellen, der nur zugriff über sftp bekommt



comgang
10.11.15, 21:29
Hallo,
Ich habe ein php-script, welches mir einen neu-registrierten Benutzer anlegen soll, bzw. die notwendigen Befehle in eine .sh Datei schreibt, die in regelmäßigen Abständen mit root-rechten ausgeführt wird.
Dieses script soll einen user anlegen, der ein Passwort bekommt, aber trotzdem keinen Shell-Zugriff bekommt.
Das funktioniert auch soweit, dass er mir sagt, dass das Passwort falsch wäre, trotzdem sind danach Prozesse vorhanden, die von diesem Benutzer ausgehen, was ziemlich nervig ist, wenn man z.B. einen user löschen will oder wenn man irgendwann unmengen an Prozessen von irgendwelchen usern hat.
Der Befehl mit dem ich im moment einen Benutzer anlege ist folgender:

echo -e "$pw\n$pw\n" | adduser --gecos "" --home /home/ftp/$user --no-create-home --ingroup ftp $user
Der Ordner wird schon vorher angelegt.

Damit kommen wir zum nächsten Problem.
Der Benutzer wird erst hinzugefügt, wenn er bestätigt wurde.
Das heißt, dass Passwort ist in diesem Fall nicht mehr als Klartext vorhanden.
Natürlich könnte man den Benutzer nach der bestätigung beim ersten Einloggen anlegen lassen, wo das Passwort wieder im Klartext vorhanden ist, aber die Elegante Lösung ist das denke ich nicht.

Gibt es eine Möglichkeit einen Benutzer anzulegen und das Passwort direkt als BCrypt und zugehörigem Salt zu übergeben?

nopes
10.11.15, 21:45
ei ei, klingt nicht gut - http://stackoverflow.com/questions/14985780/create-linux-user-using-php

comgang
10.11.15, 22:04
Ich soll also auf ftp mit mysql umstellen?
Hab ich schon einmal gemacht, mit dem Ergebnis, dass man die Berechtigungen für die einzelnen Benutzer nicht wirklich einstellen kann.
Man kann zwar sagen, dass sie in ihrem eigenen Verzeichnis bleiben, aber bei komplizierteren Ordnerstrukturen hilft einem das leider nicht weiter.
Also bin ich zu dem Schluss gekommen, dass ich es mit hinzufügen von usern mache, um die Berechtigungen richtig einstellen zu können.
Zudem ja nur Administratoren Zugriff auf das Script haben, also kein User irgendwie die möglichkeit hat, einen Befehl auszuführen.

P.S.: Achja, ich benutze das interne sftp vom ssh-server.

nopes
10.11.15, 22:14
weiss ich nicht genau, aber Scripte mit PHP erzeugen, die dann mit root Rechten laufen, klingt nicht gut - vielleicht erzählst du einfach mal deine Vision...

Davon ab, warum merkst du dir das Passwort nicht bis zur Bestätigung? - mit ram oder mysql oder so ;)

[edit]vielleicht hilft ja auch das: http://serverfault.com/questions/354615/allow-sftp-but-disallow-ssh

comgang
10.11.15, 23:00
Ja, das hat schonmal geholfen, vielen Dank.
Ich dachte, wenn ich die shell auf /bin/false setze, dass sich der user dann auch nicht mehr bei sftp einloggen kann, funktioniert aber.

Jetzt zu dem Problem mit dem Passwort.
Also die einzige möglichkeit, wäre das Schreiben in eine Datei oder mysql.
(oder kann mir jemand verraten, wie ich es im ram speichern kann?)
Aber ich weis nicht, ob die Idee so gut ist das Passwort im klartext zu Speichern, dann könnte man das mit der Verschlüsselung ja gleich bleiben lassen.
Also nochmal etwas genauer:
Beim erstellen eines Benutzers, wozu jeder in der Lage ist, wird der Benutzername und das Verschlüsselte Passwort mit dem dazugehörigen Salt in der Mysql-Datenbank gespeichert (mit einer groben überprüfung, dass es kein Vollkommener Schwachsinn ist :D ).
Der somit erstellte Benutzer hat bis zur Prüfung durch einen Admin so gut wie keine Rechte.
Jetzt bekommt der Administrator die unbestätigten Benutzer angezeigt und kann diese bestätigen.
Dadurch wird ein PHP-Script ausgeführt, welches Werte in der Datenbank ändert, für die Berechtigungen auf der Website und welches den Benutzer anlegen soll (Das Script ist über htaccess und über eine Prüfung per PHP geschützt).
Dazu werden die Befehle, die dazu nötig sind in eine Datei geschrieben (wieder mit htaccess geschützt und nur von root ausführbar), die dann alle 10 Minuten mit root-Berechtigung ausgeführt und gelöscht wird.

Jetzt ist das Problem aber, dass das Passwort nur in verschlüsselter Form vorliegt (BCrypt), da das Speichern in klartext wenig Sinn macht.
Jetzt gibt es die Möglichkeit, dass erst beim nächsten Login des bestätigten Benutzers (wo das Passwort als PHP-Variable vorliegt) die Befehle in die Datei geschrieben werden, wodurch allerdings die Sicherheit verloren geht, da öffentlich Zugängliches Script.
Oder die Möglichkeit einen Benutzer anzulegen und das Passwort als BCrypt-Schlüssel anzugeben.
Die Zweite möglichkeit wäre natürlich die Sicherste.
Ich habe mal gelesen, dass man mit adduser -p das Passwort in verschlüsselter Form angeben kann, aber ich finde den Beitrag nicht mehr und es steht auch nicht in der Hilfe von adduser. Zudem finde ich auch nirgendwo einen Hinweis darauf, welche Verschlüsselung bei diesem Passwort benutzt wird.
Wenn ich es ausprobiere mit -p bekomme ich nur die Hilfe von adduser ausgegeben.

p.S.: Ich benutze Ubuntu-Server 15.10

Gruß Alex.

comgang
10.11.15, 23:18
Ich habe gerade herausgefunden, dass die funktion -p bei useradd funktioniert und nicht bei adduser (ich wusste gar nicht, dass es da unterschiede gibt).
Allerdings ist die verschlüsselung nicht BCrypt, sondern eine ander crypt funktion, die man sich z.B. mit

openssl passwd -crypt passwort
ausgeben lassen kann.
Kann mir jemand sagen, wie sicher es ist, wenn ich diese Verschlüsselung für meine Website benutze, da es die selbe crypt funktion auch bei php gibt?
Oder gibt es eine Möglichkeit die Verschlüsselung umzuwandeln?
Oder kann man das Linux usersystem auf BCrypt umstellen?

Gruß Alex

nopes
11.11.15, 00:28
...
(oder kann mir jemand verraten, wie ich es im ram speichern kann?)
...

Ganz simpel - Ramdrive

[edit]Klartext selber sicher zu verschlüsseln und entschlüsseln, verbietet dir keiner ;)

BetterWorld
11.11.15, 01:57
Setze einfach in /etc/passwd die Shell des Users auf /usr/lib/sftp-server
Und füge den sftp-server als Shell in /etc/shells hinzu.
Loginquark erledigt.
(Das war Debian, ggf anpassen)

Für das Spasswort würde ich eine Datei voll Einmalpasswörtern erzeugen, wovon du den Usern eines vorgibst, wenn sie sich neu anmelden wollen. Der Admin kann nach/bei Freigabe dann das Wunschspasswort eintragen.
Das wäre wesentlich sicherer, als dein Procedere.