4.6 KiB
Webserver absichern
Konfiguration für software.obraasch.de. CloudPanel arbeitet in der Regel mit
nginx — nimm den entsprechenden Abschnitt und lade danach neu.
Die Startseite index.php setzt ihre eigenen Header bereits selbst. Die
folgende Konfiguration deckt zusätzlich die statischen Dateien ab, also
auch json-workbench.html und die Rechtstexte.
nginx
In den server-Block der Site einfügen:
# --- Sicherheitsheader für alle Antworten ---
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=()" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;
# HSTS erst aktivieren, wenn HTTPS sicher und dauerhaft läuft.
# Ein zu früh gesetzter Wert sperrt Besucher für die angegebene Dauer aus,
# falls das Zertifikat später Probleme macht.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# --- Verstecktes und Sensibles nicht ausliefern ---
location ~ /\. {
deny all;
}
location ~* /(tool\.json|LICENSE|README\.md|\.md)$ {
deny all;
}
# Die Datenbank-Brücke enthält Zugangsdaten und darf nie als Quelltext
# ausgeliefert werden. Das passiert nur, wenn PHP ausfällt - deshalb
# zur Sicherheit ausdrücklich absichern:
location = /db-bridge.php {
# Beispiel: nur aus dem eigenen Netz erreichbar. Anpassen oder entfernen,
# wenn die Brücke von außen benutzt werden soll.
# allow 192.168.0.0/16;
# deny all;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
}
# --- Verzeichnislisten abschalten ---
autoindex off;
# --- Uploads klein halten ---
client_max_body_size 4m;
Content-Security-Policy für das Werkzeug
Wenn die Bibliotheken lokal in lib/ liegen, kannst du die Regeln eng ziehen.
unsafe-inline ist nötig, weil Stile und Skript direkt in der HTML-Datei
stehen; unsafe-eval benötigt der JSON-Editor für seine Abfragesprache.
location /json-workbench/ {
add_header Content-Security-Policy
"default-src 'self'; \
script-src 'self' 'unsafe-inline' 'unsafe-eval'; \
style-src 'self' 'unsafe-inline'; \
img-src 'self' data:; \
font-src 'self'; \
connect-src *; \
frame-ancestors 'none'; \
base-uri 'none'" always;
}
connect-src * ist Absicht: URL-Import, Webhook und Datenbankanbindung
sprechen Adressen an, die die Nutzer selbst eingeben. Willst du das
einschränken, trage statt * die erlaubten Ziele ein — dann funktionieren
diese drei Funktionen nur noch mit diesen Zielen.
Lädst du die Bibliotheken doch vom CDN, ergänze bei script-src und
style-src zusätzlich https://cdn.jsdelivr.net.
Apache (.htaccess)
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=()"
Header always set Cross-Origin-Opener-Policy "same-origin"
# Erst aktivieren, wenn HTTPS dauerhaft steht:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>
# Verzeichnislisten abschalten
Options -Indexes
# Versteckte Dateien und Metadaten schützen
<FilesMatch "^\.|(tool\.json|LICENSE|README\.md)$">
Require all denied
</FilesMatch>
# Nur nötig, falls die Domain nicht ohnehin auf HTTPS zwingt
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
Noch ein paar Punkte
- PHP-Version aktuell halten.
index.phpunddb-bridge.phpbrauchen mindestens PHP 8.0. - Fehlermeldungen nicht anzeigen. In der
php.iniproduktivdisplay_errors = Offundlog_errors = On. Eine PHP-Fehlermeldung verrät sonst Pfade und unter Umständen Zugangsdaten. - Keine Backup-Dateien im Web-Verzeichnis. Dateien wie
db-bridge.php.bakoderindex.php~werden als Klartext ausgeliefert. Der Editor-Ordner.gitgehört ebenfalls nicht auf den Webserver — die\.-Regel oben fängt das ab. - Automatische Zertifikatserneuerung prüfen, bevor du HSTS einschaltest.
- Logfile-Aufbewahrung an das anpassen, was in der Datenschutzerklärung steht. Beides muss zusammenpassen.