A02 - Fehlkonfiguration
als Präsentation ▻Auf Platz 2 der OWASP Top 10 2025: Security Misconfiguration.
Sicherheitsrelevante Fehlkonfiguration kann auf jeder Ebene der Anwendung vorkommen: Betriebssystem, Programmiersprache, Framework, Webserver, Programmcode. Die Zusammenarbeit zwischen Entwicklerinnen und Administratorinnen ist wichtig, um eine sichere Konfiguration aller Ebenen zu gewährleisten.
In größeren Projekten / Firmen ist eine Arbeitsteilung üblich zwischen Entwicklung (Development) und Systemadministration (Operations).
Ebenen
Für eine Web-Applikation muss man dabei mindestens folgende Schichten beachten:
- Physikalische Sicherheit (Wer kann den Server ein- und ausschalten, zerlegen,…)
- Virtualisierungs-Schicht, z. B. VMware
- Betriebssystem, z. B. Ubuntu, CentOS, Debian
- Datenbank, z. B. PostgreSQL, MySQL, MongoDB
- Programmiersprache/Interpreter, z. B. PHP, Ruby, node.js, Python
- Webserver, z. B. Apache, nginx, caddy, traefik,…
- Framework, z. B. Laravel, Symphony, Rails, nest.js, flask, …
- Fremd-Applikation, z. B. WordPress, Redmine
- Selbstgeschriebener Code der Applikation
Jede dieser Schichten gilt es, richtig zu konfigurieren und Sicherheits-Updates einzuspielen.
Wenn es eine Arbeitsteilung zwischen Development (Leute die Programmieren) und Operations (Leute die die Infrastruktur betreiben) gibt, muss geklärt sein, wer für welche Schicht zuständig ist.
Hardening
Hardening bedeutet: eine Software so konfigurieren, dass nur das erlaubt ist, was wirklich gebraucht wird — alles andere wird abgeschaltet. Man verkleinert damit die “Angriffsfläche”.
Zwei Szenarien:
- Entwicklungs-Rechner: möglichst viele Debug-Möglichkeiten, Bequemlichkeit wichtiger als Sicherheit
- Produktions-Server: Sicherheit wichtiger als Bequemlichkeit, Logging / Monitoring ja, aber nicht öffentlich zugänglich
Dafür gibt es oft schon fertige Konfigurationen, oder Tutorials.
PHP Hardening: php.ini
PHP wird über die Datei php.ini konfiguriert. Viele Einstellungen, die man dort standardmäßig findet,
sind für die Entwicklung gedacht — auf einem Produktionsserver sind sie ein Sicherheitsrisiko.
Ein typisches Beispiel: Fehlermeldungen. Auf dem Entwicklungsrechner will man Fehler direkt im Browser sehen. Auf dem Produktionsserver würde das Angreifer*innen wertvolle Hinweise geben (Dateinamen, Datenbankstruktur, Bibliotheksversionen):
display_errors = On
error_reporting = E_ALLdisplay_errors = Off
log_errors = On
error_log = /var/log/php/errors.logWeitere wichtige PHP-Einstellungen für den Produktionsserver:
| Einstellung | Entwicklung | Produktion | Grund |
|---|---|---|---|
display_errors | On | Off | Fehlermeldungen nicht öffentlich zeigen |
expose_php | On | Off | PHP-Version nicht im HTTP-Header verraten |
allow_url_include | On | Off | Einbinden von Remote-Dateien verbieten |
session.cookie_httponly | — | 1 | Session-Cookie vor JavaScript schützen |
session.cookie_secure | — | 1 | Session-Cookie nur über HTTPS senden |
Mit expose_php = Off wird z.B. verhindert, dass der Server in jedem HTTP-Response den Header X-Powered-By: PHP/8.2.1 mitschickt — diese Versionsinformation hilft Angreifer*innen dabei, bekannte Sicherheitslücken gezielt auszunutzen.