130 lines
4.6 KiB
Markdown
130 lines
4.6 KiB
Markdown
# 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:
|
|
|
|
```nginx
|
|
# --- 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.
|
|
|
|
```nginx
|
|
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)
|
|
|
|
```apache
|
|
<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.php` und `db-bridge.php` brauchen
|
|
mindestens PHP 8.0.
|
|
- **Fehlermeldungen nicht anzeigen.** In der `php.ini` produktiv
|
|
`display_errors = Off` und `log_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.bak` oder `index.php~` werden als Klartext ausgeliefert. Der
|
|
Editor-Ordner `.git` gehö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.
|