# 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 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" # Verzeichnislisten abschalten Options -Indexes # Versteckte Dateien und Metadaten schützen Require all denied # Nur nötig, falls die Domain nicht ohnehin auf HTTPS zwingt RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ``` --- ## 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.