Files
Software-Uebersicht/webserver-sicherheit.md

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.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.