Härtung für Hoster
Diese Seite ist für Systemadministratoren und Sicherheitsverantwortliche eines Hosters, die die Server-Vorlage bauen, aus der jede Exponential-Website angelegt wird. Sie geht die Schichten einer Website von außen nach innen durch, sagt, was Exponential standardmäßig tut, und nennt die Einstellung oder den Befehl, die der Hoster setzt oder prüft. Sie folgt der Reihenfolge von Kapitel 13 des Installationsbuchs, das jedes Detail enthält, und der Sicht Bedrohung für Bedrohung von Sicherheitshärtung.
Warnung
.htaccessbremst jede Anfrage. Sind.htaccess-Dateien erlaubt (AllowOverridealles außerNone), geschweige denn genutzt, sucht Apache sie bei jeder Anfrage in jedem Verzeichnis des Pfads und liest und wertet sie aus, und die Ladezeiten der Seiten steigen drastisch (gemessen). Die einzige wirkliche Abhilfe ist, die Funktion für den virtuellen Host abzuschalten:AllowOverride Noneim virtuellen HTTPS-Host, und die Regeln in der Konfiguration des virtuellen Hosts selbst als mod_rewrite-Regeln. Das ist in Geschwindigkeitstests im Produktivbetrieb weit schneller und die Zeit für die Optimierung einer Produktivkonfiguration unbedingt wert. Stellen Sie sofort um: Übernehmen Sie die Regeln des Beispiels für einen virtuellen HTTPS-Host in Ihren virtuellen Host (mit dem statischen Cache auchstaticcache_offload.conf), setzen SieAllowOverride None, führen Sieapachectl configtestaus, laden Sie Apache neu und testen Sie die Website. Dieselben Regeln für andere Server: nginx, LiteSpeed, Caddy, IIS, Velocity (eingebaut); wohin Regeln für virtuelle Hosts in einem Control Panel gehören: Plesk, cPanel, DirectAdmin, ISPConfig. Unter LiteSpeed oder OpenLiteSpeed kann zusätzlich der Seiten-Cache des Servers anonyme Besucher und Crawler ohne PHP bedienen: Seiten-Caching mit LiteSpeed und OpenLiteSpeed.
Hinweis Einstellungen werden in Überschreibungen geändert, nie in den mitgelieferten Dateien:
settings/override/<file>.ini.append.phpfür die ganze Installation,settings/siteaccess/<siteaccess>/<file>.ini.append.phpfür einen Siteaccess. Leeren Sie nach einer Änderung den INI-Cache (php bin/php/ezcache.php --clear-tag=ini), und führen Sie unter Velocityexp:velocity deployaus (Kapitel 13).
Inhalt
- Die Prinzipien
- Ausgelieferte Dateien
- Geheimnisse
- Debug-Ausgabe
- Administration, Passwörter und Sitzungen
- Header, TLS und Proxys
- Dateien, Benutzer und Prozesse
- Beobachten
- Ein Schutz davor
- Updates
- Checkliste für die Server-Vorlage
Die Prinzipien
Sicherheitshärtung misst Exponential an der Arbeitsweise von OpenBSD: standardmäßig sicher, geringste Rechte, Trennung von Rechten, minimale Angriffsfläche, Audit und Korrektur nach vorn. Für einen Hoster heißt das vor allem eine Regel: Lockern Sie keinen Standard, damit etwas funktioniert; finden Sie die Ursache. Ein Support-Ticket, das damit endet, dass die Rewrite-Regel ausgeschaltet wurde, hat auf dieser Website eine Lücke geöffnet.
Ausgelieferte Dateien
Der Document Root von Exponential ist das Wurzelverzeichnis der Installation, sodass settings/, var/, vendor/ und die
SQLite-Datenbank darin liegen. Die Sicherheit kommt vom Routing: Nur eine feste Liste von Asset-Pfaden wird als Dateien ausgeliefert,
alles andere geht an index.php (13.2).
| Webserver | Was der Hoster tut |
|---|---|
Apache, LiteSpeed mit .htaccess | cp .htaccess_root .htaccess oder ./console exp:setup:htaccess --apply; nach jedem Upgrade vergleichen und neue Regeln einfügen (./console exp:setup:htaccess gibt den Diff aus und endet mit Exit-Code 1, solange die Datei abweicht, eine Abweichungsprüfung für das Monitoring) |
| nginx | der abgeleitete Server-Block aus 8.6, mit den Regeln für Dateien mit Punkt und für Skripte vor jeder statischen Location |
| Velocity | nichts; FollowSymlinks=disabled (der Standard) verweigert auch Links aus der Wurzel hinaus |
| jeder | nie eine allgemeine Konfiguration „Datei ausliefern, wenn sie existiert“ |
Prüfen Sie nach jeder Änderung der Konfiguration des Webservers von außen:
for p in /.git/config /.env /settings/site.ini /composer.json /kernel/classes/ezini.php /var/log/error.log; do
printf '%-32s %s\n' "$p" "$(curl -s -o /dev/null -w '%{http_code}' https://example.com$p)"
doneJede Zeile muss 404 zeigen, oder 200 mit einer Exponential-Seite und nie dem Inhalt der Datei. Details zu Webservern:
Einen Webserver wählen und Kapitel 8.
Geheimnisse
settings/override/ enthält das Datenbankpasswort (site.ini.append.php), die Signatur- und Pseudonymschlüssel des Audits
(audit.ini.append.php), das Website-Geheimnis der E-Mail-Einstellungen (mailpreferences.ini.append.php, das auch den
Passwort-Stempel der Sitzung schlüsselt) und, wenn gesetzt, das Token des Dashboards von Velocity
(13.3).
- Modus
0640oder strenger, nie in der Versionsverwaltung, nie an einem öffentlichen Ort. - Sichern Sie es als Geheimnis, verschlüsselt, mit der Datenbank (Was gesichert werden muss).
- Kopieren Sie es bei jedem Umzug der Website mit. Eine Kopie ohne
mailpreferences.ini.append.phperzeugt ein neues Website-Geheimnis: Alte Abmeldelinks passen nicht mehr, und jeder Benutzer wird einmal abgemeldet. - Entfernen Sie
kickstart.iniundvar/log/initial-admin-passwordnach der Bereitstellung (Erste Anmeldung und Standardpasswörter).
config.php im Wurzelverzeichnis der Installation kann das Passwort der Cluster-Datenbank enthalten
(CLUSTER_STORAGE_PASS). Behandeln Sie sie wie settings/override/:
- Modus
0640mit der Gruppe des Webservers (chmod 0640 config.php); spätere Änderungen mitexp:config:setbehalten diesen Modus. Ein Geheimnis in einer für alle Benutzer lesbarenconfig.phperzeugt eineWARN:-Zeile. - Nie in der Versionsverwaltung:
/config.phpgehört in die.gitignoredes Projekts (das Repository von Exponential enthält nurconfig.php-RECOMMENDED). - Die Konsole maskiert die Werte von Namen mit
PASS,SECRET,KEY,TOKEN,CREDENTIALoderPWDals********;--show-secretszeigt sie, fügen Sie solche Ausgaben also nicht in ein Ticket ein. exp:setup:*undexp:config:*sichern jede Datei, die sie ersetzen oder ändern, nachvar/backup/setup/<zeit>/odervar/backup/config/<zeit>/(Verzeichnisse0700, von den Befehlen nie gelöscht). Schützen Sievar/backup/mit und räumen Sie es auf (.htaccess und config.php von der Konsole einrichten).
Debug-Ausgabe
[DebugSettings] DebugOutput=disabled und [TemplateSettings] Debug=disabled werden ausgeschaltet ausgeliefert. Lassen Sie sie aus. Wenn
der Support eine Live-Website debuggen muss, beschränken Sie es auf die Adresse des Support-Desks und entfernen den Eintrag wieder:
# settings/override/site.ini.append.php
[DebugSettings]
DebugOutput=enabled
DebugByIP=enabled
DebugIPList[]
DebugIPList[]=203.0.113.10In der php.ini oder im Pool von PHP-FPM: display_errors=Off, log_errors=On, expose_php=Off
(13.4). Hinter einem Proxy ist DebugByIP nur so
verlässlich wie TrustedProxies[] (siehe TLS und HTTPS).
Administration, Passwörter und Sitzungen
| Thema | Standard | Teil des Hosters |
|---|---|---|
| Siteaccess der Administration | RequireUserLogin=true | ein eigener Hostname, Einschränkungen im Netzwerk: Die Administration einschränken |
| Setup-Assistent | auf einer installierten Website geschlossen; CheckValidity=false vom Installer geschrieben | [SetupSettings] AllowWizardOnInstalledSite=disabled beibehalten |
| Passwörter | MinPasswordLength=10, WeakPasswordCheck=enabled, bcrypt | eine Richtlinie anbieten wie MinPasswordLength=15, ForbidLogin, ForbidCurrentPassword (13.6) |
| Sperre | MaxNumberOfFailedLogin=0 (aus) | mit dem Kunden entscheiden; eine Sperre lässt auch jeden ein bekanntes Konto sperren |
| Zweistufige Anmeldung | Erweiterung von composer.json verlangt und von den Installern aktiviert; Enforce2FA=disabled | Enforce2FA für Administratoren empfehlen: Zweistufige Anmeldung |
| Sitzungscookie | HttpOnly, SameSite=Lax, CookieSecure=auto | CookieSecure=true auf Websites nur mit HTTPS (13.7) |
| Formular-Tokens | ezformtoken aktiv | in ActiveExtensions[] behalten (13.8) |
| Konfiguration aus Git | ManagedByDeployment=disabled | enabled auf Siteaccesses der Administration in der Produktion, wenn Einstellungen und Templates aus der Versionsverwaltung kommen |
Eine Passwortänderung meldet jede andere Sitzung dieses Benutzers ab ([PasswordSettings] EndOtherSessions=enabled). Lassen Sie es an:
Das macht eine Passwortänderung nützlich, nachdem ein Konto übernommen wurde.
Header, TLS und Proxys
Fünf Sicherheitsheader gehen auf jeder Seite hinaus (X-Content-Type-Options, X-Frame-Options,
Content-Security-Policy: frame-ancestors 'self', Referrer-Policy, Permissions-Policy); HSTS ist aus, bis es eingeschaltet wird.
Apache und nginx fügen statischen Dateien von sich aus nichts hinzu. Der Teil des Hosters:
- HTTPS auf jedem Namen, HTTP umgeleitet, HSTS erhöht, sobald alles funktioniert: TLS und HTTPS.
- Die volle Richtlinie (
script-src,style-src) ist in der Auslieferung auf der Administration im Berichtsmodus: Content Security Policy. - Hinter einem Load Balancer, CDN oder Proxy eines Panels: Führen Sie genau Ihre Proxys in
site.ini [HTTPHeaderSettings] TrustedProxies[]auf (Velocity:Q.webserver.proxy.trusted), und stellen Sie sicher, dass der Anwendungsserver nicht an ihnen vorbei erreichbar ist (13.10).
Dateien, Benutzer und Prozesse
Wenn der PHP-Prozess nur var/ und settings/ ändern kann und der Webserver sich weigert, irgendetwas unterhalb der Wurzel auszuführen,
kann eine Schwachstelle in einer Erweiterung keinen Code einschleusen
(13.11).
- Ein Benutzer schreibt: PHP-FPM-Pool, Velocity-Worker, Cronjobs und Konsolenskripte laufen als Benutzer der Website.
- Der Code (
kernel/,lib/,vendor/,index.php) gehört einem anderen Benutzer und ist für den Benutzer der Website nur lesbar. - Keine für alle beschreibbaren Dateien. Die mitgelieferten Werte in
[FileSettings]sind0777und0666; setzen Sie die gehärteten:
# settings/override/site.ini.append.php
[FileSettings]
StorageDirPermissions=0770
StorageFilePermissions=0660
TemporaryPermissions=0770
LogFilePermissions=0660TemporaryDirwird als/tmp/ausgeliefert, mit jedem Benutzer der Maschine geteilt; geben Sie jeder Website ein eigenes untervar/.- Velocity:
[ServerSettings] Host=127.0.0.1, wenn ein Proxy davor ist,UserundGroupauf den Benutzer der Website gesetzt,AllowRootWorkers=disabled, Token des Dashboards und Passwort des Kontrollzentrums gesetzt oder die Ansichten lokal gehalten (13.12).
Wie das auf viele Kunden skaliert: Benutzer und Pools pro Kunde und Beschreibbare Verzeichnisse und Berechtigungen.
Beobachten
Härtung ohne Beobachtung verzögert nur den Moment, in dem Sie von einem Angriff erfahren.
| Quelle | Was sie festhält | Seite für den Hoster |
|---|---|---|
var/log/security.log | die Urteile des Request-Klassifizierers: Abtastungen, Traversal, Injection, Angriffswerkzeuge, Häufungen von 404 | Sicherheitslog |
| das Prüfprotokoll | Anmeldungen, Änderungen an Rollen und Einstellungen, Entfernungen, Befehle; als Hash-Kette | Prüfprotokoll |
var/log/auth.log | jeden Schritt der zweistufigen Anmeldung (nie einen Code oder ein Geheimnis) | Zweistufige Anmeldung |
var/log/csp.log | Verstöße gegen die Content Security Policy | Content Security Policy |
Führen Sie die Cronjob-Gruppe frequent aus, damit die Alarmregeln des Audits laufen, leiten Sie das Protokoll mit einer Senke von der
Maschine weg und lesen Sie security.log wöchentlich
(Sicherheitshärtung).
Ein Schutz davor
Request Shield, eine kleine Web Application Firewall für PHP vom CJW
Network, weist Scanner und Fluten ab, bevor der Kernel startet. Seit 6.0.15 ist er Teil der Standardinstallation: Die
Erweiterung exp_request_shield bringt ihn mit, und eine Hook-Zeile in config.php führt ihn aus, wie installiert
durchsetzend, unter PHP-FPM und Velocity gleichermaßen. Eine aktualisierte Installation trägt die Hook-Zeile selbst in
config.php ein, da ein Update diese Datei nie überschreibt. Ein Hoster kann ihn auf jeder Website unter
Setup > Request Shield prüfen und seine Abstimmung als Teil eines verwalteten Tarifs anbieten:
request-shield und Request-Regeln,
Request Shield.
Updates
Nur die Linie 6.0 erhält Sicherheitskorrekturen, veröffentlicht als nächstes Release 6.0.x. Verfolgen Sie Releases, aktualisieren Sie zuerst eine Kopie, prüfen Sie nach jedem Update die Konsistenz der Dateien, und halten Sie auch PHP, den Datenbankserver, das Betriebssystem und die Engine von Velocity aktuell: Sicherheitsupdates und Offenlegung.
Checkliste für die Server-Vorlage
- To do: Rewrite-Regeln: eine aktuelle Kopie von
.htaccess_root, der abgeleitete nginx-Block oder Velocity; die Prüfung von außen liefert keine Datei. - To do: SOAP nur, wo ein Kunde es braucht:
index_soap.phpdurchgelassen (vor 6.0.15 hieß essoap.php) und auf die Adressen der Aufrufer beschränkt;soap.phpabgelehnt, sobald es niemand mehr aufruft (Das SOAP-Einstiegsskript heißt jetzt index_soap.php). - To do:
settings/override/mit Modus0640oder strenger, außerhalb der Versionsverwaltung, verschlüsselt gesichert. - To do:
config.phpmit Modus0640, außerhalb der Versionsverwaltung;var/backup/geschützt und aufgeräumt. - To do: Die Bereitstellung entfernt
kickstart.iniundvar/log/initial-admin-passwordund hinterlässt nie ein bekanntes Passwort. - To do:
DebugOutput=disabled; PHPdisplay_errors=Off,expose_php=Off. - To do: Administration auf einem eigenen Hostnamen, eingeschränkt durch Netzwerk, VPN oder die Browserprüfung des Schutzes.
- To do:
CheckValidity=false,AllowWizardOnInstalledSite=disabled. - To do:
ezformtokenaktiv;EndOtherSessions=enabled. - To do: HTTPS auf jedem Namen, HTTP umgeleitet,
CookieSecure=true, HSTS erhöht, sobald es stabil ist. - To do:
TrustedProxies[]nennt genau Ihre Proxys oder bleibt beim Standard Loopback. - To do: Ein Benutzer des Betriebssystems pro Website; Code für ihn nur lesbar; gehärtete
[FileSettings]; eigenesTemporaryDir. - To do: Velocity hinter einem Proxy an
127.0.0.1gebunden; Worker nie als root. - To do: Cronjob-Gruppe
frequentläuft als Benutzer der Website; Empfänger der Alarme des Audits geprüft; eine Senke konfiguriert. - To do: Eine Routine für Updates mit benannten Verantwortlichen.
Die Go-Live-Liste Einstellung für Einstellung ist 13.16; die wiederkehrende Prüfung ist die Checkliste für die Sicherheitsprüfung.
Der Demomodus bleibt aus. EXP_DEMO_MODE=1 installiert und behält ein bekanntes Administratorpasswort; setzen Sie es nur für den eigenen Pool, virtuellen Host oder die eigene Unit einer öffentlichen Demo, nie serverweit oder in einer Vorlage, und lösen Sie bei Zeilen demo/mode in security.log von Kunden-Websites einen Alarm aus. Demomodus für Hoster.
Verwandte Seiten
- Sicherheit für Hoster: Überblick
- Sicherheitshärtung
- Kapitel 13: Sicherheitshärtung für die Produktion
- Checkliste für einen neuen Server
- Kompromittierte Website
- .htaccess und config.php von der Konsole einrichten
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.