ProFTPd
Allgemein
proFTPd (http://www.proftpd.org) ist ein sicherer und "full-featured" FTP-Server. Analog zu →VsFTPd wird proFTPd ebenfalls via ipkg installiert. ProFTPd bietet allerdings mehr Features und Konfigurationsmöglichkeiten als →VsFTPd Für weitere Details siehe →Generelle Infos.
Installation
Zum Installieren wie gehabt:
ipkg update ipkg install proftpd
Generelle Konfiguration
Editieren der Konfigurationsdatei:
vi /opt/etc/proftpd.conf
Folgenden Eintrag auskommentieren, damit jeder FTP-User nur in "seinem" Home-Verzeichnis gefesselt wird (chroot), anstatt auf alle Dateien der NSLU Zugriff zu haben:
DefaultRoot ~
Servername, der nach der Verbindungsaufnahme noch vor dem login angezeigt wird, evtl. abändern - z.B.:
ServerName "FTP-Server"
Folgende Konfigurations Optionen einfügen:
UseReverseDNS off IdentLookups off
im oberen Bereich ergänzen (nicht ans Ende anhängen), sodass der Beginn der Konfigurationsdatei z.B. so aussieht:
ServerName "FTP-Server" ServerType standalone oder inetd (→siehe Konfiguration der Betriebsart) DefaultServer on WtmpLog off
UseReverseDNS off IdentLookups off
Es empfiehlt sich, aus Sicherheitsgründen den Root-Zugang via FTP zu deaktivieren. Dazu im Bereich <Global> folgende Konfigurationsoption setzen:
RootLogin Off
Optional:
Deaktivieren des Anonymen-Zugangs:
vi /opt/etc/proftpd.conf
Den kompletten Anonymous-Bereich auskommentieren:
#<Anonymous ~ftp> #... #</Anonymous>
Konfiguration der Betriebsart
Im Gegensatz zu →bftpd und →VsFTPd kann proFTPd entweder als Standalone Server oder mittels →xinetd betrieben werden. Wenn proFTPd als Standalone-Server betrieben wird, entfällt die Ladezeit, allerdings verbraucht proFTPd auch dann Sytem-Resourcen, wenn kein User eingeloggt ist. Im folgenden werden beide Betriebsarten beschrieben, die Wahl der Betriebsart liegt schließlich beim Systemverwalter. Es kann auch später zwischen den Betriebsarten gewechselt werden, sodass die für den speziellen Einsatzfall passende Lösung ermittelt werden kann.
Betrieb mittels xinetd
Voraussetzung:
- xinetd installiert und konfiguriert
Der FTP-Server proFTPd wird vom → xinetd (extended Internet Daemon) gestarted und nach dem Beenden der Verbindung wieder beendet. D.h. wenn keine Verbindung besteht, verbraucht der FTP-Server keinerlei Systemresourcen (weder Speicher noch CPU-Zeit). Damit der proFTPd vom Internet Daemon gestarted wird, muß ihm dies in Form einer Serverdefinitionsdatei mitgeteilt werden.
Bei der Installation wurde bereits eine xinetd Datei für proFTPd angelegt.
Falls später ein Zugriff auf den FTP-Server aus dem Internet stattfinden soll, sollte ein "only_from" Statement eingefügt werden (für weitere Hinweise siehe auch →xinetd).
vi /opt/etc/xinetd.d/proftpd
Statement ergänzen:
only_from = 0.0.0.0/0
sodass dieses File so aussieht:
# # ProFTPd FTP daemon - http://www.proftpd.org # service ftp { flags = REUSE socket_type = stream instances = 30 wait = no user = root server = /opt/sbin/proftpd server_args = --config /opt/etc/proftpd.conf log_on_success = HOST PID log_on_failure = HOST disable = no only_from = 0.0.0.0/0 }
Neustarten von xInetd damit die Änderungen wirksam werden:
/opt/etc/init.d/S10xinetd
Anpassen/checken des Servertyps in Konfigurationsdatei:
vi /opt/etc/proftpd.conf
Eintrag checken/ändern:
ServerType inetd
Es sollte kein Startscript für proFTPd unter /opt/etc/init.d vorhanden sein. Dies ist nur für den Standalone-Betrieb nötig und stört hier eher.
rm /opt/etc/init.d/S58proftpd
→Weiter zur Benutzerverwaltung
Betrieb als Standalone Server
Für den Standalone-Betrieb von proFTPd ist kein xinetd nötig. Falls dieser installiert ist, muß in der proFTPd-Definitionsdatei der proFTPd deaktiviert werden, da xinetd ansonsten bei einer FTP-Anfrage versucht, proFTPd zu starten, obwohl dieser bereits als Standalone-Server läuft. Dies führt unweigerlich zu Fehlern.
vi /opt/etc/xinetd.d/proftpd
proFTPd disablen:
disable = yes
Neustarten von xinetd:
/opt/etc/init.d/S10xinetd
Anpassen/checken des Servertyps in Konfigurationsdatei:
vi /opt/etc/proftpd.conf
Eintrag checken/ändern:
ServerType standalone
Zum Start von proFTPd ist noch ein Startscript nötig, damit dieser auch nach einem Reboot der NSLU gestartet wird. Dieses befindet sich bereits auf der NSLU und muß lediglich ins korrekte Verzeichnis kopiert werden:
cp /opt/doc/proftpd/S58proftpd /opt/etc/init.d
Einrichten der User
User via Weboberfläche anlegen
User via Weboberfläche der NSLU einrichten (hier beispielhaft User:ftpuser):
- Weboberfläche der NSLU im Webbrowser öffnen.
- In den Bereich "Administration" wechseln (evtl. Benutzername und Passwort des Admin-Users eingeben)
- In's Untermenü "Users" wechseln
- Folgende Daten eingeben:
Name: ftpuser Comment: z.B. FTP-User Passwort/Verify Passwort: FTP_PWD Create Private Folder: aktivieren
Setzen des Home-Verzeichnis
Damit ein Login via FTP klapp, muss noch das HOME-Verzeichnis in der zentralen Nutzer/Passwort-Datei /etc/passwd ergänzt werden.
vi /etc/passwd
Die Einträge in der Passwort-Datei sind nach folgendem Schema aufgebaut:
username:pwd:uid:gid:Kommentar:Home-Verzeichnis:Login-Shell
Nach dem eben angelegten User ftpuser suchen und das Home-Verzeichnis anpassen: Originaleintrag:
ftpuser:FTP_PWD:2005:501:FTP-User::/dev/null
abändern in:
ftpuser:FTP_PWD:2005:501:FTP-User:/ftpuser:/dev/null
Bei allen Nutzern die via FTP berechtigt sein sollen, sich einzuloggen, das entsprechende HOME-Verzeichnis ergänzen.
- Wenn z.B. das Passwort eines Users via Weboberfläche geändert wird, oder jede sonstige Änderung an den Einstellungen eines Users, wird das Homeverzeichnis zurückgesetzt. D.h. es muss gemäß obiger Anleitung erneut angepasst werden, ansonsten klappt der FTP-Zugang nicht mehr.
Ausslchuß bestimmter User
Aus Sicherheitsgründen ist es möglich - und empfehlenswert - bestimmte User (root, guest, mail, ...) von einer FTP-Anmeldung auszuschließen, unabhängig ob ein Home-Verzeichnis gesetzt ist oder nicht. Diese auszuschließenden User werden in der Datei /opt/etc/ftpusers angegeben.
vi /opt/etc/ftpusers
Darin alle auszuschließenden User eingeben (pro Zeile ein Username) Z.B.:
root admin guest nobody mail spamd ftp
FTP-Zugang testen
- Mittels FTP-Programm:
- FTP-Programm öffnen
- Server-Adresse: IP_DER_NSLU
- User: ftpuser
- Passwort: FTP_PWD
- Verbindung herstellen
- Es sollte kein Fehler gemeldet werden und der Verzeichnisinhalt sollte zu sehen sein
- Mittels Webbrowser:
- Webbrowser öffnen
- Adresse eingeben: ftp://ftpuser:FTP_PWD@IP_DER_NSLU
- Es sollte kein Fehler gemeldet werden und der Verzeichnisinhalt sollte zu sehen sein
SSL-Verschlüsselung
Optional kann SSL-Verschlüsselung verwendet werden, um Passwort und/oder Daten verschlüsselt zu übertragen. Dies erhöht die Sicherheit enorm. Um SSL zu aktivieren, sind umfangreiche Einstellungen nötig.
Voraussetzung:
OpenSSL installiert und konfiguriert
Erzeugen der Schlüssel und Zertifikate
Für die SSL-Zertifikate sind einige Parameter wichtig. Diese sind:
- C (country:2 Zeichen)
- ST (State/Provinz)
- L (Locality/Ort)
- O (Organisation)
- OU (Organisational Unit)
- CN (Common Name)
Im folgenden müssen Schlüssel und Zertifikate für den eigenen Server erstellt werden. Zu beachten ist, dass der Common Name, Organisation und Organisational Unit jeweils unterschiedlich bei CA und Server gewählt werden (→ siehe auch Anmerkungen CA). Ansonsten kann es zu Problemen kommen, die bis dahin reichen, dass das erstellen der Zertifikate mit einem kryptischen Fehler abbricht.
Die Zertifikate haben - im Gegensatz zu den Keys - eine begrenzete Gültigkeitsdauer. Diese beträgt standardmäßig 365 Tage. D.h. Das Zertifikat wird nach einem Jahr ungültig und muß neu erstellt werden. Die Gültigkeit kann allerdings mit Hilfe des Parameters -days auf einen beliebigen Wert gesetzt werden.
Die Keys und Zertifikate haben ein Passwort zum Schutz vor fremden Zugriff. Für eine Serveranwendung ist dieser Schutz leider etwas hinderlich, da erst das Passwort eingegeben werden müßte, bevor der Apache-Server komplett starten würde. Dies wäre nach jedem Neustart von Apache und damit auch des Servers erforderlich. Deshalb wird hier der Passwortschutz von den Zertifiakten entfernt. D.h. wenn ein Fremder die Zertifikate in die Hände bekommen würde, könnte er evtl. die Kommunikation zwischen Server und Webbrowser belauschen.
Generierung SSL.Key:
cd /opt/etc/ssl/key openssl genrsa -des3 -out proftpd.key 1024 Hinweis: Passwort key_pwd muss vergeben werden
Entfernen des Passworts key_pwd:
mv proftpd.key proftpd.key.orig openssl rsa -in proftpd.key.orig -out proftpd.key chmod 600 proftpd.key
Erzeugung Certificate Signing Request (CSR):
openssl req -new -key proftpd.key -out proftpd.csr
Folgende Eingaben sind notwendig (Bitte Organization Name und -Unit sowie Common Name abändern siehe Anmerkungen oben):
Country Name: de State or Province Name: de Locality Name: . Organization Name: private Organizational Unit Name: server Common Name: domain Email Address: . A challenge password: . An optional company name: .
Zertifikat signieren:
Ins CA-Verzeichnis wechseln:
cd ../ca
Signieren (Abfragen mit y bestätigen):
openssl ca -config ca.config -out ../cert/proftpd.crt -infiles ../key/proftpd.csr
Verifizieren:
openssl verify -CAfile ca.crt ../cert/proftpd.crt
Ausgabe sollte folgendermaßen aussehen:
../cert/proftpd.crt: OK
Zertifikate kopieren
ProFTPd erwartet die Zertifikate im Unterverzeichnis /opt/etc/ftpd. Deshalb müssen die eben erzeugten Zertifikate dorthin kopiert werden.
cp /opt/etc/ssl/ca/ca.crt /opt/etc/ftpd cp /opt/etc/ssl/key/proftpd.key /opt/etc/ftpd cp /opt/etc/ssl/cert/proftpd.crt /opt/etc/ftpd
Konfiguration von xinetd
Damit sowohl "normaler", als auch SSL-verschlüsselter FTP-Zugriff sowohl von externen FTP-Clients (aus dem Internet), als auch intern funktioniert, muß ein sog. Virtueller FTP-Server (Virtualhost) angelegt werden. Der externe Zugriff läuft über einen eigenen Port (z.B. 2021, kann frei gewählt werden) via Virtualhost und der interne Zugriff weiterhin auf Port 21. Der Zugriff aus dem Internet soll natürlich weiterhin via Standardport 21 erfolgen. D.h. der DSL-Router muß Port 21 von extern an Port 2021 der NSLU weiterleiten. Für diesen Zweck sind einige Konfigurationsoperationen an mehreren Dateien nötig.
Die folgenden Schritte dieses Abschnitts sind nur erforderlich, falls proFTPd via →xinetd betrieben wird.
Neuen externen FTP-Service z.B. ftpext definieren, der auf Port 2021 liegt:
vi /etc/services
folgende Zeile einfügen:
ftpext 2021/tcp # External FTP
proFTd xinetd-Konfigurationsdatei editieren:
vi /opt/etc/xinetd.d/proftpd
Folgende Zeilen ans Ende der Datei anfügen, um den zusätzlichen Service zu definieren. Damit "lauscht" der xinetd auch auf Port 2021 und startet bei Bedarf proFTPd:
service ftpext { flags = REUSE port = 2021 socket_type = stream instances = 30 wait = no user = root server = /opt/sbin/proftpd server_args = --config /opt/etc/proftpd.conf log_on_success = HOST PID log_on_failure = HOST disable = no only_from = 0.0.0.0/0 }
Neustarten von xinetd:
/opt/etc/init.d/S10xinetd
Konfiguration von proFTPd für SSL
proFTPd Konfiguration anpassen:
vi /opt/etc/proftpd.conf
Folgende Zeilen im Bereich Global (zwischen <Global> ... </Global>) ergänzen:
<IfModule mod_tls.c> TLSLog /opt/var/proftpd/tls.log # Clients are required to use FTP over SSL/TLS when talking to this server # off - clients can connect using insecure FTP or secure FTP/SSL # ctrl - encrypt only the ctrl channel using FTP/SSL # data - encrypt only the data channel using FTP/SSL (not recommended) # on - encrypt both the ctrl and data channels using FTP/SSL TLSRequired off # Server's certificate TLSRSACertificateFile /opt/etc/ftpd/proftpd.crt TLSRSACertificateKeyFile /opt/etc/ftpd/proftpd.key # CA the server trusts TLSCACertificateFile /opt/etc/ftpd/ca.crt # Authenticate clients that want to use FTP over SSL/TLS # off - client SSL certificates are not requried # on - client SSL certificates are required TLSVerifyClient off </IfModule>
und im oberen Bereich (vor Global):
<IfModule mod_tls.c> TLSEngine on # Set the TLSProtocol to one of the following # SSLv23 - Use SSL3 for ctrl and TLS1 for data channels (works with most clients) # SSLv3 - Use only SSL3 # TLSv1 - Use only TLS1 TLSProtocol SSLv23 </IfModule>
Die Einträge TLSProtocol, TLSRequired und TLSVerifyClient entsprechend den Anforderungen anpassen.
- Wird TLSREQUIRED auf ctrl,data oder on gesetzt, sind nur noch SSL-verschlüsselte Verbindungen möglich, die nicht alle FTP-Clients unterstützen. Andererseits erhöhen diese Einstellungen die Sicherheit, da keine unverschlüsselte Verbindung möglich ist. Die Auswahl der Einstellung obliegt dem angedachten Einsatzzweck des Servers.
Ans Ende der Konfigurationsdatei noch den folgenden Virualserver-Block einfügen:
#External Virtual SSL-FTP-Server <VirtualHost 192.168.0.221> ServerName "Private FTP server" Port 2021 IdentLookups off Umask 027 AllowOverwrite on DefaultRoot ~ PassivePorts 60019 60049 MasqueradeAddress Dynamic-DNS-Domain <IfModule mod_tls.c> TLSEngine on </IfModule> </VirtualHost>
Mittels MasqueradeAddress wird proFTPd angewiesen, die externe Dyndns-Domain zu übertragen, anstatt der internen IP-Adresse der NSLU. Deshalb diesen Eintrag mit der registrierten Dynamic DNS-Adresse ersetzen.
Mit dem Eintrag PassivePorts wird prFTPd angewiesen, einen bestimmten Port aus dem Bereich 50019 bis 50039 zu verwenden.
Test der SSL-Verbindung Intern
Die Webbrowser Firefox und Internetexplorer beherrschen FTP nur in der Klartext-Version (kein SSL).
- FTP-Programm öffnen
- Server-Adresse: IP_DER_NSLU
- Protokoll: FTPES - FTP über explizites TLS/SSL
- User: ftpuser
- Passwort: FTP_PWD
- Verbindung herstellen
- Es sollte kein Fehler gemeldet werden und der Verzeichnisinhalt sollte zu sehen sein
- Protokoll: Manche FTP-Clients bieten neben FTPES (explizites TLS/SSL) auch FTPS (implizites TLS/SSL), das allerdings mit proFTPd nicht funktioniert
- Dies testet die interne SSL-Verbindung. Die externe Verbindung muß im folgenden Kapitel erst konfiguriert werden, bevor er im darauf folgenden Kapitel getestet werden kann.
Test der externen SSL-Verbindung
Analog den Angaben im Kapitel →FTP Internetfreigabe eine Portweiterleitung im DSL-Ruter anlegen mit folgenden Daten:
Bezeichnung: z.B. FTP-Passiv Protokoll: TCP Von Port: 60019 Bis port: 60049 An IP-Adresse: IP_DER_NSLU An Port: 60019 bis 60049
Eine weitere:
Bezeichnung: z.B. FTP-SSL-Server Protokoll: TCP von Port: 21 An IP-Adresse: IP_DER_NSLU An Port: 2021
Die Webbrowser Firefox und Internetexplorer beherrschen FTP nur in der Klartext-Version (kein SSL) deshablb taucht hier kein Punkt für einen Test mittels Webbrowser auf.
- FTP-Programm öffnen
- Server-Adresse: DYNDNS-DOMAIN
- Protokoll: FTPES - FTP über explizites TLS/SSL
- User: ftpuser
- Passwort: FTP_PWD
- Verbindung herstellen
- Es sollte kein Fehler gemeldet werden und der Verzeichnisinhalt sollte zu sehen sein
- Manche FTP-Clients bieten neben FTPES (explizites TLS/SSL) auch FTPS (implizites TLS/SSL), das allerdings mit proFTPd nicht funktioniert
Beispielkonfiguration
Hier sollen zwei komplette Beispielkonfigurationsfiles vorgestellt werden, die alle oben genannten Punkte enthalten.
Beispiel: FTP-Server
ServerName "FTP-Server" ServerType inetd DefaultServer on WtmpLog off UseReverseDNS off IdentLookups off # Port 21 is the standard FTP port. Port 21 # Umask 022 is a good standard umask to prevent new dirs and files # from being group and world writable. Umask 022 # To prevent DoS attacks, set the maximum number of child processes # to 30. If you need to allow more than 30 concurrent connections # at once, simply increase this value. Note that this ONLY works # in standalone mode, in inetd mode you should use an inetd server # that allows you to limit maximum number of processes per service # (such as xinetd). MaxInstances 10 <Global> RootLogin Off RequireValidShell off AuthUserFile /etc/passwd AllowStoreRestart on # TransferRate RETR 25 # TransferRate APPE,STOR 100:2048 </Global> # Set the user and group under which the server will run. User nobody Group nobody # To cause every FTP user to be "jailed" (chrooted) into their home # directory, uncomment this line. DefaultRoot ~ # Normally, we want files to be overwriteable. AllowOverwrite on # Bar use of SITE CHMOD by default <Limit SITE_CHMOD> DenyAll </Limit> # A basic anonymous configuration, no upload directories. If you do not # want anonymous users, simply delete this entire <Anonymous> section. #<Anonymous ~ftp> # User ftp # Group ftp # # # We want clients to be able to login with "anonymous" as well as "ftp" # UserAlias anonymous ftp # # # Limit the maximum number of anonymous logins # MaxClients 5 # # # We want 'welcome.msg' displayed at login, and '.message' displayed # # in each newly chdired directory. # DisplayLogin welcome.msg # DisplayFirstChdir .message # # # Limit WRITE everywhere in the anonymous chroot # <Limit WRITE> # DenyAll # </Limit> #</Anonymous>
Beispiel: SSL-FTP-Server
# This is a basic ProFTPD configuration file (rename it to # 'proftpd.conf' for actual use. It establishes a single server # and a single anonymous login. It assumes that you have a user/group # "nobody" and "ftp" for normal operation and anon. ServerName "FTP-Server" ServerType inetd DefaultServer on WtmpLog off UseReverseDNS off IdentLookups off <IfModule mod_tls.c> TLSEngine on TLSProtocol SSLv23 </IfModule> # Port 21 is the standard FTP port. Port 21 # Umask 022 is a good standard umask to prevent new dirs and files # from being group and world writable. Umask 022 # To prevent DoS attacks, set the maximum number of child processes # to 30. If you need to allow more than 30 concurrent connections # at once, simply increase this value. Note that this ONLY works # in standalone mode, in inetd mode you should use an inetd server # that allows you to limit maximum number of processes per service # (such as xinetd). MaxInstances 10 <Global> RootLogin Off RequireValidShell off AuthUserFile /etc/passwd AllowStoreRestart on # TransferRate RETR 25 # TransferRate APPE,STOR 100:2048 <IfModule mod_tls.c> TLSLog /opt/var/proftpd/tls.log # Set the TLSProtocol to one of the following # SSLv23 - Use SSL3 for ctrl and TLS1 for data channels (works with most clients # SSLv3 - Use only SSL3 # TLSv1 - Use only TLS1 # TLSProtocol SSLv23 # Clients are required to use FTP over SSL/TLS when talking to this server # off - clients can connect using insecure FTP or secure FTP/SSL # ctrl - encrypt only the ctrl channel using FTP/SSL # data - encrypt only the data channel using FTP/SSL (not recommended) # on - encrypt both the ctrl and data channels using FTP/SSL TLSRequired off # Server's certificate TLSRSACertificateFile /opt/etc/ftpd/proftpd.crt TLSRSACertificateKeyFile /opt/etc/ftpd/proftpd.key # CA the server trusts TLSCACertificateFile /opt/etc/ftpd/ca.crt # Authenticate clients that want to use FTP over SSL/TLS # off - client SSL certificates are not requried # on - client SSL certificates are required TLSVerifyClient off </IfModule> </Global> # Set the user and group under which the server will run. User nobody Group nobody # To cause every FTP user to be "jailed" (chrooted) into their home # directory, uncomment this line. DefaultRoot ~ # Normally, we want files to be overwriteable. AllowOverwrite on # Bar use of SITE CHMOD by default <Limit SITE_CHMOD> DenyAll </Limit> # A basic anonymous configuration, no upload directories. If you do not # want anonymous users, simply delete this entire <Anonymous> section. #<Anonymous ~ftp> # User ftp # Group ftp # # # We want clients to be able to login with "anonymous" as well as "ftp" # UserAlias anonymous ftp # # # Limit the maximum number of anonymous logins # MaxClients 5 # # # We want 'welcome.msg' displayed at login, and '.message' displayed # # in each newly chdired directory. # DisplayLogin welcome.msg # DisplayFirstChdir .message # # # Limit WRITE everywhere in the anonymous chroot # <Limit WRITE> # DenyAll # </Limit> #</Anonymous> #External Virtual SSL-FTP-Server <VirtualHost 192.168.0.221> ServerName "FTP-Server" Port 21 IdentLookups off Umask 027 AllowOverwrite on DefaultRoot ~ PassivePorts 60019 60049 MasqueradeAddress schiele.homelinux.org <IfModule mod_tls.c> TLSEngine on </IfModule> </VirtualHost>