Edimax Kamera

Anwendungen mit einem Webserver sichern wie z.B. Webkameras

Die Tage kam eine Anfrage wie man zum Beispiel, eine Webcam sicher ans Internet bringt, ohne großartig die eigene Firewall zu durchlöchern. Dies gab mir die Idee gleich mal einen Blogartikel zu schreiben. Der Aufbau wird eigentlich überall bei den großen Firmen mit Webanwendungen, gleich welcher Art, genau so aufgebaut.

Schauen wir unseren Fall etwas genauer an:

Wir haben eine Webcam, die über das Internet erreichbar sein soll mit einem Videostream und einem Standbild für Snapshot Aufnahmen. In unserem Beispiel nehmen wir die unten abgebildete Kamera die eine Pan/Tilt Funktion hat. Dh. die Kamera ist schwenkbar. Nun soll die Funktion für die Bewegung der Kamera aus dem Internet nicht erreichbar sein. Es könnte ja sein, dass Hacker diese Funktion ausnutzen und unsere Kamera dort hin drehen wo wir es nicht haben wollen.

Edimax Kamera
Edimax Kamera

Nun haben wir die Herausforderung dass wenn die Kamera über einen Webbrowser aus dem Internet aufgerufen wird, auch das Setup der Kamera zugänglich ist. Man kann dies sicher mit einem guten Passwort sichern, aber wenn das Passwort geknackt wurde, ist es möglich die Kamera im vollen Umfang zu konfigurieren und zu steuern. Warum stellen wir die Kamera nicht so ins Netz, wo das Setup überhaupt nicht zugänglich ist?

Nun die Kamera hat die URL http://192.168.1.200/setup.asp über die die Kamera konfiguriert wird.
Wie wir sehen, sehen wir zu viele Einstellmöglichkeiten. Die müssen unbedingt ausgeblendet werden.

Jetzt müssen wir ein klein wenig Kamerahacking selbst machen siehe dieser Artikel :

Edimax Kamera mit MQTT steuern über ein Dashboard

Nun müssen wir herausfinden wie die URL’s sind die einen Videostream und einen Bildauschnitt zur Verfügung stellen. Die wären bei dieser Kamera wie folgt:

– Videostream http://192.168.1.200/mjpg/video.mjpg
– Bildausschnitt http://192.168.1.200/jpg/image.jpg

Jetzt wird es etwas trickreich. Ich hab auf meinem Synology NAS-Laufwerk einen Virtuellen Linux Server mit Ubuntu installiert. Auf dem läuft ein Apache Webserver unter Port 80 für HTTP und 443 für HTTPS.
Installiert sind folgende Pakete :

  • apache2/bionic-updates,bionic-security,now 2.4.29-1ubuntu4.6 amd64
  • apache2-bin/bionic-updates,bionic-security,now 2.4.29-1ubuntu4.6 amd64
  • apache2-data/bionic-updates,bionic-updates,bionic-security,bionic-security,now 2.4.29-1ubuntu4.6 all

Wir erstellen eine Datei „webcam.conf“ in Verzeichnis /etc/apache2/site-available

<VirtualHost *:80>
ServerName webcam.ddns.net
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/vhosts/webcam/htdocs

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf

</VirtualHost>

Nun aktivieren wir die Seite :

sudo mkdir -p var/www/vhosts/webcam/htdocs
sudo a2ensite webcam.conf

Nun muss ein DNS-Eintrag für den eigenen Internet Anschluß eingerichtet werden. In meinem Fall ist dies https://my.noip.com/#!/dynamic-dns. Der Service ist kostenpflichtig. Als Beispiel nehmen wir „webcam.ddns.net“. Diese DNS-Eintrag muss in der webcam.conf unter „ServerName“ eingetragen werden. Wie der ServerName bei Dir heißt weiß ich nicht und muss entsprechend ausgewählt und eingetragen werden. Damit bauen wir einen virtuellen Webserver Host auf. Als eingehende Verbindung wird nur einmalig der Port 80 und 443 auf der Fritzbox eingetragen und benötigen in Zukunft keine weiteren Portfreigaben mehr. Jeder neue Zugriff über eine URL oder Domain wird im Webserver als weiterer virtueller Host hinzugefügt.

Er ist sozusagen die Weiche zu verschiedenen web basierende Anwendungen im eigenem lokalen Netzwerk ohne VPN. Ja sicher kann man alles via VPN machen, aber dies ist aufwendig und nicht nötig.

Bitte nach der Einrichtung prüfen mit „ping webcam.<Deine-Domain>“ ob Dein Internetanschluß auch erreichbar ist unter dem Namen wie Du ihn eingerichtet hast.

Nun wird eine Portweiterleitung auf der Fritzbox eingerichtet. Bitte diesen Schritt genau jetzt tun, da sonst der nächste Schritt nicht funktioniert.

