Einrichten eines abgesicherten FTP-Servers für Ihre 2k+ (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 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. 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
- TLS Verschlüsselung
- Starten des Docker-Containers
- Anbinden einer INSTAR IP-Kamera
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
auf755
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: