published on
tags: uberspace Web ssh

IP-basierte Zugangsbeschränkung auch bei dynamischer IP-Adresse

Es gibt verschiedene Möglichkeiten, eine Webseite vor unbefugten Zugriffen zu schützen. Passwortabfragen, HTTP-Authentifizierung und nur das Zulassen einer bestimmten IP-Adresse. Die letztere Möglichkeit ist meiner Meinung nach die Sicherste, vor allem kann sie gut Attacken (z.B. auf Login-Seiten) abwehren. Was macht man aber, wenn man keine feste IP-Adresse von seinem Provider erhält? Man könnte sich vermutlich mit DynDNS irgendetwas basteln, aber ich bin ein Freund davon, alles selbst zu hosten. Hier ist deshalb meine Lösung für das dynamische Aktualisieren der IP-Adresse auf dem Server.

Das wird benötigt

Eigentlich benötigt man nur einen uberspace oder einen anderen Webspace mit SSH-Zugang (die sind aber selten oder im Vergleich zum Mindestbetrag bei den Ubernauten sehr teuer).

Serverseitige Vorbereitungen

Auf dem Server benötigen wir nur ein kleines Script (USERNAME natürlich mit dem uberspace-Nutzernamen ersetzen):

#!/bin/sh

# Get current IP
NEWIP=`echo $SSH_CLIENT | awk '{ print $1}'`
echo "Your current IP address is: $NEWIP"

# Update IP
NOW=$(date +"%d.%m.%Y %H:%M")

FILE="/var/www/virtual/USERNAME/.htaccess"

echo "Updating file $i"
echo "# My Home IP at $NOW" > FILE
echo "SetEnvIf Remote_Addr $NEWIP ipallowed" >> FILE

Das Script ermittelt die neue IP-Adresse aus einer durch SSH gesetzten Umgebungsvariable. Anschließend schreibt er die neue .htaccess-Datei mit der aktuellen IP-Adresse. Dabei hilft der Setup der ubernauten. Die .htaccess landet deshalb nicht im DocumentRoot /var/www/virtual/USERNAME/html/ sondern eine Ebene darüber. Über die “Vererbung” der .htaccess-Dateien wird also bei jedem Aufruf über den Apache diese Datei eingebunden und somit bei übereinstimmender IP-Adresse die Variable ipallowed gesetzt.

Dieses Script speichern wir als ssh-ipupdate in ~/bin/ und machen es dann noch mit chmod +x ~/bin/ssh-ipupdate ausführbar.

In den .htaccess Dateien in den einzelnen abzusichernden Ordnern einfach folgende Zeilen einfügen, dann hat nur noch die eigene IP-Adresse Zugang zum entsprechenden Ordner:

Order deny,allow
Deny from all
Allow from env=ipallowed

oder in einem File-Block:

<File xyz.php>
Order deny,allow
Deny from all
Allow from env=ipallowed
</File>

Trotzdem sollte das aber nicht die einzige Absicherung der Webapplikation sein. Sollte der SSH-Key einem Fremden in die Finger fallen, hätte er auch Zugriff darauf.

Verbindung über SSH Keys einrichten

Zuerst generiert man sich mit ssh-keygen -f ~/.ssh/ipupdate.key auf seinem lokalen Computer einen neuen SSH Key (unter Windows mit Cygwin). Das Passwort muss leer gelassen werden, sonst geht das anmelden per Script nicht so gut.

Mit dem normalem SSH-Key oder Passwort auf dem Uberspace anmelden und in ~/.ssh/authorized_keys folgende Zeile einfügen (nach ssh-rsa den Inhalt aus der Datei ~/.ssh/ipupdate.key vom lokalen Rechner einfügen):

command="/home/USERNAME/bin/ssh-ipupdate",no-port-forwarding,no-agent-forwarding,no-X11-forwarding ssh-rsa AAAA.....

Vom lokalen Computer aus kann man sich jetzt verbinden, die IP Adresse wird aktualisiert und man erhält Zugriff auf die Website.

$ ssh -i ~/.ssh/ipupdate-key USERNAME@HOST.uberspace.de
Your current IP address is: <IP>
Updating file /var/www/virtual/USERNAME/.htaccess
Connection to HOST.uberspace.de closed.

Beim Systemstart ausführen

Linux

Mit crontab -e einen neuen Cronjob @reboot ssh -i /home/LOKALERUSER/ipupdate-key USERNAME@HOST.uberspace.de hinzufügen. (Ich habe das aus Ermangelung eines Linuxsystems nicht überprüft - es sollte aber funktionieren)

Windows (mit Cygwin)

Von der Datei Cygwin.bat im Cygwin Rootverzeichnis eine Kopie erstellen und die Zeile bash --login -i ersetzen mit bash --login -c "ssh -i '/home/LOKALERUSER/.ssh/ipupdate-key' USERNAME@HOST.uberspace.de" ersetzen. Man kann jetzt eine Verknüfung zu dieser bat Datei erstellen und diese in den Autostart Ordner kopieren. Dazu öffnet man mit Win+R das Ausführen Fenster, gibt dort shell:startup ein und bestätigt mit OK oder mit Enter. Die Verkünpfung kann man jetzt in den Eigenschaften minimiert starten lassen, dann gibt es nach dem Anmelden auch kein störendes Konsolenfenster.