Wie sichert man einen Webserver ab?
Einen Webserver sichert man ab, indem man ihm abgewöhnt, zu viel zu verraten, und ihm zusätzliche Schutz-Header mitgibt. Ein Webserver ist das Programm, das Webseiten an Besucherinnen und Besucher ausliefert.
Du lernst, was ein Server bei jeder Anfrage mitschickt und was davon einem Angreifer hilft. Du übst nur an deiner eigenen Kopie.
Am Ende dieser Lektion
Notiz
Ich kann die Antwort eines Webservers lesen und sagen, welche Einstellungen fehlen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Webserver | ein Programm, das Webseiten ausliefert | nginx |
| Header | eine Kopfzeile, die der Server vor der Seite mitschickt | |
| Statuscode | eine Zahl, die sagt, wie die Anfrage ausging | 200 |
| Verzeichnisliste | eine Seite, die alle Dateien eines Ordners auflistet | |
| Konfiguration | die Einstellungen, nach denen ein Server arbeitet |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Was schickt ein Server bei jeder Anfrage mit?
Wenn dein Browser eine Seite holt, antwortet der Server zuerst mit einer Statuszeile und mehreren Headern. Erst danach kommt die Seite selbst.
Die Statuszeile enthält einen Statuscode: 200 heißt „gefunden“, 404 heißt „gibt es nicht“, 403 heißt „verboten“. Die Header sind Zusatzinformationen, zum Beispiel, welche Software der Server benutzt.
Beispiel: die Antwort einer erfundenen Vereinsseite
| Zeile | Was sie sagt |
|---|---|
| HTTP/1.1 200 OK | Die Seite wurde gefunden |
| Server: nginx/1.20.1 | Software und Versionsnummer des Servers |
| Content-Type: text/html | Es kommt eine Webseite |
| Content-Length: 612 | Die Seite ist 612 Bytes groß |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die eine Regel für dieses Lab
Warnung
Frag nur den Server in deiner eigenen Kopie des Labs ab und nie eine fremde Seite ohne Erlaubnis. Das wäre strafbar. Du liest hier eine Antwort, um zu lernen, was ein Angreifer sehen würde, und sie dann besser zu schützen.
Bevor du anfängst
Notiz
Drück oben in der Leiste auf Lab starten und warte, bis die Maschine läuft. Der Server in diesem Lab heißt web. Die Befehle erscheinen im Terminal, wenn du auf Ausführen drückst.
Die Statuszeile der Startseite lesen
curl -sI http://web | head -n 1Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Server-Header ansehen
curl -sI http://web | grep -i '^server'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Nur den Statuscode ausgeben
curl -s -o /dev/null -w '%{http_code}\n' http://web/Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Warum soll der Server seine Version verschweigen?
Zu jeder Version einer Software sammeln Fachleute bekannte Fehler. Wer die Versionsnummer kennt, weiß, welche Fehler er versuchen kann.
Die Versionsnummer nützt Besucherinnen und Besuchern nichts. Darum stellt man sie ab. Die Einstellung heißt bei nginx server_tokens.
Welche Schutz-Header gibt es?
Ein Sicherheits-Header ist eine Kopfzeile, die dem Browser Regeln für die Seite mitgibt. Der Browser hält sich daran und schützt so die Besucherinnen und Besucher.
Vier gehören auf jede Seite. Die Tabelle zeigt, was jeder bewirkt.
Vier Sicherheits-Header und ihr Schutz
| Header | Beispielwert | Schützt vor |
|---|---|---|
| X-Content-Type-Options | nosniff | Dateien, die der Browser falsch deutet |
| X-Frame-Options | SAMEORIGIN | Der Seite in einem fremden Rahmen (Clickjacking) |
| Content-Security-Policy | default-src 'self' | Fremdem Code, der in die Seite eingeschleust wird |
| Referrer-Policy | no-referrer | Dem Weitergeben der Adresse an andere Seiten |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, eine Datei sei sicher, wenn nirgends ein Link auf sie zeigt. Ein Angreifer probiert aber gängige Namen wie .git, backup.zip oder admin einfach aus. Eine Datei ist nur dann geschützt, wenn der Server sie nicht ausliefert.
Header aus einem Text lesen
antwort = "HTTP/1.1 200 OK\nServer: nginx/1.20.1\nX-Frame-Options: DENY"
# Jede Zeile mit ": " ist ein Header: links der Name, rechts der Wert.
for zeile in antwort.split("\n"):
if ": " in zeile:
teile = zeile.split(": ")
print(teile[0], "->", teile[1])
Warum ist eine Verzeichnisliste gefährlich?
Fragt jemand nach einem Ordner ohne Startseite, kann der Server eine Verzeichnisliste zeigen: eine Seite mit allen Dateien darin.
Das ist bequem für die Betreuerin, aber auch für einen Angreifer. Er sieht dann Dateien, von denen niemand wusste, dass sie online sind. Dasselbe gilt für Sicherungskopien und Einstellungsdateien auf dem Server.
Beispiel: Schutz-Header einer Vereinsseite
# Beispiel für eine andere Seite, kein Befehl zum Ausführen
server_tokens off;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
Weiterführend: dein Schulnetz
Eine Richtlinie ist eine Liste von Regeln, die jede Seite erfüllen soll. Schreib für eine Seite deiner Wahl auf Papier fünf Regeln auf.
Prüfe nur Seiten, die dir selbst gehören. Hand die Liste deiner Lehrkraft, damit sie sie mit dir durchgeht.