18.5.2025 - Reverse Tunnel

Ein Reverse Tunnel dient dazu, eine SSH-Verbindung vom Server zum Client aufzubauen, also umgekehrt, als man das normalerweise tut. Das ist nützlich, wenn der Server von aussen nicht direkt erreichbar ist, und darum selber die Verbindung initiieren muss.

Beispiel 1

Nehmen wir an, ich habe einen Heim-Server, der gut geschützt hinter einer Firewall sitzt. Ich möchte aber dennoch eine Möglichkeit, eine SSH-Verbindung zu ihm aufzubauen. Dazu benötige ich einen im Internet erreichbaren Computer als Proxy.

Ich habe also

  • Meinen Heimserver, dessen IP.-Adresse ich nicht kenne, und der sowieso nicht von aussen erreichbar ist, und der auf port 22 einen SSH-Server laufen hat.
  • Meinen Proxy, der unter https://mein.computer.irgendwo erreichbar ist, und der nichts von meinem Heimserver “weiss”.

Ziel: Ich möchte mit ssh -i schlüssel -p 1999 mein.computer.irgendwo indirekt auf heimserver:22 kommen.

Vorgehen:

  • Ich erstelle ein SSH-Schlüsselpaar, um den Zugriff möglichst sicher zu gestalten.
  • Dann sorge ich dafür, dass der Proxy auf port 12445 erreichbar ist, zum Beispiel mit einer Portweiterleitung auf dem Router von 12445 auf Port 22 (SSH) des Proxy-Computers. Eine zweite Portweiterleitung mache ich von 1999 auf 1999 des Porxy-Computers.
  • Und kopiere den öffentlichen Schlüssel des vorhin erstellten Schlüsselbars auf den Proxy: ssh-copy-id -i <public key> -p 12445 ich@mein.computer.irgendwo.
  • Schliesslich schalte ich in der ssh-konfigurationsdatei des Proxy die passwor-authentication aus, so dass er immer den Schlüssel verlang.

Soweit die Vorarbeiten. Den Tunnel erstellt man dann so (auf dem Heimserver eingeben):

ssh -p 12445 -i <private key> -R 1999:localhost:22 ich@mein.computer.irgendwo

