TLS für proftpd unter Debian 11 einrichten
In diesem Howto installieren wir proftp und erstellen eine Konfiguration, mit der die eher unsichere Kommunikation via ftp auf Port 21 mit TLS (Transport Layer Security) verschlüsselt werden kann. Unser Test-System ist ein frisch installiertes Debian 11. Los geht’s:
Inhalt
Schritt 1: Installation von proftpd
apt update apt -y install proftpd
Schritt 2: Daemon starten
Der Start des Dienstes bzw. Daemons erledigen wir mit:
systemctl restart proftpd
Ob der Daemon ordentlich läuft kontrollieren wir so:
root@ftpserver:/etc/proftpd# ps axu | grep -i ftp proftpd 1087 0.0 0.1 21952 4044 ? Ss 17:42 0:00 proftpd: (accepting connections) root 1245 0.0 0.0 6200 720 pts/0 R+ 18:11 0:00 grep -i ftp root@ftpserver:/etc/proftpd# systemctl status proftpd ● proftpd.service - ProFTPD FTP Server Loaded: loaded (/lib/systemd/system/proftpd.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-12-30 17:42:55 CET; 28min ago Process: 1085 ExecStartPre=/usr/sbin/proftpd --configtest -c $CONFIG_FILE (code=exited, status=0/SUCCESS) Process: 1086 ExecStart=/usr/sbin/proftpd -c $CONFIG_FILE $OPTIONS (code=exited, status=0/SUCCESS) Main PID: 1087 (proftpd) Tasks: 1 (limit: 4675) Memory: 1.9M CPU: 137ms CGroup: /system.slice/proftpd.service └─1087 proftpd: (accepting connections) Dez 30 17:42:55 ftpserver systemd[1]: Starting ProFTPD FTP Server... Dez 30 17:42:55 ftpserver proftpd[1085]: Checking syntax of configuration file Dez 30 17:42:55 ftpserver systemd[1]: Started ProFTPD FTP Server.
Schritt 3: Zertifikat für tls unter proftpd erstellen mit Let’s encrypt
Damit wir ein möglichst valides Zertifikat bekommen, nutzen wir das kostenfreie Let’s encrypt und das dazu passende „acme.sh“ Skript
cd /root curl https://get.acme.sh | sh source ~/.bashrc acme.sh --register-account -m [email protected] acme.sh --issue -d ftpserver.biteno.com --webroot /var/www/html/ --log
Die Mail-Adresse „[email protected]“ sowie den FQDN-Servernamen ersetzen sie logischerweise durch ihre Werte.
Anschließend sollten unter /root/.acme/<hostname>/ die erstellten Zertifikate liegen.
In unserem Beispiel heißt unser Host „ftpserver.biteno.com“ und daher die Zertifikats-Dateien wie folgt:
TLSRSACertificateFile /root/.acme.sh/ftpserver.biteno.com/ftpserver.biteno.com.cer TLSRSACertificateKeyFile /root/.acme.sh/ftpserver.biteno.com/ftpserver.biteno.com.key TLSCACertificateFile /root/.acme.sh/ftpserver.biteno.com/ca.cer
Schritt 4: Konfig von proftpd anpassen
Damit TLS wirksam wird, muss man blöderweise an zwei Stellen TLS einstellen bzw. aktivieren. Einmal in der Datei modules.conf. Hier wird einfach nur die Funktionalität für TLS eingeschaltet. Dazu werden die folgenden Zeilen auskommentiert (‚#‘ am Zeilenanfang entfernen)
# Install proftpd-mod-crypto to use this module for TLS/SSL support. LoadModule mod_tls.c # Even these modules depend on the previous one LoadModule mod_tls_fscache.c LoadModule mod_tls_shmcache.c
Außerdem in der proftpd.conf: Hier muss die Datei tls.conf mit geladen werden. Das macht die Zeile Include /etc/proftpd/tls.conf .
Die zweite Konfigurationsdatei „tls.conf“ muss man dann noch detailliert an die eigenen Bedürfnisse anpassen:
Dabei schalten wir die TLSEngine erst einmal pauschal an und die Protokollierung gleich mit.
Wichtig ist danach die Zeile mit „TLSProtocol„. Hier wird festgelegt, welche der bekannten TLS-Protokolle überhaupt verwendet werden dürfen.
Da TLS 1.0 und 1.1 nicht mehr als sicher angesehen werden, lassen wir diese weg. In der u.a. Konfig erlauben wir also nur TLS 1.2 und 1.3. Die Zeilen der Zertifikate werden auf jedem Server anders heißen. Das Prinzip der Benennung der Zertifikat-Dateien ist in proftpd ähnlich wie in Apache2.
nano /etc/proftpd/tls.conf
<IfModule mod_tls.c> TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol TLSv1.2 TSLv1.3 SSLv3 TLSRSACertificateFile /root/.acme.sh/ftpserver.biteno.com/ftpserver.biteno.com.cer TLSRSACertificateKeyFile /root/.acme.sh/ftpserver.biteno.com/ftpserver.biteno.com.key TLSCACertificateFile /root/.acme.sh/ftpserver.biteno.com/ca.cer TLSVerifyClient off TLSRequired off </IfModule>
Wie schon weiter oben ersetzen Sie ihren Hostnamen an den Stellen, an denen hier „ftpserver.biteno.com“ steht.
In der Konfiguration von TLS lassen wir den Schalter TLSRequired absichtlich auf „aus“ (engl. off) stehen. Sonst können sich alte FTP-Clients die kein TLS beherrschen nicht mehr anmelden.
Schritt 5: Konfigiuration prüfen
Mit dem Befehl
/usr/sbin/proftpd –configtest -c /etc/proftpd/proftpd.conf
kann man zumindest schon einmal die gröbsten Fehler in der Konfiguration vermeiden.
Eine Ausgabe sieht dann z.B. so aus:
root@ftpserver:/etc/proftpd# /usr/sbin/proftpd --configtest -c /etc/proftpd/proftpd.conf Checking syntax of configuration file 2021-12-30 17:12:40,991 ftpserver proftpd[748]: fatal: unknown configuration directive 'TSLProtocol' on line 15 of '/etc/proftpd/tls.conf' 2021-12-30 17:12:40,992 ftpserver proftpd[748]: fatal: Did you mean: TLSProtocol TLSNextProtocol 2021-12-30 17:12:40,992 ftpserver proftpd[748]: warning: unable to include '/etc/proftpd/tls.conf': Die Operation ist nicht erlaubt
Auch wenn die Ausgabe gar nicht so schlecht aussieht: Hier ist mit ‚TSLProtocol‘ (statt TLSProtocol) ein Vertipper drin.
Schritt 6: Testen von einem anderen Host
Mit nmap prüfen wir auf welchem Port unser neu installierter Daemon „lauscht“. Für einen echten Test sollten wir das von einem anderen Server aus machen. Das geht mit : nmap <hostname>
Starting Nmap 7.80 ( https://nmap.org ) at 2021-12-30 17:15 CET Nmap scan report for ftpserver.biteno.com (185.136.xx.yy) Host is up (0.000061s latency). Not shown: 997 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh
Unser ftp-Server hört also schon mal auf Port 21. Das ist gut.
Schritt 7: SSL Zertifikat prüfen
Mit dem Befehl:
openssl s_client -connect ftpserver.biteno.com:21 -starttls ftp
können wir auf Bash-Ebene prüfen ob die Verbindung zum Server auf Port 21 über tls abgesichert werden kann. Das erledigt bei openssl die Option „-starttls“
Das Ergebnis sieht dann z.B. so aus:
CONNECTED(00000003) depth=2 C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority verify return:1 depth=1 C = AT, O = ZeroSSL, CN = ZeroSSL RSA Domain Secure Site CA verify return:1 depth=0 CN = ftpserver.biteno.com verify return:1 --- Certificate chain 0 s:CN = ftpserver.biteno.com i:C = AT, O = ZeroSSL, CN = ZeroSSL RSA Domain Secure Site CA 1 s:C = AT, O = ZeroSSL, CN = ZeroSSL RSA Domain Secure Site CA i:C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority 2 s:C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority i:C = GB, ST = Greater Manchester, L = Salford, O = Comodo CA Limited, CN = AAA Certificate Services --- Server certificate -----BEGIN CERTIFICATE----- MIIGcTCCBFmgAwIBAgIRAOVLbY3FGadSdU+JcCe3CaswDQYJKoZIhvcNAQEMBQAw SzELMAkGA1UEBhMCQVQxEDAOBgNVBAoTB1plcm9TU0wxKjAoBgNVBAMTIVplcm9T U0wgUlNBIERvbWFpbiBTZWN1cmUgU2l0ZSBDQTAeFw0yMTEyMjgwMDAwMDBaFw0y MjAzMjgyMzU5NTlaMBwxGjAYBgNVBAMTEXJhZGl1cy5iaXRlbm8uY29tMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2gXixjCjXKx7H2eCczffjNCObfkj 94MoYcwPOoE4Y3Get/d9Q6yyv6GU1/BR4ahevAifLU0aBD43j5qzAcNh7Qp8W6ED l+ccrGDuoEs90ZzX8+HPxaogBfeYVJh8XsHTyeKaNrnOBmgoaqQlCT+qmEw75AgU Ewu6TnEpC1+nv4+d7PyTo8YJvo0xfj+5qoI+pIwcQ1zT3USdhoTZCcOe72Qm9Z9y HBXEu20XEAlcvjfqK7K1/EGn0DdB6cQNZmSts+7D5KJSwkmJx516V54mRX+R2UhK GP1uKknhqjotZMkVGdMu/CRzi0wdC5LZjlFfWponAyFnkXwm7v1FgKIh+wIDAQAB o4ICfTCCAnkwHwYDVR0jBBgwFoAUyNl4aKLZGWjVPXLeXwo+3LWGhqYwHQYDVR0O BBYEFDKJ0dsxTDbVD4/3Eon76lG+XPhhMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMB Af8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBJBgNVHSAEQjBA MDQGCysGAQQBsjEBAgJOMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5j ... cmFkaXVzLmJpdGVuby5jb20wDQYJKoZIhvcNAQEMBQADggIBABaebz+K4MywK1NH VVTzyjh+LwYmDJ9rtw9cXdRswwaDxSv3VGhGiWThg00msBXZVsULxB9CO39HeUdt GaLGOeb/iKRKJQZmndJx/LkeYfXbDdgRNJPss7obwGSJqJSlv2cJbaDjxHPbxTaB PqhooEItSu5HaJbcOkilKLx4dulBWyKo8ubZdz4blGmItosqMxDTG+550m3E04PG stUAQUCL6S9G0xIolm/2HUx6pq486DwTiH0Mdkl+gElLp2efljazDNYQ2OZZnl0j Vyh7YULsvbDUBCe1sgZxBIYUcj/PBZiGgyb4GVNJGAc0rvwGY9a25BEHSDN5QEom rjbuFgzNfMAH/4uGwZzp+3CdHo6U7TC+BNGC9AYYRRa6IHGPwdjhFlFGqAU6ovnp pQxrkxJwgLIMonkMrRKenOTSKZcVB4BSUvlYrY0t248kOz9wq7s2KRZ1czBCe3pS pY2LjwWYlVmdaFWj0wOlo4Uvc1Ry6iPaFLviwz/5XQ/XGfl639S+ZzMNYRm0h8Y4 CeSfLa07uQDkdikBSGQ3KCESPjM/kwkaRUp1rhS/DHm9RPzy7TH5GkMV0iCpbMku /kx2hJvXQmTGCkWgAFNVFZygWR4RFOB1uJ2WucjLUjkCuY8uWf+CU+LILMMJb/k/ gOMDamJ5mZwey5PjCydABF5o8XNJ -----END CERTIFICATE----- subject=CN = ftpserver.biteno.com issuer=C = AT, O = ZeroSSL, CN = ZeroSSL RSA Domain Secure Site CA --- No client certificate CA names sent Peer signing digest: SHA256 Peer signature type: RSA-PSS Server Temp Key: X25519, 253 bits --- SSL handshake has read 5479 bytes and written 399 bytes Verification: OK --- New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384 Server public key is 2048 bit Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated Early data was not sent Verify return code: 0 (ok) --- 220 ProFTPD Server (ftpserver.biteno.com) [::ffff:185.136.112.178] --- Post-Handshake New Session Ticket arrived: SSL-Session: Protocol : TLSv1.3 Cipher : TLS_AES_256_GCM_SHA384 Session-ID: AA23904D53C1B402274F02E483C0281772EBB2AD370EF062080227A5EE43CCDB Session-ID-ctx: Resumption PSK: 8031D6DCB3D33FA83EF88844CCAD2752151D9064735BF5F7869C1D50452597716232E4443EADAE7770B6FA433525DDCC PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 15840 (seconds) TLS session ticket: 0000 - eb c4 68 df 6c af 15 28-ca 93 08 fc ef 13 bf 0f ..h.l..(........ 0010 - 0e 36 f7 8c 54 98 4d 01-e6 a1 87 a9 3f 00 da 5a .6..T.M.....?..Z 0020 - b8 3f 95 f0 d4 40 71 ed-e6 05 8a bb b5 14 f5 bc .?...@q......... 0030 - 5c 77 ac 07 a8 a6 e2 4e-8d 37 cd 30 d3 fb 02 6c \w.....N.7.0...l 0040 - a0 16 e5 b7 ee f5 df 07-e4 72 f6 b4 a3 8e 5d 67 .........r....]g 0050 - ff 6f 98 1c 2c 6f d5 46-23 11 de 48 0d 79 19 61 .o..,o.F#..H.y.a 0060 - e8 f3 93 5b a3 5e ef 9d-c2 57 27 99 94 e6 71 ef ...[.^...W'...q. 0070 - 4d 6e ea 92 a5 2f 50 32-95 35 64 d8 4c b8 ea dc Mn.../P2.5d.L... 0080 - 91 b1 10 b9 05 1a 00 85-e6 b6 78 2e 11 a1 a8 d0 ..........x..... 0090 - c6 ac bf 89 c8 92 ae 24-1b d8 09 2f 49 24 ce 4d .......$.../I$.M 00a0 - d0 78 b0 b3 a9 da c2 24-b9 72 9d f3 0e 7d e7 bf .x.....$.r...}.. 00b0 - a4 96 77 02 40 17 06 1e-78 63 d3 40 29 16 92 e8 [email protected].@)... 00c0 - 83 b6 b1 5d ae de bb bb-b7 1c bf 20 af ba fe 26 ...]....... ...& 00d0 - d4 2f 56 fb e2 ff d2 50-5a 84 70 31 43 49 f3 71 ./V....PZ.p1CI.q 00e0 - fe d5 9f ce ca 2f 6d 25-fe fb bb 13 3f c5 07 2b ...../m%....?..+ 00f0 - 36 a2 a4 04 9e 19 c9 84-9a 4f 40 be d0 82 36 e2 [email protected]. Start Time: 1640881096 Timeout : 7200 (sec) Verify return code: 0 (ok) Extended master secret: no Max Early Data: 0 --- read R BLOCK --- Post-Handshake New Session Ticket arrived: SSL-Session: Protocol : TLSv1.3 Cipher : TLS_AES_256_GCM_SHA384 Session-ID: 81C682559AF19172E761A9F0EBD133DEBEC8F17F610A97635403EC56E9F278A4 Session-ID-ctx: Resumption PSK: DB4D181A9FFA9DC1ED3FBD7A555C19EE4EB970E4D5BFDA8AA511DC416E31FCD198BA756B723C4C6DD523DD6E606C64E5 PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 15840 (seconds) TLS session ticket: 0000 - eb c4 68 df 6c af 15 28-ca 93 08 fc ef 13 bf 0f ..h.l..(........ 0010 - 53 29 7a 0b a3 20 be 38-b2 e5 8f 94 1f d6 30 c0 S)z.. .8......0. 0020 - 93 56 a2 35 3a bc 3a de-2f 6e e2 18 94 9e 80 36 .V.5:.:./n.....6 0030 - 09 26 0c 3b d2 20 92 cf-51 22 61 96 21 63 c6 c1 .&.;. ..Q"a.!c.. 0040 - 54 22 63 b9 30 04 82 e4-66 1f 1f 67 78 f5 ec 2b T"c.0...f..gx..+ 0050 - b7 53 0f 25 f6 8a d2 93-a8 87 62 0a dd 35 c4 84 .S.%......b..5.. 0060 - ab ec f5 2d 93 5c fd 0e-3f 84 12 b0 26 80 86 7f ...-.\..?...&... 0070 - 4e 36 0e dd 75 1a 0b df-3d ed 22 e3 d7 a1 b2 7d N6..u...=."....} 0080 - 2a 50 46 af 37 4a 5a dc-fe 29 64 6e 0d 0a 66 29 *PF.7JZ..)dn..f) 0090 - 62 91 6f 8a 62 16 5d 05-62 36 5c 88 9c 1e b7 cb b.o.b.].b6\..... 00a0 - 35 70 91 c8 80 82 1e fb-34 60 6a a7 50 ce d9 31 5p......4`j.P..1 00b0 - 23 69 e3 04 dc 95 d4 dd-5f 30 27 b3 72 7c eb b2 #i......_0'.r|.. 00c0 - 50 75 68 1b 7e 4d b0 e3-0b 7d 63 d5 f9 7d 44 a4 Puh.~M...}c..}D. 00d0 - 07 24 e6 88 4a c1 4d 62-ff a2 ba bd f3 af fa c1 .$..J.Mb........ 00e0 - f2 d0 ce 46 6b 3c e3 5f-02 1d 52 a4 91 f6 3e 2b ...Fk<._..R...>+ 00f0 - 01 97 0b ef 8f 37 fe 3e-44 c8 a7 c3 73 b4 73 14 .....7.>D...s.s. Start Time: 1640881096 Timeout : 7200 (sec) Verify return code: 0 (ok) Extended master secret: no Max Early Data: 0 --- read R BLOCK
Das sieht insgesamt gut aus. – Daher kommen wir nun zum letzten Schritt:
Schritt 8: Anmelden mit einem FTP Client
Ich bin kein großer Freund von FileZilla seit es dort keine werbefreie Version mehr gibt. Für einen Test nehme ich lieber winscp.
Dort erstellen wir eine neue Sitzung. Hostname, Benutzername und Passwort sind selbsterklärend. Das Übertragungsprotokoll bleibt auf „ftp“ eingestellt, ebenso die Portnummer „21“.
Um TLS zu aktivieren muss in der Box „Verschlüsselung“ der Eintrag „TLS/SSL – explizite Verschlüsselung“ gewählt werden.
Die erste Anmeldevorgang dauert ein wenig länger und man muss einmalig nach der ersten Anmeldung das Zertifikat bestätigen.
Danach kann man als Anwender dann guten Gewissens auf den entfernten ftp-Server zugreifen ohne sich Gedanken über fehlende Sicherheit bzw. Verschlüsselung im Internet zu machen.
- Über den Autor
- Aktuelle Beiträge
Matthias Böhmichen ist der Gründer der Website howto-do.it . Linux nutzt er seit 1991 um kurz danach Windows zu entdecken. Er entdeckt gerne neue Technologien und verbringt seine Zeit damit, sie für Kunden nutzbar zu machen. Im Hauptberuf ist er CEO der Biteno GmbH