blog.bartlweb - a technologist's external brain

vsftpd für den Zugriff auf www-Root konfigurieren

Die folgende Anleitung erläutert die Konfiguration eines FTP-Servers für den Zugriff von Benutzern ohne Shell-Login auf das Rootverzeichnis des Webservers.

Installieren Sie zunächst den FTP-Server vsftpd. Unter OpenSuse via Yast, unter Ubuntu via apt-get install vsftpd.

Benutzer anlegen und Rechte vergeben

Zunächst legen wir eine neue Benutzergruppe (im Beispiel wwwftp) an unter der all unsere FTP-Benutzer zusammengefasst werden.

groupadd wwwftp

Danach legen wir unseren ersten Benutzer ftpuser an. Diesen fügen wir unserer Gruppe wwwftp hinzu und setzen das Home-Verzeichnis auf unser Root-Verzeichnis des Webservers /var/www. Dadurch wird dem Benutzer beim einloggen via FTP sofort das Webserver-Rootverzechnis präsentiert.

useradd -g wwwftp -d /var/www ftpuser

 Danach vergeben wir für unseren gerade angelegten Benutzer noch ein Passwort.

passwd ftpuser

Zuletzt müssen wir die Dateisystemrechte für das Root-Verzeichnis noch entsprechend anpassen, damit unsere FTP-Benutzergruppe auch lesen und schreiben darf.

chown -R www-data:wwwftp /var/www
chmod -R 775 /var/www

FTP-Server konfigurieren

Die FTP-Server-Konfiguration befindet sich in der Datei /etc/vsftpd.

Die folgenden Zeilen zeigen die Änderungen die abweichend zur Standardkonfiguration vorgenommen wurden. Beachten Sie, dass sich zwischen Konfigurationsparameter, = und Wert keine Leerzeichen befinden dürfen.

Konfigurationsdatei

# Allow anonymous FTP? (Disabled by default)
anonymous_enable=NO
 
local_umask = 022
 
# Uncomment this to allow local users to log in.
local_enable=YES
# Uncomment this to enable any form of FTP write command.
write_enable=YES
# chroot_list_enable below.
chroot_local_user=YES
 
# You may fully customise the login banner string:
ftpd_banner=Welcome @home baby!
 
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
nopriv_user=www-data
 
 
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list

Userlist

Um den Zugriff zu regeln empfiehlt es sich von so gennanten Userlists gebrauch zu machen. Diese Text-Dateien enthalten eine Auflistung aller lokalen Benutzer die sich per FTP anmelden dürfen. Erstellen Sie dazu die Datei /etc/vsftpd.user_list laut obiger Konfiguration. Fügen Sie einen Benutzernamen pro Zeile ein.

FTP-Benutzern den Zugriff auf die Shell verwehren

Um den angelegten FTP-Benutzern den Zugriff auf die lokale Shell zu verwehren und damit die Sicherheit zu erhöhen, bzw. FTP-only Benutzer zu erstellen, muss ein wenig getrickst werden, da vsftpd eigentlich einen Shell-Login voraussetzt.

Zunächst müssen Sie die verwendete Shell für die einzelnen FTP-Benutzer in der Datei /etc/passwd von /bin/bash auf /bin/false ändern. Für unseren FTP-Benutzer würde der Eintrag damit in etwa wie folgt lauten:

ftpuser:x:1001:1001::/var/www:/bin/false

Danach muss noch die Sicherheitseinstellung im pam-Modul umkonfiguriert werden. Dazu kommentieren Sie die folgende Zeile in der Datei /etc/pam.d/vsftpd aus:

auth   required        pam_shells.so

Dieser Artikel hat Dir deinen Tag gerettet?

... und mühevolles Probieren, Recherchieren und damit Stunden an Zeit gespart? Oder einfach nur Dein Problem gelöst?

Dann würde ich mich freuen, wenn Du meine Zeit für die Erstellung dieses Blogartikels mit einer kleinen Anerkennung honorierst:

Zahlung mit PayPal oder Kreditkarte.

Hinweis zur Verwendung

Die Übermittlung einer Zahlung ist eine persönliche Anerkennung Ihrerseits an den Entwickler (Christian Bartl, Privatperson). Eine Zahlung ist nicht zweckgebunden und es ist keine Gegenleistung zu erwarten. Bitte beachten Sie, dass für eine übermittelte Zahlung keine Quittung ausgestellt werden kann.

Über den Autor

Christian Bartl

Christian Bartl Requirements Engineer
& Solution Architect für Online und Mobile