Wenn man dann irgendwo im Internet `ssh -p 1999 -i ich@mein.computer.irgendwo' eingibt, dann landet man direkt auf Port 22 des Heimservers.

Beispiel 2

Nehmen wir an, Sie möchten, dass die Web-Oberfläche Ihres Heimservers auch von aussen erreichbar ist, zum Beispiel wenn Sie im Urlaub sind. Leider sieht Ihr Internet-Provider keine Möglichkeit vor, Ihren Router von aussen zu erreichen. Sie müssen sich also mit einem Reverse-Tunnel zu einem Proxy-Computer verbinden, der vopm Internet aus erreichbar ist. So einen (virtuellen) Computer können Sie bei vielen Providern günstig mieten, die einzige Bedingung für unsere ZWecke ist, dass Sie Shell-Zugriff haben. Dann brauchen Sie eine Domain (wie www.pseudoproxy.irgendwo), die Sie auf den Mietserver zeigen lassen (Kann meist beim selben Provider gebucht werden, wie der webspace).

Wir wollen also, dass ein Zugriff auf http://www.pseudoproxy.irgendwo umgeleitet wird auf den Heimserver, dessen IP-Adresse mnicht bekannt ist.

Vorgehen:

  • Richten Sie den Shell-Zugriff auf dem Mietserver ein, idealerweise mit einem SSH-Schlüsselpaar wie oben gezeigt.
  • Geben Sie auf Ihrem Heimserver ein: ssh -fN -R 80:localhost:80 ich@pseudoproxy.irgendwo

Allgemeine Erwägungen

  • Der SSH-Zugriff sollte wenn immer möglich nicht über Passwörter, sondern über Schlüsselpaare geschehen.
  • SSH-Server neigen dazu, die Verbindung ab und zu abzubrechen. Es empfiehlt sich daher, die Tunnelerstellung in ein watchdog-Skript einzubauen, etwa so:
#!/bin/bash

# Set the ports to check on the remote server
REMOTE_PORT=21234
LOCAL_PORT=2456
REMOTE_CONFIG=myserver
REMOTE_URL=my.server.url

# Check if the remote port is reachable
nc -z "$REMOTE_URL" "$REMOTE_PORT" > /dev/null 2>&1

if [ $? -eq 0 ]; then
    echo "Remote port $REMOTE_PORT is reachable at `date`" >>tunnel.log
else
    echo "Remote port $REMOTE_PORT is unreachable at `date`" >>tunnel.log
    # Attempt to create a new tunnel
    ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -R "$REMOTE_PORT":localhost:$LOCAL_PORT $REMOTE_CONFIG -fN &
    if [[ $? -eq 0 ]]; then
        echo "New tunnel created successfully at `date`" >>tunnel.log
    else
        echo "Error creating new tunnel: $? at `date`" >>tunnel.log
    fi
fi

Und dieses Watchdog-Skript über einen Cronjob zum Beispiel halbstündlich laufen zu lassen.

18.5.2025 - Der eigene Web- und App-Server

Eine Website zu publizieren, ist einfach: Es gibt viele Anbieter, die entsprechende Hosting-Angebote für wenig Geld bereitstellen, und oft auch verschiedenene Hilfen zum Erstellen der Seiten anbieten. Wenn man allerdings eine grössere Anzahl von unabhängigen Sites hosten möchte, braucht man entweder mehrere Anbieter, oder ein “stärkeres” Angebot, welches mehrere Domains mit mehreren Urls erlaubt. Noch schwieriger wird es, wenn man WebApps hosten möchte, zum Beispiel eine eigene Cloud mit OwnCloud oder Nextcloud, oder eigene NodeJS-Apps. Dann braucht man einen Hoster, der es erlaubt, NodeJS und/oder Docker laufen zu lassen, und der genügend Speicher bereitstellt. Da wird die Luft schon dünner, und immer wieder stösst man auf unerwartete Beschränkungen und recht hohe Kosten.

Nun haben ja die meisten von uns inzwischen eine recht leistungsfähige Internet-Anbindung, die mit dem Datenaufkommen einer Familie oder eines Vereins ohne Weiteres fertig würde. Was liegt also näher, als die zu hostenden Dienste auf einem eigenen Computer bereitzustellen? Dann ist es kein Problem mehr, ein Terabyte oder mehr “cloud”- Speicher und beliebig viele Websites und Webapps anzubieten.

Allerdings sei gleich ein ernstes Wort vorweg gesprochen: Eine Zugriffsmöglichkeit von aussen ist auch eine Angriffsmöglichkeit von aussen. Wenn Sie Dienste anbieten wollen, sollten Sie diese Dienste auf einem Computer laufen lassen, der keine anderen Computer in Ihrem Netzwerk erreichen kann.

Der Internet-Anschluss

Es gibt Anbieter, die den Zugriff von aussen ohne Weiteres zulassen, und es gibt solche, die das nicht tun. Welchen Typ Sie haben, können Sie so herausfinden:

  • besuchen Sie die Seite https://www.whatismyip.com/. Diese Seite zeigt Ihnen an, unter welcher IP-Adresse Sie aktuell im Internet eingebucht sind.
  • Öffnen Sie ein Terminal und geben Sie dort ein: ping <IP-Adresse>. Wenn irgendeine Antwort kommt, dann ist Ihr Router grundsätzlich erreichbar. Wenn Ping keine Antwort liefert, müssen Sie sich mit einem Reverse-Tunnel behelfen.

Als nächstes müssen Sie sicherstellen, dass Ihr Server oder Proxy überhaupt gefunden werden kann. Dazu benötigen Sie einen sogenannten DNS-Eintrag, der aus einem Namen wie www.meinserver.irgendwo eine IP-Adresse wie 14.145.28.10 macht. Wenn Sie den Proxy samt Domain bei einem Internet-Provider gemietet haben, ist dieser Schritt bereits erledigt. Andernfalls müssen Sie einen dynamischen DNS Eintrag erstellen, der auch dann, wenn Ihre IP vom Provider gewechselt wird, immer angepasst wird. Die meisten aktuellen Router sind in der Lage, ohne spezielle Konfiguration mit verschiedenen DynDNS-Providern zusammenzuarbeiten (Schauen Sie im Menü Ihres Routers nach, hier zum Beispiel das Vorgehen bei Fritz!Boxen)

Der Server

Was für einen Computer benötigen Sie als Server für, sagen wir, 5 Websites, eine NodeJS-App und einen Docker-Container mit NextCloud? Verblüffend wenig: Ein Raspberri Pi 4 mit 4GB Ram genügt. Wie oben gesagt soll der Computer möglichst keine Verbindung zu Ihrem restlichen Netz haben. Manche Router und Switches gestatten es, für solche Zwecke, eine sogenannte “Demilitarisierte Zone” (DMZ) einzurichten, die logisch vom restlichen LAN völlig getrennt ist. Wenn das nicht geht, sorgen Sie zumindest dafür, dass auf dem Server keinerlei Daten gespeichert sind, die den Zugriff auf andere Computer ermöglichen, und dass alles im Netz passwortgeschützt ist. Und natürlich soll der Server zu nichts anderem, als zum Ausliefern der Websites dienen. Er soll auf keinen Fall noch nebenher als Heimserver, Smarthome-Hub oder Bürocomputer dienen. Wenn er gekapert wird, dann soll der ANgreifer nichts anderes als diesen Computer zerstören können. Und den können sie ja leicht wieder aufsetzen (Wenn Sie für regelmässige Backups sorgen).

Setzen Sie den Raspberry auf, am besten mit einem minimalen OS. (Serverdienste brauchen kein UI). Wenn Ihr Router von aussen erreichbar ist, müssen Sie eine Portweiterleitung auf den Server einrichten, wenn nicht, auf dem Server einen Reverse Tunnel zu einem externen Proxy aufbauen.

Der Verteiler

Angenommen, Sie haben 5 Websites, eine NodeJS-App und einen Nextcloud-Container laufen. Woher weiss der Server denn, welche Seite er einem Besucher ausgeben soll? Dafür richten wir einen Reverse Proxy auf dem Server (oder einem anderen Computer) ein. Das ist nicht zu verwechseln mit dem Reverse Tunnel, über den wir weiter oben gesprochen haben. Der Reverse Proxy entnimmt dem Header jeder Anfrage die Information, welcher Dienst gemeint war, und sendet sie zum entsprechenden “virtuellen Server” weiter.

Nun nehmen wir mal an, wir haben die Webseiten “meine-familie.ch”, “mein-verein.ch”, den Webservice “agenda.meine-familie.ch” und den Clouddienst “cloud.meine-familie.ch”

Dann benötigen wir folgende Konfigurationen in /etc/apache2/

1: Definition für den nextcloud-Container, der auf Port 8082 erreichbar ist: /etc/apache2/sites-available/cloud.conf: (Der Dateiname ist egal)

<VirtualHost *:80>
	ServerName cloud.meine-familie.ch
	ProxyPreserveHost On
	ProxyPass / http://localhost:8082/
	ProxyPassReverse / http://localhost:8082/
</VirtualHost>

Hier leiten wir Anfragen für cloud.meine-familie.ch auf Port 80 auf einen Serverprozess um, der auf demselben Server auf Port 8082 läuft. Man könnte ohne Weiteres statt localhost auch einen anderen im gleichen Netz erreichbaren Computer einsetzen. Eine solche Konfiguration kann zum Beispiel unabhängige Docker-Applikationen, oder eigenständige Web-Apps ansteuern.

2: Definitionen für die Website ‘meine-familie.ch’ und ‘mein-verein.ch’ /etc/apache2/sites-available/familienseite.conf

<VirtualHost *:80>
        ServerName meine-familie.ch
        ServerAlias www.meine-familie.ch
        DocumentRoot "/var/www/family/http"
        CustomLog /var/www/family/log/access.log combined
</VirtualHost>

/etc/apache2/sites-available/vereinsseite.conf

<VirtualHost *:80>
        ServerName mein-verein.ch
        ServerAlias www.mein-verein.ch
        DocumentRoot "/var/www/verein/http"
        CustomLog /var/www/verein/log/access.log combined
</VirtualHost>

Hier bedient der Apache Server die Anfragen selbst. Wir sagen ihm nur, in welchem Verzeichnis er die Dateien finden kann, die er ausliefern soll, und in welches Verzeichnis er seine Logdateien schreiben soll. Im Verzeichnis /var/www/family/http sollte mindestens eine index.html - Datei zu finden sein, damit die Seite funktioniert. Diese Konfiguration würde auf http://meine-familie.ch und auch auf http://www.meine-familie.ch reagieren (Wegen der ServerAlias-Direktive)

Die anderen benötigten Sites können Sie analog definieren.

Im Moment sind unsere Konfigurationen aber noch nicht aktiv. Wir aktivieren sie mit

sudo a2ensite cloud familienseite vereinsseite
sudo systemctl reload apache2

Das tut eigentlich nichts anderes, als entsprechende Symlinks von sites-available in sites-enabled zu erstellen. Um eine Seite wieder zu deaktivieren, können Sie a2dissite <konfiguration> eingeben und danach mit systemctl reload apache2 die Änderung scharf stellen.

Wie kommt nun die Anfrage eines externen Browsers auf diese Seite?

  1. Der User will zu http://meine-familie.ch navigieren.
  2. Der Browser fragt beim DNS-Server nach der Adresse.
  3. Der DNS-Server fragt beim Registrar der Domain meine-Familie.ch nach dem zuständigen Nameserver
  4. Der Nameserver kann z.B. ein DynDNS-Server sein, der von unserem Router die aktuelle IP erhalten hat. Oder, bei einer fixen Adresse, kann er direkt die IP ausgeben.
  5. Der Browser steuert diese IP auf Port 80 an (Das ist der Standard-Port für HTTP). Dort wartet der Router unseres Internetzugangs
  6. Der Router hat eine Portweiterleitung für Port 80 und Port 443 (dazu kommen wir später) auf unseren Heimserver.
  7. Dort wartet der Apache Webserver und schaut im Header der Anfrage nach, welchen von den verschiedenen Hosts, die er verwaltet, der Browser eigentlich haben wollte.
  8. Wenn er ihn findet, sendet er die Anfrage weiter und gibt dessen Antwort zurück. Wenn nicht, liefert er eine “Nicht gefunden” Antwort.

Damit sind wir fast am Ende dieses Kurses. Aber mehr als nur ein Schönheitsfehler ist es heutzutage, eine Seite per http erreichbar zu machen. Standard ist die verschlüsselte Kommunikation via https bzw. SSL Dabei funktioniert praktisch alles gleich, nur dass der Port 443 statt 80 angesteuert wird, und die Kommunikation über ein Verfahren stattfindet, das einerseits die Identität des Servers sicherstellt und andererseits alle übermittelten Daten verschlüsselt.

SSL war früher eine teure Sache, weil man eine Firma brauchte, die prüfte, dass man der ist, der eine Seite rechtmässig betrieb, und dies mit einem Zertifikat des öffentlichen Schlüssels bestätigte. Eine ausführlichere Erläuterung zu SSL/HTTPS und Zertifikaten finden Sie hier.

Heute ist alles ein wenig einfacher geworden: Es gibt jetzt Letsencrypt. Das ist ein kostenloser Dienst, der Schlüssel für Webseiten zertifiziert, nachdem er sich beweisen lässt, dass der Antragssteller den Inhalt der Seite oder des Name-Servers manipulieren kann. Solche Tests sind automatisierbar. Alles was man dazu braucht, ist der Certbot

sudo apt install certbot

und dann:

certbot --apache

Certbot zeigt dann alle Sites an, die er in der laufenden Apache-Konfiguration finden kann, und Sie brauchen bloss anzugeben, welche Sie absichern wollen.

Wenn alles gut geht, schreibt der certbot eine neue Konfiguration wie z.B. /etc/apache2/sites-available/familienseite-le-ssl.conf und verändert die bestehende Konfiguration familienseite.conf so, dass Anfragen über http:// direkt auf https:// umgeleitet werden.

Wenn Sie sich jetzt wieder mit Ihrer Seite verbinden, werden Sie sehen, dass der Browser ein Schloss neben der Adresse anzeigt, und wenn Sie dieses Schloss anklicken, können Sie das Zertifikat ansehen, das Letsencrypt ausgestellt hat.

Diese Zertifikate sind immer nur drei Monate gültig, aber certbot kümmert sich selber darum, sie jeweils rechtzeitig zu erneuern. Nur wenn Sie eine weitere Site erstellen, müssen Sie certbot wieder manuell bemühen.

Auf diese Weise können Sie im Grunde beliebig viele Serverdienste selber bereitstellen. Die einzige fremde und Hilfe, die Sie dazu brauchen, ist ein DynDNS-Dienst. der Ihren Server auffindbar macht.

12.10.2023 - Backup

Grundlagen

Datensicherung ist nie überflüssig. Jede Computer-Festplatte wird irgendwann defekt sein. Leider weiss man nicht wann. Die Ausfallrate ist am Anfang relativ hoch (wegen Produktionsfehlern), sinkt dann auf sehr geringe Werte ab und steigt ab etwa dem dritten Jahr wieder an. Die Datenspeicherungs-Firma Backblaze gibt regelmässig Lebensdauerwerte ihrer derzeit rund 100000 Festplatten an: https://www.backblaze.com/blog/2018-hard-drive-failure-rates/. Die durchschnittliche jährliche Ausfallrate wird mit rund 1.7% errechnet, wobei die Firma ihre Platten jeweils nach etwa 4 Jahren austauscht.

Bei SSDs gibt es naturgemäss noch weniger Daten, als bei magnetischen Festplatten, aber es ist bekannt, dass jede SSD-Speicherzelle nur eine limitierte Zahl von Schreibvorgängen aushält (die allerdings immerhin wesentlich grösser ist, als früher angenommen).

Wie auch immer: Das Prinzip Hoffnung ist verkehrt, wenn es um wichtige Daten geht. Und es nützt auch nicht viel, ein RAID statt einer einzelnen Platte zu verwenden. Einige Überlegungen dazu habe ich hier zusammengefasst.

Bevor wir uns für ein Datensicherungskonzept entscheiden, brauchen wir einen Anforderungskatalog:

Das Backup-System muss folgende Eingenschaften haben:

  • Vom Hauptsystem unabhängig - Wir müssen ja auf die Daten auch dann zugreifen können, wenn nicht nur die Platte, sondern der ganze Server ausfällt.

  • Versioniert - Wir brauchen nicht nur den momentanen Stand, sondern auch einige ältere Versionen. Stellen Sie sich vor, ein Erpressungs-Trojaner oder ein Hardware-Defekt oder eine Fehlbedienung zerstört einen Teil Ihrer Daten, und Sie merken das erst nach dem Backup - Ein einzelnes Backup wäre dann auch gleich zerstört. Dann muss es die Möglichkeit geben, eine ältere Version einzuspielen.

  • Verschlüsselt - In der Datensicherung sind exakt dieselben Daten, wie im Hauptsystem, und diese müssen genauso sicher gegen unerlaubten Zugriff gesichert sein.

  • Automatisierbar - Wenn Sie dran denken müssen, ein Backup anzufertigen, dann werden Sie es manchmal vergessen. Und Murphy’s law garantiert, dass der Server genau dann kaputt geht, wenn das letzte Backup länger als zwei Wochen her ist.

  • Wiederherstellbar - Das ist natürlich eine Binsenweisheit. Was nützt ein Backup, das nicht wiederhersgestellt werden kann? Leider ist es durchaus nicht selbstverständlich. Backups laufen ja, wie oben betont, idealerweise automatisch ab, zum Beispiel mit einem nächtlichen Hintergrund-Job. Je nachdem passiert dabei ein Fehler und niemand sieht die Fehlermeldung… Und wenn Sie an den Punkt Verschlüsselung denken: Sie müssen sicher sein, dass die Verschlüsselung auch wieder entschlüsselt werden kann. Dazu gehört, dass Sie ein Programm benötigen, das den angewendeten Algorithmus beherrscht, und Sie müssen sich auch nach 10 Jahren noch an das verwendete Passwort erinnern. Und last but not least müssen auch die verwendeten Speichermedien mit dem Computer, den Sie in 10 Jahren benutzen werden, noch lesbar sein. Auch das ist nicht so selbstverständlich, wie man meinen könnte: Wenn Sie vor 20 Jahren Ihre Daten auf den damals weit verbreiteten Floppy Disks gespeichert haben, dann werden Sie heute echte Probleme haben, an diese Daten wieder heranzukommen. Und zwar sogar dann, wenn Sie auch ein Laufwerk für solche Floppy Disks aufbewahrt haben: Sie werden es an Ihren heutigen PC nicht anschliessen können. Und wenn Sie Ihre Datensicherung auf CDs oder DVDs speichern, dann ist die Gefahr nicht vernachlässigbar, dass diese wegen Alterung des Trägermaterials nach 10 Jahren nicht mehr vollständig lesbar sind. Dasselbe gilt für magnetische Platten, wo das entsprechender Altzerungsproblem “Bitfäule” genannt wird. Einzelne kaputte Bits sind bei normalen Dateien nicht schlimm - Ein Text ist immer noch lesbar, wenn das eine oder andere X zu einem U wurde. Bei verschlüsselten Dateien aber ist alles verloren, wenn auch nur ein einziges Bit kippt. Denn dann “passt” der Schlüssel nicht mehr.

Backup-Konzepte

Plattenrotation

Eine tragbare Festplatte nimmt jeweils ein Backup auf und wird dann gegen eine andere identische Platte ausgetauscht. Wenn man beispielsweise fünf solcher Platten verwendet, kann man an jedem Arbeitstag eine andere einsetzen, und auf jeder vielleicht 10 Datensicherungs-Generationen speichern, die dann jeweils eine Woche auseinander liegen. Damit wird der Verlust jeder einzelnen Platte oder sogar mehrere Platten verschmerzbar. Idealerweise lagern Sie die Platten auch an verschiedenen Orten, so dass auch bei einem Einbruch oder Brand nicht alles verloren ist.

  • Vorteil: Dadurch, dass Sie jede Platte immer wieder verwenden, ist sichergestellt, dass sie funktionieren. Trotzdem möchten Sie sie vielleicht nach etwa 5 Jahren auswechseln, wenn das Risiko eines Ausfalls grösser wird.

  • Nachteil: Man muss doch wieder an etwas denken… Wenn man vergisst, die Platten auszutauschen, baut man ein “Klumpenrisiko” mit der gerade angeschlossenen Platte auf, und gemäss Murphy werden Sie erst merken, dass diese Platte kaputt ist, wenn auch Ihre Server-Festplatte aussteigt, und Sie ein möglichst aktuelles Backup benötigen.

Fernbackup

Sie können Ihre Daten mit einem geeigneten Programm auf einen oder mehrere andere Computer sichern. Dies kann man genauso leicht automatisieren, wie die Sicherung auf eine externe Festplatte.

  • Vorteil: Keine zusätzliche Hardware am Praxis-System, man muss nicht an Plattentausch etc. denken.

  • Nachteil: Das Backup wird viel länger dauern, da das Netzwerk langsamer ist, als eine angeschlossene Fewstplatte. Weiterer Nachteil: Murphy wird dafür sorgen, dass der Internetzugang just dann schnarchlangsam oder ganz ausgefallen ist, wenn Sie Ihr Backup dringend zurückspielen wollen.

Cloud-Backup

Statt auf einen eigenen Server können Sie die Daten auch in einer Cloud speichern. Das ist seitens des Backup-Systems kein Unterschied.

  • Vorteil: Sie müssen sich nicht um Aufbau und Unterhalt des Backup-Servers kümmern. Die Cloud Anbieter garantieren eine sehr hohe Verfügbarkeit und Datensicherheit.

  • Nachteile: Die Daten sind für den Cloud-Anbieter sichtbar. Sie müssen sie also unbediungt vor der Übertragung verschlüsseln. Ok, das müssen Sie eigentlich sowieso tun. Weiterer Nachteil: Sie sind darauf angewiesen, dass es den Cloud-Anbieter in 10 Jahren noch gibt, und dass Sie noch Zugang darauf haben. Und last but not least: Die Datensicherung wird hier etwas kosten. Allerdings meist wesentlich weniger, als ein eigener Server oder auch nur eine Backup-Festplatte kosten würde.

Selbstverständlich können Sie anstelle der Cloud eines professionellen Anbieters auch eine eigene Cloud aufbauen, damit wird die Cloud-Speicherung zu einer Variante des weiter oben erwähnten Fernbackup.

Backup-Anwendungen

Für welches der oben genannten Backup-Konzepte Sie sich entscheiden, hängt zu sehr von Ihrem individuellen System ab, als dass man allgemeingültige Empfehlungen abgeben könnte.

Ich selbst bevorzuge ein dreistufiges Konzept:

  • Stufe 1: Plattenrotation und Fernbackup. Ich wechsle zwischen Wechselplatten und der Speicherung auf externe Computer ab. Als Backup-Programm verwende ich rsync und restic. Die Steuerung wird von einem Cron-Job erledigt, der nachts aktiv wird.

  • Stufe 2: Cloud Backup. Aus praktischen Gründen verwende ich hier Amazon S3. Das ist ziemlich günstig (etwa 30 US-cent pro GB und Jahr) und kann von meinem ohnehin benutzen Backup-Tool restic direkt genutzt werden. Aber natürlih kann man ebenso gut andere Anbieter bevorzugen, etwa Google Cloud Storage, Microsoft Azure Storage oder andere.

  • Stufe 3: “Cold Backup”. Daten, die ich voraussichtlich länger nicht oder nie mehr brauche, kommen in den Amazon Glacier. Das ist noch billiger als S3 (weniger als 5 US-cent pro GB und Jahr), hat aber den Nachteil, dass das Zurückholen der Daten erstens einige Zeit dauern kann (Stunden bis Tage), und dass es etwas kostet, die Daten wieder zu holen (Derzeit je nach gewünschter Geschwindigkeit etwa 0.5-3 cent pro GB). Wenn man die Daten ausnahmsweise doch mal sehr schnell benötigt, muss man zusätzlich 100 Dollar für die Express-Bereitstellung bezahlen.

Zusammenfassung

Der Aufbau eines Backup-Konzeptes ist einer der wichtigsten Punkte beim Design Ihres Computersystems, sofern Sie damit mehr als nur spielen wollen. Es gibt natürlich wie üblich viele Möglichkeiten, darunter auch Programme, die mit einer minimalen Konfiguration alles selbsttätig erledigen. Allerdings sind bei solchen System die Backups manchmal auch nur mit denselben Systemen lesbar, und die Prozesse manchmal etwas undurchsichtig. Im Prinzip kann man ohne Weiteres alles “von Hand” machen. Als Ausgangs- oder Anhaltspunkt zeige ich Ihnen hier einige Backup-Skripte für einen Linux-Server, die man z.B. mit einem cronjob laufen lassen kann:

Stufe 1 Backup

alle relevanten Datenbanken und Verzeichnisse sichern

#! /bin/bash

echo `date` begin /root/newbackup.sh >>/srv/public/current.log

export log=/root/backup.log
export resticlog=/root/restic.log
export err=/root/error.log

echo ==============  /root/newbackup.sh =================  >$log
echo `date` begin backup >>$log
echo `date` >$resticlog
echo `date` >$err

set -o errexit

echo 1 dump databases >>$log
./newdump.sh

echo 2 `date` restic /home,/etc, /root and /var/spool/crontabs to /mnt/store/system >>$log
restic -r /mnt/store/system -p /root/resticpwd backup /home /etc /root /var/spool/cron/crontabs 2>$err

echo 3 `date` restic /srv and /opt/apps to /mnt/store/data >>$log
restic -r /mnt/store/data -p /root/resticpwd backup /srv /opt/apps 2>$err

echo 4 `date` restic /var/www files to /mnt/store/www >>$log
restic -r /mnt/store/www -p /root/resticpwd backup /var/www 2>$err

############################
# cleanup Restic repositories
############################
echo  5 `date` cleanup restic data repositories >>$log
echo 5a system >>$log
restic -r /mnt/store/system -p /root/resticpwd forget --prune --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --keep-yearly 20 >>$resticlog
echo 5b data >>$log
restic -r /mnt/store/data  -p /root/resticpwd forget --prune --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --keep-yearly 20 >>$resticlog
echo 5c www >>$log
restic -r /mnt/store/www -p /root/resticpwd forget --prune --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --keep-yearly 20 >>$resticlog

echo 6 `date` backup mailcow >>$log
MAILCOW_BACKUP_LOCATION=/mnt/store/mailcow /opt/apps/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all --delete-days 5 >>$log

echo 7 ================= `date` backup finished ================== >>$log

echo `date` end /root/newbackup.sh >>/srv/public/current.log

Stufe 2 Backup

export AWS_ACCESS_KEY_ID=$AMAZONKEYID
export AWS_SECRET_ACCESS_KEY=$AMAZONKEY
restic backup -r s3:s3.amazonaws.com/praxis /mnt/store

18.5.2019 - TLS/SSL Verschlüsselung

Https (hypertext transfer protocol secure), TLS (transport layer security) und SSL (secure sockets layer) seien hier synonym verwendet, obwohl es Unterschiede gibt: SSL war die ursprüngliche Implementation, TLS ist der verbesserte und heute aktuelle Nachfolger (in Version 1.3), und Https ist einfach eine Bezeichnung für die sichere Version des Http Protokolls. Man meint damit aber außerhalb der Spezialistenkreise immer dasselbe: Einerseits eine sichere Identifikation des Servers, andererseits eine Verschlüsselung der Daten, die durch die Verbindung ausgetauscht werden.

Prinzip

Das Konzept basiert auf dem Prinzip der asymmetrischen Verschlüsselung, welches ursprünglich 1977 von Rivest, Shamir und Adleman entwickelt und nach ihren Anfangsbuchstaben RSA-Verfahren genannt wurde. Dabei hat man einen privaten Schlüssel, den man geheim hält und einen öffentlichen Schlüssel, der allgemein bekannt sein darf bzw. soll. Wenn nun Alphons eine Nachricht an Berta senden will, dann verschlüsselt er diese mit Bertas öffentlichem Schlüssel. Berta wiederum kann die Nachricht mit ihrem privaten Schlüssel (und nur mit diesem!) entziffern. Dadurch kann Alphons, ohne dass er den privaten Schlüssel von Berta kennen muss, oder ohne dass man, wie bei symmetrischen Verschlüsselungsverfahren üblich, einen Schlüssel “irgendwie” austauschen muss, sicher verschlüsselte Nachrichten senden. Und wenn Berta antworten will, verwendet sie einfach Alphons’ öffentlichen Schlüssel und dieser kann mit seinem privaten Schlüssel entschlüsseln.

Eine zweite damit zusammenhängende interessante Möglichkeit ist folgende: Alphons kann seine Nachricht vor dem Verschlüsseln “signieren”. Das bedeutet, er erstellt eine Prüfsumme über die Nachricht und verschlüsselt diese Prüfsumme mit seinem eigenen privaten Schlüssel. Dann verschlüsselt er die Nachricht zusammen mit der Signatur mit Bertas öffentlichem Schlüssel.

Berta entschlüsselt die Nachricht zunächst mit ihrem eigenen privaten Schlüssel und entschlüsselt anschliessend die Signatur mit Alphons’ öffentlichem Schlüssel. Dann bildet sie selber eine Prüfsumme über die Nachricht und kontrolliert, ob diese Prüfsumme dieselbe ist wie das, was in der Signatur steht. Wenn ja, ist die Nachricht garantiert von Alphons und wurde garantiert auch nicht verändert - zumindest wenn sicher ist, dass der zur Prüfung verwendete öffentliche Schlüssel wirklich von Alphons stammt.

Genau hier liegt eine Angreifbarkeit dieses Verfahrens: Wenn Cäsar die Nachrichten zwischen Alphons und Berta abhören will, dann kann er eine “man in the middle attack” versuchen: Er generiert ein eigenes Schlüsselpaar, und jubelt beiden Partnern jeweils seinen eigenen öffentlichen Schlüssel als den des eigentlichen Partners unter. Dann kann er Alphons’ Nachricht entschlüsseln, neu signieren und mit Bertas echtem öffentlichen Schlüssel an diese weiterleiten. Sie “meint” Alphons’ öffentlichen Schlüssel zu haben, hat aber den von Cäsar und merkt so nicht, dass die Nachrichten abgehört oder sogar gefälscht werden.

Man kann diese Gefahr begrenzen, indem man die öffentlichen Schlüssel über einen anderen Kanal selber austauscht, oder indem man eine Prüfsumme (einen sogenannten ‘key fingerprint’) über den öffentlichen Schlüssel so publiziert, dass jeder die Echtheit nachprüfen kann. Das bedeutet aber einen zusätzlichen Schritt, den jeder Anwender machen müsste, was in der Praxis unrealistisch ist - Sicherheit muss automatisch erfolgen, sonst funktioniert sie nicht auf Dauer. Daher verwendet man im Internet ein automatisiertes Authentisierungssystem, das ich im nächsten Abschnitt zeigen werde.

Implementation der TLS/SSL Verschlüsselung im Internet

Wenn ein Browser eine verschlüsselte Verbindung mit einem Webserver aufnehmen will, dann “spricht” er ihn mit https:// statt http:// an und wählt standardmässig den Port 443 statt 80. Zunächst verlangt er vom Server dessen öffentlichen Schlüssel, dann generiert er einen “session key”, einen zufälligen Schlüssel für ein symmetrisches Verfahren, verschlüsselt diesen Schlüssel mit dem eben erhaltenen öffentlichen Schlüssel des Servers und schickt ihn zurück. Von da an kennen beide den session key, und die weitere Kommunikation wird mit diesem session key symmetrisch verschlüsselt. Dies deshalb, weil symmetrische Verfahren effizienter und schneller sind, als asymmetrische Verfahren - nur der Austausch des Schlüssels ist kritisch und dieses Problem hat die asymmetrische Verschlüsselung ja gelöst.

Ich habe hier bewusst etwas vereinfacht: Client und Server müssen sich über verschiedene andere Dinge, zum Beispiel die zu verwendenden Verschlüsselungsalgorithmen, einigen. Etwas viel Wichtigeres habe ich aber auch weggelassen: Bei oben skizzierter Methode hat der Client keine Chance zu erkennen, wer der Server wirklich ist. Er könnte sich “meineBank.de” nennen, in Wirklichkeit aber zu “boeserhacker.com” gehören. Der öffentliche Schlüssel enthält per se keine nachprüfbare Identität. Dann würde die Kommunikation zwar perfekt verschlüsselt ablaufen, aber leider mit dem falschen Adressaten!

Dieses Problem wird mit Zertifikaten gelöst: Wenn eine vertrauenswürdige Stelle bestätigt, dass der öffentliche Schlüssel wirklich zu “meineBank.de” gehört, dann kann man das so weit glauben, wie man der Zertifizierungsstelle vertraut. Es gibt eine ganze Reihe solcher Zertifizierungsstellen, und die Browser- und Betriebssystemhersteller bemühen sich, deren Vertrauenswürdigkeit auf hohem Niveau zu halten. Ein Zertifikat kann zum Beispiel so aussehen (Sie erhalten es, wenn Sie im Browser bei einer https-Verbindung auf das Symbol links neben der Adresse klicken):

Hier bestätigt also die SwissSign AG, dass die Website zkb.ch der Firma ‘Zürcher Kantonalbank’ gehört, und dass der Server, mit dem ich derzeit verbunden bin, dieses Zertifikat besitzt: Der öffentliche Schlüssel, den diese https-Verbindung verwendet, wurde mit dem privaten Schlüssel von SwissSign signiert, was mein Browser wiederum mit dem öffentlichen Schlüssel von SwissSign prüfen kann (und er tut das auch jedesmal). Aber woher weiss ich, dass der öffentlich Schlüssel von SwissSign wirklich der SwissSign AG gehört? Ganz einfach: Der ist natürlich auch signiert. Von einer “höheren” Zertifizierungsstelle. Auf diese Weise kann man sich durch eine Kette von Zertifikaten (certificate chain) weiter hangeln, bis man ganz oben bei einem “root certificate” angelangt ist. Und diese root-certificates sind fest im Browser gespeichert, können einem also nicht von Bösewichtern untergejubelt werden. Natürlich ist diese Zertifikatskette trotzdem ein Schwachpunkt des Ganzen. Es wurde zum Beispiel bekannt, dass manche Browser Root-Zertifikate eingebaut hatten, die unter Kontrolle der NSA standen, so dass diese jede Verschlüsselung kompromittieren konnte, indem sie sich für irgendeinen Server ausgab und dessen Zertifikat mit der eigenen Zertifizierungsstelle signierte. Aber es ist immer noch die sicherste bekannte Möglichkeit, verschlüsselt und authentisiert zu kommunizieren.

Wichtig ist auch zu wissen, dass die Zertifizierungsstelle nicht etwa die Schlüssel herstellt. Das tut man immer auf dem eigenen Computer, und der private Schlüssel sollte diesen nie verlassen. Man schickt nur den öffentlichen Schlüssel zum Signieren an die Zertifizierungsstelle. Dazu muss man dieser in irgendeiner, je nach Zertifikatstyp mehr oder weniger aufwändigen Form beweisen, dass man wirklich der Inhaber der zu schützenden Website ist. Also auch die Zertifizierungsstelle bekommt den privaten Schlüssel nicht zu Gesicht, kann die Verschlüsselung also nicht ohne Weiteres knacken.

In manchen Fällen genügt dieses Ein-Weg-Vertrauen nicht. Manchmal muss auch der Server genauer wissen, wer der Client ist. Dann kann er auch vom Client ein Zertifikat anfordern und überprüfen. Das ist aber nur selten der Fall. Meistens wird der Client einfach über eine Passwortabfrage authentisiert, welche über die bereits mit TLS verschlüsselte Verbindung erfolgt.

Zertifikat-Sicherheit und Warnungen

Ein Sonderfall ist das sogenannte self signed certificate, also ein selbstsigniertes Zertifikat. Das ist ein Zertifikat, das sich selbst bestätigt, vertrauenswürdig zu sein. Was es natürlich idR nicht ist. Ausser, wenn wir es selbst hergestellt, aber aus praktischen oder finanziellen Gründen nicht von einer offiziellen Zertifizierungsstelle absegnen liessen.

Ein selbstsigniertes Zertifikat lässt sich zum Beispiel so herstellen:

openssl req -newkey rsa:2048 -keyout key.pem -x509 -days 365 -noenc -out cert.pem

Aus obigem sollte klar geworden sein, dass das Zertifikat nichts über die Sicherheit der Verschlüsselung aussagt, sondern nur über die Vertrauenswürdigkeit des öffentlichen Schlüssels. Das ist wichtig, um entsprechende Browser-Warnungen zu verstehen. Diese können je nach Betriebssystem und Browsertyp sehr unterschiedlich sein.

Hier beispielsweise die Warnseite von Safari unter macOS:

Um dennoch weiterzugehen, müssen Sie “Details einblenden” und dann ganz unten auf “öffne diese Website” klicken. Danach kommt noch einmal eine Warnung, die Sie mit “Website besuchen” bestätigen müssen. Und dann will macOS Ihren Fingerabdruck bzw, Ihr Admin-Passwort, um die “Einstellungen für vertrauenswürdige Zertifikate” zu ändern. Immerhin: Danach hat er sich die Einstellung gemerkt und vertraut fortan diesem Zertifikat für diese Site.

Chrome unter macOS zeigt dieses Bild:

Hier müssen Sie auf “Erweitert” klicken und dann auf “weiter zu … (unsicher)”. Dann geht es ohne weitere Nachfrage zur Site. Allerdings merkt sich Chrome die Ausnahme nicht: Bei einer nächsten Verbindung müssen Sie die Warnung erneut abnicken. Ausser, Sie haben unter macOS zuvor mit Safari die Einstellungen geändert: Ein Zertifikat, dem Safari sein Vertrauen ausgesprochen hat, wird auch von Chrome akzeptiert.

Firefox schliesslich begrüsst uns auf dem Mac so:

Hier muss man auf “Erweitert” klicken und dann auf “Risiko akzeptieren und fortfahren”. auch Firefox merkt sich die Erlaubnis zwar nicht von selbst, respektiert aber die persistierte Erlaubnis von Safari (resp. der System-Schlüsselbundverwaltung, die das im Hintergrund erledigt).

Vertrauenswürdige Zertifikate

Wie oben gezeigt, kann man relativ leicht eine verschlüsselte Kommunikation einrichten.

Trotzdem ist es natürlich unschön, wenn wir jedesmal, wenn wir auf unseren eigenen Server zugreifen, den Browser beruhigen und überreden müssen, uns durchzulassen. Um dieses Problem zu umgehen, gibt es verschiedene Möglichkeiten, die allerdings leider sehr verschieden je nach Betriebssystem und Browser sind. Einige Hinweise:

Selbstsigniertem Zertifikat das Vertrauen aussprechen

  • Manche Browser erlauben, Sicherheitsausnahmen dauerhaft zu speichern, und dann für dasselbe Zertifikat keine Warnung mehr auszugeben.

  • Bei manchen Betriebssystemen können Sie manuell das Vertrauen zu einem Zertifikat erklären (bei macOS zum Beispiel mit der Schlüsselverwaltung des Systems)

  • Bei manchen Betriebssystemem können Sie auch manuell Root-Zertifikate installieren, mit denen Sie eigene Zertifikate signieren und damit das Vertrauen erklären können. Bei Ubuntu zum Beispiel müssen Sie dazu nur das eigene root-Zertifikat nach /usr/local/share/ca_certificates kopieren und dann eingeben sudo update-ca-certificates.

  • Etwas ausführlichere Erläuterungen zu diesem Problemkreis finden Sie z.B. hier: https://tarunlalwani.com/post/self-signed-certificates-trusting-them/

Offizielle Zertifikate erwerben/beziehen

Man kann natürlich auch den “offiziellen” Weg gehen. Und der sieht vor, dass man sich die Echtheit eines selbst erstellten Schlüssels von einer derjenigen Stellen zertifizieren lässt, die bei den Browsern bereits als vertrauenswürdig eingebaut sind, oder die selbst von solchen “root-certificates” zertifiziert sind. Bis vor wenigen Jahren musste man dazu in die Tasche greifen: Zertifikate waren nur im Jahresabo zu haben und kosteten je nach Sicherheitsstufe von einer handvoll Dollars bis einigen hundert Dollars pro Jahr. Mit “Sicherheitsstufe” ist dabei gemeint, wie genau die Zertifizierungsstelle die Echtheit überprüft. Der Browser zeigt die Sicherheitsstufe eiunes Zertifikats durch die Art des Symbols in der Titelzeile an (von einem schlichten grauen Schloss bis zu einem breiten grünen Balken). Wobei noch einmal wiederholt werden muss: Diese Sicherheitsstufe hat nichts mit der Sicherheit der Verschlüsselung zu tun, sondern nur mit der Sicherheit der Identität. In der niedrigsten Stufe muss man nur beweisen, dass man Administratorzugriff auf die Website hat, die man sichern will, in der höchsten Stufe muss man der Zertifizierungsstelle z.B. einen Ausweis oder einen Handelsregisterauszug vorweisen.

Seit einigen Jahren gibt es mit Let’s Encrypt eine Möglichkeit, kostenlos Zertifikate zu beziehen. Man muss dazu nur beweisen, dass man die Website. die man sichern will, manipulieren kann, Das lässt sich ohne weiteres automatisiert machen. Es gibt fertige Docker-Lösungen, die Let’s Encrypt Zertifikate vollautomatisch anfordern, verwalten und regelmässig erneuern können (Let’s Encrypt Zertifikate sind immer nur 3 Monate lang gültig).