Einrichten eines ProFTPD Servers für Ihre 2k+ (WQHD) Kamera

Q: Ich möchte den FTP-Dienst meiner Kamera nutzen, um Alarmaufzeichnungen und Schnappschussserien auf meinen Linux-Server (Raspberry Pi) hochzuladen.

A: Der einfachste Weg wäre, Ihren Internet-Router als FTP-Server zu verwenden. Wenn Sie einen Linux Server wie z.B. einen Raspberry Pi verwenden möchten, empfehlen wir den sFTP Dienstes anstelle von FTP oder FTPS. Natürlich können Sie stattdessen auch einen eigenen FTP-Server einrichten. Ich würde empfehlen ein vsftpd-Docker-Image für diese Aufgabe zu erstellen.

Oder Sie können die Serversoftware direkt von Ihrer Linux-Konsole aus installieren. Im folgenden Tutorial möchte ich die Schritte zur Einrichtung von ProFTPD mit einem selbstsignierten TLS-Zertifikat und die Verbindung mit einer 2k+ (WQHD)- und Full HD-Kamera durchgehen.

ProFTP auf Debian Linux installieren

apt update && apt upgrade -y
apt install proftpd-basic -y

Wir können nun die Standard-ProFTP-Konfigurationsdatei in /etc/proftpd/proftpd.conf bearbeiten. Alternativ können Sie auch eine eigene Konfigurationsdatei im Verzeichnis /etc/proftpd/conf.d/ erstellen. Damit werden die entsprechenden Regeln der Standardkonfigurationsdatei außer Kraft gesetzt:

nano /etc/proftpd/conf.d/custom.conf

Fügen Sie den folgenden Inhalt zu dieser Konfigurationsdatei hinzu und passen Sie ihn gegebenenfalls an:

# FTP users don't need a valid shell
<Global>
    RequireValidShell off
</Global>

# Disable IPv6 (if wanted)
UseIPv6 off

# Set home directory as root directory for FTP users
DefaultRoot ~

# Allow login only for users of the group "ftpuser"
<Limit LOGIN>
    DenyGroup !ftpuser
</Limit>

# In some cases you have to specify passive ports range to by-pass
# firewall limitations. Ephemeral ports can be used for that, but
# feel free to use a more narrow range.
PassivePorts 4242 4243

Starten Sie den ProFTPD Server neu und überprüfen Sie, ob der Dienst mit Ihrer Konfiguration zufrieden ist:

systemctl restart proftpd

Und wir können auch sicherstellen, dass unsere Firewall - zum Beispiel ufw - den Clients die Verbindung erlaubt:

ufw allow 20:21/tcp
ufw allow 4242:4243/tcp
ufw reload

Hinzufügen des FTP Benutzers

Nun müssen Sie die Gruppe ftpuser erstellen. Verwenden Sie den folgenden Befehl, um die Gruppe zu erstellen:

addgroup ftpuser

Als Nächstes müssen wir den Benutzer anlegen, der sich auf dem FTP-Server anmelden darf:

adduser ipcamera --shell /bin/false --home /home/ipcamera
passwd ipcamera

Fügen Sie den soeben erstellten FTP-Benutzer zur Gruppe ipcamera hinzu, damit sich dieser Benutzer am FTP-Server anmelden kann:

adduser ipcamera ftpuser

Testen der Anmeldung mit Filezilla (optional)

Wenn Sie den Filezilla-Client zur Hand haben, können Sie ihn nun verwenden, um sich mit dem neuen ftpuser und der lokalen IP Ihres Servers zu verbinden:

Set ProFTP Server for your 2k+ (WQHD) Camera

Da wir den PASV-Portbereich auf 4242 - 4243 beschränkt und sichergestellt haben, dass unsere Firewall uns Zugang zu diesen Ports gewährt, können wir nun entweder den aktiven (PORT) oder den passiven (PASV) Modus für die Verbindung verwenden:

Set ProFTP Server for your 2k+ (WQHD) Camera

Sie sollten in der Lage sein, eine Verbindung herzustellen und Gegenstände hochzuladen/zu erstellen.

TLS-Verschlüsselung einrichten

Das FTP-Protokoll überträgt sowohl Anmeldeinformationen als auch gesendete Daten im Klartext. Die gängigste Lösung ist die Verschlüsselung über TLS, die mit minimalem Aufwand mit der kostenlosen Software OpenSSL eingerichtet werden kann.

apt install openssl

Wir können nun die TLS Konfiguration zu unserer benutzerdefinierten Konfigurationsdatei custom.conf aus dem vorherigen Schritt hinzufügen und müssen ein TLS-Zertifikat für unseren Server erstellen. Wenn Ihr Server auf einem öffentlichen Server läuft, können Sie einen Dienst wie Let's Encrypt / Certbot verwenden, um ein gültiges Zertifikat für den Domainnamen Ihres Servers zu generieren. Sie können dieses Zertifikat sowohl für Ihren Web- als auch für Ihren FTP-Server verwenden. Andernfalls können Sie unsere Anleitung zur Erstellung eines eigenen CA-Zertifikats befolgen. In diesem Tutorial wird gezeigt, wie man ein gültiges CA-Zertifikat für eine lokale Domäne (die von einem AVM Fritzbox Home Internet Router bereitgestellt wird) erzeugt und mit einem externen MQTT-Broker einsetzt. Das gleiche Zertifikat kann auch hier verwendet werden.

In den folgenden Schritten werden wir jedoch einfach ein selbstsigniertes Zertifikat erstellen, das mit einer lokalen IP-Adresse (anstelle eines Domänennamens) verwendet werden kann. Das bedeutet natürlich, dass wir den "unsicheren" Modus im FTP-Client unserer Kamera aktivieren müssen. Dies bedeutet nicht, dass die Verschlüsselung schwächer ist, aber die Kamera wird nicht versuchen zu überprüfen, ob Ihr persönlicher FTP-Server wirklich der Server ist, für den das TLS-Zertifikat ausgestellt wurde.

Zertifikat und Schlüssel generieren

Erstellen Sie zunächst ein Verzeichnis für Ihr Zertifikat mkdir /etc/proftpd/ssl und führen Sie dann den folgenden Befehl aus, um den Schlüssel und das Zertifikat mit einer Lebensdauer von 1 Jahr zu erzeugen:

openssl req -new -x509 -days 365 -nodes -out /etc/proftpd/ssl/proftpd.cert.pem -keyout /etc/proftpd/ssl/proftpd.key.pem

Da wir nicht vorhaben, dieses Zertifikat zu verifizieren, können Sie alle Antworten bis auf den FQDN leer lassen - hier können Sie die lokale IP Ihres FTP-Servers angeben, z. B. "192.168.2.111":

Generating a RSA private key
..........................................................+++++
...................................................+++++
writing new private key to '/etc/proftpd/ssl/proftpd.key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:.
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (e.g. server FQDN or YOUR name) []:192.168.2.111
Email Address []:.

ProFTPD Konfigurieren

Erstellen Sie nun eine Konfigurationsdatei, um das Modul mod_tls in proFTPD zu konfigurieren /etc/proftpd/conf.d/tls.conf:

<IfModule mod_tls.c>
    TLSEngine on
    TLSLog /var/log/proftpd/tls.log
    TLSProtocol TLSv1.2 TLSv1.3
    TLSRSACertificateFile /etc/proftpd/ssl/proftpd.cert.pem
    TLSRSACertificateKeyFile /etc/proftpd/ssl/proftpd.key.pem
    TLSVerifyClient off
    TLSOptions NoSessionReuseRequired
    TLSRequired on
</IfModule>

Hinweis: INSTAR Full HD-Kameras benötigen TLSv1.2, während INSTAR 2k+ (WQHD)-Kameras das neuere TLSv1.3 verwenden. Sie können die TLSv1.2-Konfiguration entfernen, wenn Sie nur mit 2k+ (WQHD)-Kameras arbeiten.

