Snippets aus der Praxis – Webseite nur für eine IP freigeben
In meiner Blog-Reihe “Snippets aus der Praxis” nehme ich dich mit in meinen Alltag
DarkWolfCave.de
und zeige dir, wie ich bestimmte Herausforderungen angehe und löse.
Heutiges Thema: Webseite nur für eine IP freigeben
Manchmal sind es nur Kleinigkeiten, die über ein quick and dirty Script gelöst werden, manchmal sind es auch komplexere Themen und Vorgänge. Alles auf jeden Fall aus meinem direkten Umfeld. Du darfst hier allerdings keine top professionelle Lösungen, die dazu auch noch super sicher sind, erwarten. Hier geht es meistens nur um eine schnelle Lösungsfindung und sollte daher als Anregung gedacht sein und keinesfalls irgendwo außerhalb in seinem privaten Umfeld angewendet werden.
Snippets aus der Praxis – Webseite nur für eine IP freigeben
Ausgangslage: Ich benutze neben meiner lokalen Umgebung, aus diversen Gründen, auch verschiedene “Staging’s” meiner Wordpress und anderen Webseiten. Dort kann dann lustig getestet, installiert, deaktiviert und kaputt gemacht werden, ohne das jemand mir meine “Live”-Webseite zerstört.
Problemchen: Die Seiten sind dann natürlich erstmal für alle zugänglich. Es gibt diverse Wege dies zu verhindern und teilweise benutzte ich auch andere oder kombiniere sogar welche miteinander. Auf jeden Fall möchte ich nicht, dass irgendjemand auf diese ohne weiteres zugreifen kann.
Gedanken: Neben den von meinem Hoster angebotenen Möglichkeiten, gäbe es auch noch eine über .htaccess und .htpasswd. Bei dieser wird ein User angelegt und ein verschlüsseltes Passwort erstellt.
Was mich hierbei dann aber immer stört: ich muss ständig (naja.. übertrieben da es für die Sitzung gespeichert wird) ein Passwort eingeben.
Also habe ich mir überlegt wie es noch gehen könnte (Sicherheit mal außen vor gelassen) und dachte mir: ich sperre einfach alle IP-Adressen per .htaccess aus und erlaube nur “meiner” den Zugang. Möchte also den Zugang zu meiner Webseite nur für eine bestimmte IP Adresse freigeben.
Was ich will: Eine Möglichkeit nur mir den Zugriff auf meinen Webseiten zu gestatten ohne ständig ein Passwort eingeben zu müssen (muss man sich ja auch merken….).
Außerdem hab ich echt keine Lust dazu, bei allen .htaccess Dateien manuell eine IP eintragen zu müssen. Vor allem da ich an meinem Anschluss keine static IP habe, sondern mein Provider mir öfters mal eine Neue geben könnte….
Webseite nur für eine IP freigeben – Vorgehensweise
Die grundlegenden Gedanken und Anforderungen hatte ich mir ja jetzt gemacht.
Allerdings blieb die Frage: wie gehe ich jetzt weiter am besten vor?
Natürlich könnte ich manuell in jeder meiner .htaccess Dateien die entsprechenden Zeilen mit meiner IP-Adresse eintragen und speichern. Das wäre schnell erledigt und fertig.
Allerdings kann es ja sein, dass ich dort auch in Zukunft die IP wieder ändern müsste. Zum Beispiel weil mir mein Provider eine andere IP zuteilt (hab keine static IP) oder weil ich von wo anders arbeiten will.
Und spätestens dann würde es mich schon nerven das überall erneut ändern zu müssen. Weiterhin könnte es auch sein, dass ich irgendwann noch hunderte von Staging Seiten haben werden (falls dem jemals so sein sollte, bringt mich bitte jemand zum Arzt…).
Lange Rede kurzer Sinn: einmal hinsetzen, etwas austüfteln was diese Arbeit übernimmt und mir in Zukunft Zeit und Ärger ersparen.
Also rann an die Sache und den Kopf anwerfen:
Was kenne ich? Wie könnte ich vorgehen? Was ist technisch möglich? Was ergibt überhaupt Sinn?
Du wirst hier einen groben Überblick finden.
Allerdings biete ich dir auch noch etwas mehr Support an:
- Du benötigst persönlichen Support
- Du möchtest von Beginn an Unterstützung bei deinem Projekt
- Du möchtest ein hier vorgestelltes Plugin durch mich installieren und einrichten lassen
- Du würdest gerne ein von mir erstelltes Script etwas mehr an deine Bedürfnisse anpassen
Für diese Punkte und noch einiges mehr habe ich einen limitierten
VIP-Patreon Tarif
eingerichtet. Falls er dir dort zurzeit nicht angeboten wird,
kontaktiere mich bitte über Discord und wir finden eine Lösung!
Brainstorming mal anders
- Ein Script – Shell? Python? PHP/JS? Was anderes?
manuell – nö- Wenn Script:
– Wo schreibe ich meine Änderung hinein?
– An welcher Position?
– Bei einer späteren Änderung: Wie kann ich nur die IP ändern?
– IP im Script fest anlegen?
– Wie kann ich mehrere .htaccess Dateien in unterschiedlichen Verzeichnissen / Domains ändern?
– Log File? - Was erlaubt mein Provider? (Script / Programmiersprachen und welche Befehle darf ich nutzen usw.)
Ergebnis meiner Gedanken
Manche meiner Domains sind bei einem Webhoster hinterlegt. Also kein eigener Root/V- Server. Vor und Nachteile sind hier erstmal egal. Jedenfalls erlauben die meisten Webhoster nicht, dass man zum Beispiel Python in der Shell benutzen darf.
Daher habe ich mich für ein Shell-Script entschieden. Dies ist bei vielen erlaubt – allerdings nicht unbedingt alle Befehle, daher habe ich hier keine “besonderen” genutzt. Es sollte also überall funktionieren wo der Hoster dir den Shell-Zugriff erlaubt.
Shell-Script:
- Es soll aus einer Datei die Pfade einlesen (mehrere .htaccess Dateien)
- Es MUSS prüfen ob es meinen Eintrag schon gibt, falls nicht einen kompletten Eintrag hinzufügen
- Sollte mein Eintrag schon vorhanden sein: Nur die IP Adresse ändern (prüfen ob es dieselbe ist, ist nicht notwendig – einfach überschreiben)
- Ein ganz neuer Eintrag als erstes hinzufügen (also vor bereits vorhandenen Einträgen, diese dürfen natürlich nicht überschrieben werden)
- Möchte ungern die IP im Script hinterlegen, da ich dann ja später wieder etwas editieren müsste. Also lieber beim starten den Scripts als Parameter mit übergeben
Dann mal los – bauen wir uns ein Script
Das Script kann grundsätzlich auf jedem Linux-Server laufen. Du musst nur sicherstellen, dass dieser Server alle deine zu ändernden .htaccess Dateien erreichen und da drauf schreiben kann.
Ich teste das erst einmal bei meinem Webhoster wo ein paar Testumgebungen liegen.
Also fix per SSH verbinden – dazu empfehle ich weiterhin MobaXterm.
Dann suchen wir uns einen Ort wo wir das Script erstellen und speichern wollen.
Ich bin da nicht immer so einfallsreich und ändere den Namen meist später erst.
Du wirst sehen, dass ich oft sowas wie “dwc-test” oder “dwc-tutorial” als Ordner oder sogar als Skriptnamen nehmen werden. Du bist da sicherlich kreativer 🙂
Gehen wir mal davon aus, wir wollen in unserem Home-Verzeichnis ein neuen Ordner erstellen und dort dann das Script ablegen. Mit dem touch erstellen wir einfach eine leere Datei:
Die Befehle zum kopieren:
mkdir dwc-test
cd dwc-test
touch dwc-test.sh
touch htaccess_files.txt
Jetzt haben wir schon einmal die Struktur. In die “dwc-test.sh” kommt dann gleich unser eigentliches Skript und in die “htaccess_files.txt” die Pfade zu den .htaccess Dateien die geändert werden sollen.
Das sind die Webseiten für die wir nur eine IP freigeben wollen. Diese sollten sich in dem Ordner deiner Webseite befinden, der mit deinem Domain Namen verknüpft ist (z.B. /domainname/httpdocs/.htaccess)
Webseite nur für eine IP freigeben – Grobe Erklärung
Als erstes legen wir uns ein paar Variablen an. Diese beinhalten dann die entsprechenden Parameter/Strings:
HTACCESS_FILES_PATH="/dwc-test/htaccess_files.txt" IP_ADDRESS=$1 LOG_FILES="/dwc-test/logs.txt" NOW=$(date +"%d-%m-%Y") COUNT_FILE='1'
HTACCESS_FILES_PATH = hier kommt der Pfad hinein wo die htaccess_files.txt liegt. Also da, wo wir gerade den neuen Ordner und die Files erstellt haben. Am besten in diesem Ordner “pwd” eingeben und den angezeigten Pfad kopieren.
IP_ADDRESS = Hier wird später die IP Adresse gespeichert die wir beim Aufrufen des Script mit angeben müssen
LOG_FILES = Wo du dein LogFile speichern willst
NOW=$(date +”%d-%m-%Y”) = Sieht komisch aus, ist aber so! Hier steht dann das aktuelle Datum drin (Tag-Monat-Jahr)
COUNT_FILE = brauchen wir zum zählen
Das war jetzt der einfache Teil.
Beim starten des Scripts möchten wir, dass eine IP Adresse mit übergeben wird.
Also nach dem Muster: dwc-test.sh 1.1.1.1
Jetzt wäre es allerdings doof, wenn das Script auch weiter macht, wenn wir nur dwc-test.sh eingeben würden oder eine invalide IP angeben (z.B.: 12s.22.1.2 oder 1234.123.12.1 usw.).
Daher fangen wir solche falschen Eingaben direkt am Anfang ab:
#check if argument (IP) empty if [ -z "$1" ] ; then echo "Falscher Aufruf! Benutze test.sh IP (Beispiel: test.sh 1.1.1.1)" ; fi #check if IP is a valid IP if echo "$1" | grep -E -q '^(25[0-5]|(2[0-4]|1[0-9]|[1-9])?[0-9]\.){3}(25[0-5]|(2[0-4]|1[0-9]|[1-9])?[0-9])$'; then echo "Die IP-Adresse $1 ist gültig." else echo "Die IP-Adresse $1 ist ungültig." exit 1 fi
check if argument (IP) empty: In diesem Abschnitt prüfen wir, ob der beim starten des Scripts gesetzte Parameter (also die IP) vorhanden ist. Shell speichert solche direkt in $1 für den ersten Parameter und $2 für den zweiten usw. (dwc-test.sh 127.127.127.127 1.1.1.1).
Sollte dieser fehlen, bricht das Script mit einer Fehlermeldung ab
check if IP is a valid IP: Und hier wird es jetzt spaßig. Ich liebe regex…. (ironie… wobei das echt mächtig ist, aber diese Schreibweise… phhhuuu). Auf jeden Fall wird geprüft, ob der Parameter (IP) auch wirklich eine IP ist. Dazu werden die einzelnen Segmente geprüft ob dort nur Zahlen vorhanden sind. Und ja, hier wird nicht unterschieden zwischen privaten und öffentlichen IPs. Und auch die IPv6 gehen leer aus. Aber es soll ja noch Raum für Erweiterungen geben 😛
Jedenfalls sollten hier Buchstaben, Zeichen oder größer 255 das Script zum Abbruch bewegen.
#print to logfiles printf '%s\n' \ "--------------------" \ "IP changed to: $IP_ADDRESS" \ "Date: $NOW" \ >> "$LOG_FILES" echo "********************" &>> "$LOG_FILES"
Hier schicken wir einfach ein wenig Text an unser Logfile. Den Pfad dazu haben wir ganz oben in der Variable LOG_FILES definiert.
Zu Beginn jeden Durchlaufs, schreiben wir die neue IP-Adresse sowie das Datum in die Logs.
Nehmen wir jetzt den kompliziertesten Teil etwas auseinander:
while read -r htaccess_file; do # Lesen der Datei if [ -f "$htaccess_file" ]; then readarray -t lines < "$htaccess_file" echo "*** Nr. $COUNT_FILE - Bearbeite $htaccess_file: " &>> "$LOG_FILES" else echo "*** Nr. $COUNT_FILE - $htaccess_file nicht gefunden!" &>>"$LOG_FILES" continue fi
Es wird eine Schleife gestartet, die unsere Einträge aus der htaccess_files.txt, einließt und verarbeitet.
In die Variable htaccess_file wird jede Zeile aus der text Datei hinzugefügt und dann geprüft ob die Datei vorhanden / erreichbar ist. Auch werden die Ergebnisse in das LogFile geschrieben.
Sollte ein Eintrag – also eine Datei – nicht vorhanden sein, überspringt das Script diesen und macht mit dem nächsten weiter.
# Suchen nach dem Beginn-Tag begin_tag="# Begin dwc only my IP" begin_line=$(grep -n "$begin_tag" "$htaccess_file" | cut -d: -f1) if [[ -n "$begin_line" ]]; then # Wenn der Beginn-Tag gefunden wurde # Suchen nach dem Ende-Tag end_tag="# END dwc only my IP" end_line=$(grep -n "$end_tag" "$htaccess_file" | cut -d: -f1) echo "*** Beginn Tag gefunden" &>>"$LOG_FILES" if [[ -n "$end_line" ]]; then # Wenn der Ende-Tag gefunden wurde # Ersetzen der IP-Adresse for (( i=$begin_line+1; i<$end_line; i++ )); do if [[ "${lines[i]}" == *"Allow from"* ]]; then lines[i]="Allow from $IP_ADDRESS" echo "*** ${lines[i]} gefunden und durch Allow from $IP_ADDRESS ersetzt" &>> "$LOG_FILES" break fi done # Schreiben der Datei printf '%s\n' "${lines[@]}" > "$htaccess_file"
Suchen nach dem Beginn-Tag: Hier wird nach dem Beginn unserer Änderung in der .htaccess gesucht. Dazu musst du wissen, das meine Änderungen in diesem Fall mit # Begin dwc only my IP
anfangen und mit # END dwc only my IP
enden.
Sobald dieser gefunden wurde, wird nach dem End-Tag gesucht und die entsprechenden Lines gespeichert. Also wo sich genau der Beginn und End-Tag befindet. Denn diese Werte brauchen wir jetzt, um nur in dem notwendigen Bereich nach “Allow from *” zu suchen.
Hier befindet sich in meiner Änderung die IP (z.B.: Allow from 1.1.1.1).
Und genau diese wollen wir dann auch ändern. Also überschreiben wir die gesamte Zeile mit dem Inhalt unserer Variablen (“Allow from $IP_ADDRESS“) und schreiben alles zurück in die entsprechende .htaccess Datei (printf ‘%s\n’ “${lines[@]}” > “$htaccess_file”).
Jetzt müssen wir aber auch noch angeben was passieren soll, wenn es noch keinen Beginn-Tag gibt. Was ja bei dem allerersten Durchlauf immer auftreten sollte.
Wir schreiben dann einfach unsere Änderungen komplett in die .htaccess, und zwar ganz am Anfang, hinein:
else # Wenn der Beginn-Tag nicht gefunden wurde # Hinzufügen des gewünschten Texts echo "*** Beginn-Tag nicht gefunden, füge erstmalig gesamten Eintrag hinzu: " &>> "$LOG_FILES" printf '%s\n' \ "# Begin dwc only my IP" \ "# allow only one IP " \ "# and disallow all other requests" \ "Order deny,allow" \ "Deny from all" \ "Allow from $IP_ADDRESS" \ "# END dwc only my IP" \ | cat - "$htaccess_file" > temp && mv temp "$htaccess_file" fi
Und das war es eigentlich auch schon. Jetzt speichern und das Script noch ausführbar machen.
chmod +x dwc-test.sh
Bevor du es jetzt startest, brauchst du aber auch noch die Pfade zu den benötigten .htaccess Dateien. Also öffne die htaccess_files.txt und schreibe jede Datei in eine eigenen Zeile.
Wichtig dabei, der Pfad und die Datei müssen angegeben werden. Beispiel:
/deine-domain-1/httpdocs/.htaccess /deine-domain-2/httpdocs/.htaccess
Speichern und das Script einfach mal starten. Danach kannst du entweder in das Log schauen oder direkt in die entsprechenden .htaccess Dateien. Jetzt wirst du hier unsere neuen Einträge mit der entsprechenden IP sehen.
./dwc-test.sh 1.1.1.1
Webseite nur für eine IP freigeben – Der komplette Sourcecode
#!/bin/bash #-----------------------------------------# # DarkWolfCave.de Tutorials und Snippets # # # # Allow only one IP to connect my Website # # Version 0.1 # #-----------------------------------------# HTACCESS_FILES_PATH="/dwc-test/htaccess_files.txt" IP_ADDRESS=$1 LOG_FILES="/dwc-test/logs.txt" NOW=$(date +"%d-%m-%Y") COUNT_FILE='1' #check if argument (IP) empty if [ -z "$1" ] ; then echo "Falscher Aufruf! Benutze test.sh IP (Beispiel: test.sh 1.1.1.1)" ; fi #check if IP is a valid IP if echo "$1" | grep -E -q '^(25[0-5]|(2[0-4]|1[0-9]|[1-9])?[0-9]\.){3}(25[0-5]|(2[0-4]|1[0-9]|[1-9])?[0-9])$'; then echo "Die IP-Adresse $1 ist gültig." else echo "Die IP-Adresse $1 ist ungültig." exit 1 fi printf '%s\n' \ "--------------------" \ "IP changed to: $IP_ADDRESS" \ "Date: $NOW" \ >> "$LOG_FILES" echo "********************" &>> "$LOG_FILES" while read -r htaccess_file; do # Lesen der Datei if [ -f "$htaccess_file" ]; then readarray -t lines < "$htaccess_file" echo "*** Nr. $COUNT_FILE - Bearbeite $htaccess_file: " &>> "$LOG_FILES" else echo "*** Nr. $COUNT_FILE - $htaccess_file nicht gefunden!" &>>"$LOG_FILES" continue fi # Suchen nach dem Beginn-Tag begin_tag="# Begin dwc only my IP" begin_line=$(grep -n "$begin_tag" "$htaccess_file" | cut -d: -f1) if [[ -n "$begin_line" ]]; then # Wenn der Beginn-Tag gefunden wurde # Suchen nach dem Ende-Tag end_tag="# END dwc only my IP" end_line=$(grep -n "$end_tag" "$htaccess_file" | cut -d: -f1) echo "*** Beginn Tag gefunden" &>>"$LOG_FILES" if [[ -n "$end_line" ]]; then # Wenn der Ende-Tag gefunden wurde # Ersetzen der IP-Adresse for (( i=$begin_line+1; i<$end_line; i++ )); do if [[ "${lines[i]}" == *"Allow from"* ]]; then lines[i]="Allow from $IP_ADDRESS" echo "*** ${lines[i]} gefunden und durch Allow from $IP_ADDRESS ersetzt" &>> "$LOG_FILES" break fi done # Schreiben der Datei printf '%s\n' "${lines[@]}" > "$htaccess_file" else echo "*** Ende-Tag nicht gefunden in $htaccess_file!" &>>"$LOG_FILES" fi else # Wenn der Beginn-Tag nicht gefunden wurde # Hinzufügen des gewünschten Texts echo "*** Beginn-Tag nicht gefunden, füge erstmalig gesamten Eintrag hinzu: " &>> "$LOG_FILES" printf '%s\n' \ "# Begin dwc only my IP" \ "# allow only one IP " \ "# and disallow all other requests" \ "Order deny,allow" \ "Deny from all" \ "Allow from $IP_ADDRESS" \ "# END dwc only my IP" \ | cat - "$htaccess_file" > temp && mv temp "$htaccess_file" fi echo "********************" &>> "$LOG_FILES" ((COUNT_FILE++)) done < "$HTACCESS_FILES_PATH" echo "--------------------" &>> "$LOG_FILES"
Webseite nur für eine IP freigeben – Kurzanleitung
Ein einfaches Skript um per .htaccess nur eine bestimmte IP auf seiner Webseite – zum Beispiel einer Wordpress Seite – zuzulassen. (Praktisch für Testumgebungen die im Internet gehostet werden).
Es können mehrere solcher .htaccess Dateien mit einem Aufruf bearbeitet werden.
- Das Shell-Script dort abspeichern von wo du Zugriff auf deine .htaccess Dateien hast
- Aufruf mit dwc-test.sh NEUE_IP (z.B.: dwc-test.sh 1.1.1.1)
- In der “htaccess_files.txt” müssen die Pfade inkl. der Datei eingetragen werden (z.B.: /meinOrdner/httdocs/.htaccess)
Snippets aus der Praxis – Ein kleines Extra
Ich versuche ja immer alles mögliche zu automatisieren und so wenig wie möglich selbst machen zu müssen. Und auch hier wollte ich nicht immer, nachdem sich meine IP-Adresse geändert hat, dran denken müssen das Skript manuell zu starten.
Also habe ich mich dran gesetzt eine quick and dirty Version auf meinem Rasperry Pi einzurichten.
Im Prinzip schaut dieses Skript nur nach ob sich meine IP geändert hat und schickt die Neue dann per SSH an das oben erstellte Skript.
So muss ich nicht selbst ständig prüfen ob sich meine IP geändert hat, und auch nicht selbst das Skript zum ändern der Daten in den .htaccess Dateien starten. Macht alles mein Raspberry Pi für mich 🙂
Hier greife ich für die ssh Verbindung auf die “ssh config” zurück. Das bedeutet, du kannst es nicht so 1:1 abtippen wie im Video / Code zu sehen ist. Denn wie sich ssh dann verbindet ist in dieser config hinterlegt (User, IP, RSA Key usw.). Wenn du dazu ein wenig Hilfe benötigst, dann siehe dir den passenden Artikel dazu an.
Und damit du erlebst, wie aus einem Gedanken ein Skript wird, habe ich dies per Video “dokumentiert” 😛
Snippets aus der Praxis – Es entsteht ein Skript – YouTube
Sie sehen gerade einen Platzhalterinhalt von YouTube. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr InformationenDas kleine Extra – der Sourcecode
#!/bin/bash #-----------------------------------------# # DarkWolfCave.de Tutorials und Snippets # # # # check IP and start another sh script # # over ssh with the new IP # # Version 0.1 # #-----------------------------------------# MY_IP_FILE="/home/pi/test/my_ip.txt" TEST_IP=$(wget -O - -q icanhazip.com) echo "TestIP: $TEST_IP" if [ -f "$MY_IP_FILE" ];then echo "Datei vorhanden" while read ZEILE; do if [ $ZEILE != $TEST_IP ]; then echo "letzte IP: $ZEILE und neue IP: $TEST_IP" echo "$TEST_IP" > "$MY_IP_FILE" ssh dwc-tut "/dwc-test/dwc-test.sh $TEST_IP" else echo "Keine Änderung der IP: $TEST_IP" fi done < "$MY_IP_FILE" else echo "Datei nicht vorhanden" echo "$TEST_IP" > "$MY_IP_FILE" fi