Dort den Zielserver auswählen wo der Apache Webserver installiert ist, und 2 Portweiterleitungen einrichten mit Port 80 und 443. Bitte auch Port 80 einrichten sonst funktioniert Letsencrypt nicht.

Installation Letsencrypt auf dem Apache Webserver für Ubuntu 18.04. Andere Distributionen sind hier nachzulesen : https://certbot.eff.org/

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python-certbot-apache 

Installation Webserver Zertifikat. Das Zertifikat wird automatisch installiert und erkannt wenn die Reihenfolge eingehalten wurde und kein Schritt übersprungen wurde.

sudo certbot --apache

Es wird im Verzeichnis „etc/apache2/site-available“ eine Datei „webcam-le-ssl.conf“ nach der Installation des Letsencrypt Zertifikat erstellt. Die Datei muss nun für den Zugriff auf die Webcam angepasst werden.

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName webcam.ddns.net
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/vhosts/webcam/htdocs

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
<Location /video>
  ProxyPass http://192.168.1.200/mjpg/video.mjpg
  ProxyPassReverse http://192.168.1.200//mjpg/video.mjpg
  RewriteEngine on
  RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
</Location>

<Location /jpg>
  ProxyPass http://192.168.1.200/jpg/image.jpg
  ProxyPassReverse http://192.168.1.200/jpg/image.jpg
  RewriteEngine on
  RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
</Location>

SSLCertificateFile /etc/letsencrypt/live/webcam.ddns.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/webcam.ddns.net/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

In diesen Fall schauen wir uns die folgende Einträge genauer an :

Hier wird der Eintrag zum Aufruf der Webcam gemacht und zwar lautet die URL dann:
https://webcam.ddns.net/video und NICHT https://webcam.ddns.net/video/
<Location /video>

Hier wird der Eintrag zur lokalen Webcam IP gemacht mit Pfad zum Video:
ProxyPass http://192.168.1.200/mjpg/video.mjpg
ProxyPassReverse http://192.168.1.200/mjpg/video.mjpg

Hier wird der Eintrag zum Aufruf der Webcam gemacht für das Standbild und zwar lautet die URL dann:
https://webcam.ddns.net/jpg und NICHT https://webcam.ddns.net/jpg/
<Location /jpg

Hier wird der Eintrag zur lokalen Webcam IP gemacht mit dem Pfad zum Snapshot Bild:
ProxyPass http://192.168.1.200/jpg/image.jpg
ProxyPassReverse http://192.168.1.200/jpg/image.jpg

Ein Neustart des Webserver mit „sudo service apache2 restart“ sollte die Konfiguration neu einlesen und damit starten. Nun können weitere Locations hinzugefügt werden, wenn es nötig ist. Außerdem kann jederzeit auch ein neuer virtueller Webserver wie oben beschrieben eingerichtet werden. Zum Beispiel können ein ownCloud oder NetxCloud Server genau so eingerichtet werden. Ein Name für den DNS könnte so lauten: cloud.ddns.net . Es ist eine Erleichterung zum trennen von Diensten und Namensgebungen.

Diese Art von Technik nennt man auch „Reverse Proxy“.
Weitere Infos zu dieser Technik gibt es bei Wikipedia https://de.wikipedia.org/wiki/Reverse_Proxy
Damit kann sogar ein Pseudo Loadbalancer aufgebaut wird, wobei hier der Fachbegriff Loadbalancer technisch gesehen nicht richtig ist, aber zum Verständnis beiträgt.

Für Fragen, Kommentare oder Anmerkungen bitte die Kommentarfunktion hier nutzen oder das Kontaktformular.

Viel Spaß beim basteln und einrichten wünscht Joachim

3 Kommentare

  1. Gute Anleitung! Trotzdem habe ich noch eine Frage. Wenn ich z.B. 2 Kameras mit dem Port 80 habe, kann ich ja dann über den Namen des virtuellen Hosts jede einzeln ansprechen. Muss es dann in die webcam.conf mit hinein? Also der ganze Abschnitt mit den Locations?

  2. Hallo Stefan

    klar geht das , Du musst einfach eine 2te Location eintragen :

    Hier ein Beispiel :


    ProxyPass http://192.168.1.200/mjpg/video.mjpg
    ProxyPassReverse http://192.168.1.200//mjpg/video.mjpg
    RewriteEngine on
    RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]


    ProxyPass http://192.168.1.100/mjpg/video.mjpg
    ProxyPassReverse http://192.168.1.100/mjpg/video.mjpg
    RewriteEngine on
    RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]

    Du musst dann den ProxyPass / ProxyPassReverse mit der zweiten IP-Adresse eintragen bzw. zu beachten.

    Aufrufen tust Du es mit :
    https://webcam.ddns.net/video1/
    https://webcam.ddns.net/video2/

    Grüße , Joachim

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.