Stellen Sie nun sicher, dass das TLS-Modul tatsächlich aktiv ist:

nano /etc/proftpd/modules.conf

Stellen Sie sicher, dass die folgenden Zeilen aktiv sind:

# 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

Und starten Sie den proFTPD-Dienst neu:

service proftpd restart
service proftpd status

Testen der Anmeldung mit Filezilla (optional)

Zuvor haben wir Filezilla Client für den Zugriff auf unseren FTP-Server verwendet, und das Fillezilla-Protokoll zeigt an, dass keine Verschlüsselung für die Verbindung zu Ihrem Server verwendet wurde:

Status:	Connecting to 192.168.2.111:21...
Status:	Connection established, waiting for welcome message...
Status:	Insecure server, it does not support FTP over TLS.
Status:	Logged in
Status:	Retrieving directory listing of "/"...
Status:	Directory listing of "/" successful

Diesmal werden Sie von einem Pop-up-Fenster begrüßt, das Sie auffordert, Ihr eigenes Zertifikat zu überprüfen - Sie können die Option aktivieren, diesem Zertifikat in Zukunft immer zu vertrauen:

Set ProFTP Server for your 2k+ (WQHD) Camera

Und das Protokoll zeigt Ihnen, dass die Verbindung jetzt sicher ist!

Status:	Connecting to 192.168.2.111:21...
Status:	Connection established, waiting for welcome message...
Status:	Initializing TLS...
Status:	TLS connection established.
Status:	Logged in
Status:	Retrieving directory listing of "/"...
Status:	Directory listing of "/" successful

INSTAR IP Kamera verbinden

Wir können nun eine Verbindung zu unserem Server mit TLS-Verschlüsselung herstellen:

WQHD Kameras

Stellen Sie sicher, dass Sie für Ihre 2k+ (WQHD)-Kamera die Option "unsicher" auswählen, um den Schritt der Zertifikatsüberprüfung beim Verbinden zu überspringen:

Set up an FTP Server for your 2k+ (WQHD) Camera using Docker

Wenn Sie das TLS-Protokoll /var/log/proftpd/tls.log überprüfen, werden Sie sehen, dass Ihre Kamera sich mit TLSv1.3 verbindet:

2022-05-26 14:34:05,088 mod_tls/2.9[13571]: SSL/TLS-P requested, starting TLS handshake
2022-05-26 14:34:05,100 mod_tls/2.9[13571]: client supports secure renegotiations
2022-05-26 14:34:05,100 mod_tls/2.9[13571]: TLSv1.3 connection accepted, using cipher TLS_AES_256_GCM_SHA384 (256 bits)
2022-05-26 14:34:05,149 mod_tls/2.9[13571]: Protection set to Private
2022-05-26 14:34:05,160 mod_tls/2.9[13571]: TLSv1.3 data connection accepted, using cipher TLS_AES_256_GCM_SHA384 (256 bits, resumed session)

Full HD Kameras

Stellen Sie sicher, dass Sie für Ihre Full HD-Kamera die Option "SSL" auswählen:

Set up an FTP Server for your 2k+ (WQHD) Camera using Docker

Wenn Sie das TLS-Protokoll /var/log/proftpd/tls.log überprüfen, werden Sie sehen, dass Ihre Kamera eine Verbindung mit TLSv1.2 herstellt:

2022-05-26 14:36:31,743 mod_tls/2.9[13644]: TLS/TLS-C requested, starting TLS handshake
2022-05-26 14:36:31,789 mod_tls/2.9[13644]: client supports secure renegotiations
2022-05-26 14:36:31,789 mod_tls/2.9[13644]: TLSv1.2 connection accepted, using cipher ECDHE-RSA-AES256-GCM-SHA384 (256 bits)
2022-05-26 14:36:31,887 mod_tls/2.9[13644]: Protection set to Private
2022-05-26 14:36:31,943 mod_tls/2.9[13644]: TLSv1.2 data connection accepted, using cipher ECDHE-RSA-AES256-GCM-SHA384 (256 bits)