Als Technologie-Enthusiast und begeisterter Programmierer entwickle ich in meiner Freizeit Websites, Software und IT-Lösungen, die mir selbst und anderen den Alltag vereinfachen.

mehr auf christian.bartl.me

Kommentare

  1. Spitze! Dankeschön!

    kommentieren

  2. Habe dein How-To befolgt und erhalte ein "500 OOPS: vsftpd: refusing to run with writable root inside chroot()" wenn ich mich versuche mit Filezilla Zugriff zu erhalten.

    Gibt es eine Lösung dafür?

    kommentieren

    1. Okay, ich habe eine Lösung für das ""500 OOPS: vsftpd: refusing to run with writable root inside chroot()"-Problem gefunden:

      vsftpd verbietet es direkt in das Home-Dir eines Users (hier des Users "ftpuser") zu schreiben. Wenn das, wie hier auf "/var/www" setzen, ist das natürlich sehr ungünstig.

      Lösung:
      Zuerst ersetllt man im "/var/www"-Dir ein neues Dir, z.B. "site1" ("sudo mkdir /var/www/site1")
      Nun stellt man mit "sudo chmod -R a-w /var/www" sicher, dass das Home-Dir nicht mehr beschreibar ist. Damit verschwindet die Meldung "500 OOPS..." zwar, aber wir dürfen irgendswo reinschreiben. Das ändert man, indem wir dem Dir "site1" mit "sudo chmod -R 0775 /var/www/site1/" wieder Schreibrechte verpassen. So dürfen wir in das Home-Dir zwar nicht schreiben (wie von vsftp gewünscht), aber dafür in "site1".
      Um alles ab zu runden können wir unserem Apache noch sagen, dass er site1 als Document-Root nehmen soll und nur dessen Inhalt ausgeben soll:

      "sudo nano /etc/apache2/sites-available/default"
      "DocumentRoot /var/www" in -> "DocumentRoot /var/www/site1" ändern und
      "" in -> "" ändern
      mit Strg + O Speichern und mit Strg + X den Editor "nano" verlassen.

      Zum Schluss noch mit "sudo service apache2 restart" den Apache neustarten, anschließend läuft alles wie gewollt :)

      Btw.: Danke für dein Tutorial Christian! Auch super, dass du gleich auf die Sicherheitsaspekte eingegangen bist!

      Viele Grüße aus Frankfurt a.M.,
      Thomas

      kommentieren

      1. Zufälligerweise hatte ich sowieso ein Unterverzeichnis in /var/www als Apache2 root und musste nur noch die Rechte ändern.

        Gibt es zufälligerweise auch eine Möglichkeit, dass vsftpd sofort das subdirectory /site1 öffnet beim verbinden (und man optional zurück navigieren kann)?

        kommentieren

        1. Hallo Pete,
          serverseitig kenne ich dafür keine Lösung, aber in den meisten FTP-Clients kannst du für deine Verbindung ein Lesezeichen anlegen in dem du den Startordner, der direkt nach dem Verbindungsaufbau angezeigt wird, definieren kannst.
          lg Christian

          kommentieren

  3. Herzlichen Dank

    ohne den tip wäre ich echt endgültig verzweifelt :)

    kommentieren

    1. Schön, dass es anderen Personen auch geholfen hat.

      Sehe auch gearde, dass ich in der Zeile " "" in -> "" " etwas vergesen habe. Muss natürlich " " " in -> "" " heißen.

      kommentieren

    2. Okay, hier scheint wohl eine Funktion der Blog-Kommentarfunktion keine eckigen Klammern in Kombination mit einem Slash als Sonderzeichen zu erlauben. Dieses Mal ohne Klammern:

      Zeile " "" in -> "" " muss heißen:
      " "Directory /var/www/" in -> "Directory /var/www/site1" "

      (Die Klammern bleiben einfach unverändert in der Datei.)

      kommentieren

  4. Moin alle zusammen,
    funktioniert alles wundervoll, genau so wie ichs gerne hätte...FAST!
    Habe alles ausgeführt, wie hier beschrieben, hatte unteranderem auch das Problem mit der 500 OOPS-Meldung und habe entsprechend auch alles aus den Kommentaren nachgebaut.
    Jetzt steh ich vor folgendem Problem/Wunsch.
    Mein ftpuser schreibt in /var/www/site1 mit den Rechten "605". Das heißt ,wenn ich was uploade, kann es erstmal nicht angezeigt werden, weil "Öffentlich" keine Rechte hat.
    An sich ist es kein Problem, schnell n Paar Häckchen zu setzen, aber doch ein wenig umständlich.
    Ist es möglich, dem ftpuser "775" Rechte zu geben, ohne dass der 500 OOPS erscheint?

    LG

    Micha

    kommentieren

  5. Hallo Zusammen,

    Wenn ich aber einen FTP User einschränken möchte welcher nur auf /var/www mit unterverzeichnissen Zugreifen kann aber nicht weiter hoch. Muss ich das mit den Rechten (permission) arbeiten? Oder gibt es da einen Funktion von vsftpd? Oder wie kann ich das noch Lösen? Homeverzeichniss (Startverzeichniss) wäre in /var/www in einem Unterverzeichniss.

    Gruss
    Tim

    kommentieren

    1. Hallo Tim,

      vsftpd schickt jeden Nutzer standardmäßig in sein Home-Verzeichnis. Um diesen dort auch einzusperren muss die Konfigurationsoption chroot_local_user=YES gesetzt sein.

      lg Christian

      kommentieren

  6. Guten Tag,

    es ist zwar schon lange her ... Das dieser Beitrag im diesem Blog erstellt wurde, aber man trifft immer wieder auf dieses Problem! Nachdem ich heute diesen Beitrag im Internet gefunden habe, ist es mir endlich gelungen meinen Homeserver vollständig einzurichten. Mein Problem war nämlich immer, dass irgendein Nutzer (entweder www-data oder ftpuser) ausgesperrt wurde, also irgendeiner hatte immer keine Schreib- oder Leserechte. Ich danke dem Bloginhaber dafür, dass dieser Beitrag damals in diesem Blog endstanden ist!

    Mit freundlichen Grüßen
    Dennis Blaschke

    kommentieren

  7. Vielen Dank,
    mit dieser Anleitung habe ich endlich einen funktionstüchtigen Webserver für meine Entwicklungen mit Typo3 erstellen können.

    Gruß
    Werner

    kommentieren

  8. Guten Tag,

    Da ich ein FTP-Server laufen lassen will, kam ich auf dieser Seite und habe somit die obigen Anweisungen erfüllt (Alle Befehle haben nur mit dem Befehl sudo funktioniert).
    Jedoch habe ich folgendes Problem:

    Zur Überprüfung habe ich versucht im Dateimanager in der Pfadleiste "ftp://127.0.0.1:21" einzugeben und dann fragte er mich nach dem Benutzernamen und dessen Passwort. Zur Überprüfung habe ich den Benutzer test mit dem Passwort test erstellt.
    Jedoch akzeptiert er diese Anmeldedaten nicht.

    Und zum anderen möchte ich wissen, ob es normal ist bei "passwd ftpuser' nach UNIX-Passwort zu fragen.

    kommentieren

    1. Hallo Julien,

      die Anleitung ist schon einige Jahre alt und ich nutze aktuell nur mehr SSH-Verbindungen (sftp) für die Dateiübertragung, deshalb kann ich dir ohne mich selbst noch einmal einzuarbeiten nicht wirklich weiterhelfen. Erste Anlaufstelle bei Problemen ist immer die Logdatei des jeweiligen Programms. In diesem Fall solltes du Fehlermeldungen und Informationen in der Datei /var/log/vsftpd.log finden. Dort müsste dann auch der Grund stehen, warum die Anmeldung fehl schlägt.

      Der Befehl passwd fragt nach dem Unix-Passwort, weil vsftpd zur Authentifizierung lokale Unix-Konten nutzt und du daher ein Passwort für ein Benutzerkonto setzt.

      lg Christian

      kommentieren

  9. Ey das hat mir richtig geholfen Bro

    kommentieren

  10. Mit FileZilla kein Login für ftpuser möglich. Warum ?
    Login Daten falsch

    kommentieren

  11. Wow danke!
    Das erste Tutorial welches mir vernünftig erklärt hat wie man einen FTP Nutzer für einen Apache Server einrichtet.

    kommentieren

Kommentar schreiben

Der hier angegebene Name wird gemeinsam mit deinem Kommentar auf der Website veröffentlicht.

Deine E-Mail-Adresse wird zur einmaligen Benachrichtigung bei Veröffentlichung des Kommentars genutzt.

Benachrichtigung per E-Mail über Antworten auf meinen Kommentar erhalten.

Bitte tippe die Zahlenkombination "1190" ein, nur dann kann ich deinen Kommentar entgegennehmen.

Bitte fülle dieses Feld nicht aus, nur dann kann ich deinen Kommentar entgegennehmen.