Einrichten eines abgesicherten FTP-Servers für Ihre WQHD-Kamera mit Docker

Update: Dieses Tutorial funktioniert sowohl mit Aktiven (PORT Modus) als auch mit Passiven (PASV Modus) Uploads. Wenn Sie ohne arbeiten lesen Sie bitte unser Tutorial Einrichten eines ProFTPD Servers für Ihre 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. Aber natürlich können Sie stattdessen auch Ihren eigenen FTP-Server einrichten. Ich würde empfehlen, ein "vsftpd"-Docker-Image für diese Aufgabe zu erstellen.

Vorbereitung des Docker Images

Beginnen Sie damit, ein Arbeitsverzeichnis und Ihr Dockerfile zu erstellen, z.B. :

mkdir -p /opt/vsftpd/ftpuser && cd /opt/vsftpd
nano Dockerfile

Und fügen Sie den folgenden Inhalt hinzu. Stellen Sie sicher, dass die Ports 20 - 21 sowie 4242 - 4243 an den Server weitergeleitet werden. Wir benötigen diese zusätzlichen Ports für den passiven Modus - setzen Sie pasv_min_port und pasv_max_port entsprechend in der Konfigurationsdatei vsftpd.conf unten.

# Dockerfile for vsftpd on CentOS7
FROM centos:7

MAINTAINER m.polinowski@instar.com

RUN yum -y update; yum -y install which vsftpd net-tools vsftpd-sysvinit; yum clean all

COPY vusers.txt /etc/vsftpd/
RUN db_load -T -t hash -f /etc/vsftpd/vusers.txt /etc/vsftpd/vsftpd-virtual-user.db; rm -v /etc/vsftpd/vusers.txt; \
	chmod 600 /etc/vsftpd/vsftpd-virtual-user.db
COPY vsftpd.conf /etc/vsftpd/
COPY vsftpd.virtual /etc/pam.d/
RUN mkdir -p /home/vftp/ftpuser; chown -R ftp:ftp /home/vftp

EXPOSE 20 21 4242 4243

CMD ["/usr/sbin/vsftpd","-obackground=NO"]

Dieses Dockerfile wird CentOS als Basis-Image nehmen - dies kann durch jede beliebige Variante von Enterprise Linux ersetzt werden. Im nächsten Schritt wird der Dienst "vsftpd" installiert und ein FTP-Benutzerkonto für uns erstellt. Danach müssen wir die folgenden Konfigurationsdateien in das Image kopieren - alle müssen in demselben Verzeichnis erstellt werden, in dem wir unsere Dockerdatei abgelegt haben:

FTP Benutzer Login

vusers.txt

ftpuser
mypassword

Dies ist der Benutzer, den wir für die Verbindung zum FTP-Server verwenden müssen - ändern Sie sowohl den Benutzernamen als auch das Passwort nach Ihren Bedürfnissen.

FTP Benutzer Konfiguration

vsftpd.virtual

#%PAM-1.0
auth       required     pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-user
account    required     pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-user
session    required     pam_loginuid.so

Server Konfiguration

vsftpd.conf

ftpd_banner=Welcome to the INSTAR FTP service.
# Enforce user logins
anonymous_enable=NO
guest_enable=YES
# Local linux users are allowed to log in
local_enable=YES
# Make sure PORT transfer connections originate from port 20
connect_from_port_20=YES
# Enable PASV mode on ports 4242-4243
pasv_enable=YES
pasv_addr_resolve=YES
pasv_min_port=4242
pasv_max_port=4243
virtual_use_local_privs=YES
# FTP users can create, delete, rename and save files
write_enable=YES
# Default umask for local users
local_umask=022
# Add user
pam_service_name=vsftpd.virtual
user_sub_token=$USER
local_root=/home/vftp/$USER
chroot_local_user=YES
allow_writeable_chroot=YES
hide_ids=YES
# Set network interface
listen=YES
listen_ipv6=NO
# Activate logging of uploads/downloads.
xferlog_enable=YES
xferlog_std_format=YES
# log file in standard ftpd xferlog format
xferlog_file=/var/log/vsftpd.log

TLS Verschlüsselung

Ausgehend von der Standardkonfigurationsdatei vsftpd.conf aus dem vorherigen Schritt müssen wir nun ein TLS-Zertifikat zu unserem Server hinzufügen. Wenn Ihr FTP Server auf einem öffentlich zugängigen 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 auch unserer Anleitung folgen, wie Sie Ihr eigenes CA-Zertifikat erstellen. In diesem Tutorial wird gezeigt, wie man ein gültiges CA-Zertifikat für eine lokale Domain (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.

Einen privaten Schlüssel und ein Zertifikat generieren

Beginnen Sie mit der Erstellung eines privaten Schlüssels und eines TLS-Zertifikats mit Openssl. Um einen privaten Schlüssel zu erzeugen, führen Sie bitte den folgenden Befehl aus:

mkdir /opt/vsftpd/tls
openssl genrsa -out /opt/vsftpd/vsftpd.key

Als Nächstes erzeugen Sie mit dem unten stehenden Befehl eine Zertifikatsignierungsanforderung. Während dieses Vorgangs werden Ihnen mehrere Fragen gestellt. Da wir das resultierende Zertifikat nicht überprüfen werden, können Sie die meisten dieser Felder leer lassen. Geben Sie einfach die lokale IP-Adresse Ihres FTP-Servers ein, wenn Sie nach dem FQDN (fully qualified domain name) gefragt werden, z. B. "192.168.2.111":

openssl req -new -key /opt/vsftpd/vsftpd.key -out /opt/vsftpd/vsftpd.csr

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 []:.

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Erzeugen und signieren Sie nun das Zertifikat, das für 397 Tage gültig sein wird (die maximal zulässige Länge = 13 Monate), wie folgt:

openssl x509 -req -days 397 -in /opt/vsftpd/vsftpd.csr -signkey /opt/vsftpd/vsftpd.key -out /opt/vsftpd/vsftpd.pem

Und stellen Sie sicher, dass Docker diese neuen Dateien verwenden kann:

chmod 755 /opt/vsftpd/*

Fügen Sie das Zertifikat und den Schlüssel zu Ihrer Konfigurationsdatei hinzu

vsftpd.conf

ftpd_banner=Welcome to the INSTAR FTP service.
# Enforce user logins
anonymous_enable=NO
guest_enable=YES
# Local linux users are allowed to log in
local_enable=YES
# Make sure PORT transfer connections originate from port 20
connect_from_port_20=YES
# Enable PASV mode on ports 4242-4243
pasv_enable=YES
pasv_addr_resolve=YES
pasv_min_port=4242
pasv_max_port=4243
virtual_use_local_privs=YES
# FTP users can create, delete, rename and save files
write_enable=YES
# Default umask for local users
local_umask=022
# Add user
pam_service_name=vsftpd.virtual
user_sub_token=$USER
local_root=/home/vftp/$USER
chroot_local_user=YES
allow_writeable_chroot=YES
hide_ids=YES
# Set network interface
listen=YES
listen_ipv6=NO
# Add encryption
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.key
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
# Activate logging of uploads/downloads.
xferlog_enable=YES
xferlog_std_format=YES
# log file in standard ftpd xferlog format
xferlog_file=/var/log/vsftpd.log

Kopieren Sie Zertifikat und Schlüssel in Ihr Docker-Image

# Dockerfile for vsftpd on CentOS7
FROM centos:7

MAINTAINER m.polinowski@instar.com

RUN yum -y update; yum -y install which vsftpd net-tools vsftpd-sysvinit; yum clean all

COPY vusers.txt /etc/vsftpd/
RUN db_load -T -t hash -f /etc/vsftpd/vusers.txt /etc/vsftpd/vsftpd-virtual-user.db; rm -v /etc/vsftpd/vusers.txt; \
	chmod 600 /etc/vsftpd/vsftpd-virtual-user.db
COPY vsftpd.conf /etc/vsftpd/
COPY vsftpd.virtual /etc/pam.d/
COPY vsftpd.pem /etc/vsftpd/
COPY vsftpd.key /etc/vsftpd/
RUN mkdir -p /home/vftp/ftpuser; chown -R ftp:ftp /home/vftp

EXPOSE 20 21 4242 4243

CMD ["/usr/sbin/vsftpd","-obackground=NO"]

Starten des Docker-Containers

Bauen des Images

Mit diesen 4 Dateien sind wir nun bereit, unser Docker-Image zu erstellen:

docker build -t vsftpd_tls .

Ausführen des Containers

Stellen Sie sicher, dass das FTP-Benutzerverzeichnis existiert und von Ihrem Docker-Benutzer beschrieben werden kann:

mkdir -p /opt/vsftpd/ftpuser
chmod -R 755 /opt/vsftpd/ftpuser/

Stellen Sie sicher, dass das Home-Verzeichnis /opt/vsftpd/ftpuser auf 755 gesetzt ist, um den FTP-Schreibfehler zu vermeiden ftp 550 Create directory operation failed.

docker run -d \
    --name vsftpd \
    --net=host \
    --privileged \
    --rm \
    -v /opt/vsftpd/ftpuser/:/home/vftp/ftpuser/ \
    vsftpd_tls:latest

Anbinden einer INSTAR IP-Kamera

Sie können jetzt testen ob die Verbindung über TLS möglich ist - z.B. in FileZilla Server:

Set up an FTP Server for your WQHD Camera using Docker

WQHD Kameras

Set up an FTP Server for your WQHD Camera using Docker

Full HD Kameras

Set up an FTP Server for your WQHD Camera using Docker