Die Haustür zweimal abschließen aber die Terrassentür offen lassen ist genauso nützlich wie ein Joomla!-Sicherheitskonzept, was nicht alle Aspekte, sprich Software, Server, Sicherungen beachtet. In diesem Blogpost will ich auf verschiedene Stellen eingehen.
Updaten, Updaten, Updaten
Das A und O einer sicheren Seite ist eine sichere Software, die sich immer auf dem aktuellen Stand befindet. In wahrscheinlich jeder Software gibt es Fehler und teilweise auch Sicherheitslücken. Wenn diese entdeckt werden, ist es wichtig, dass sie sofort geschlossen werden.
Der Joomla!-Core
Joomla! hat ein sehr gutes und aktives Security-Team, das gemeldete Sicherheitslücken sehr zeitnah schließt und in eine neue Version verpackt. Dank des integrierten "Ein-Klick-Updaters" in Joomla! sollte es kein Problem sein, das Core-System aktuell zu halten. Die Frage ist nun, wie erfährt man von einem Update? Auch hier hat Joomla vorgesorgt. Von Haus aus wird ein System-Plugin (Erweiterungen => Plugins) mitgeliefert, das bei neuen Joomla! Versionen eine Email an alle (oder nur ausgewählte) Super User versendet. Wichtig: das Plugin muss natürlich aktiviert werden.
Desweiteren ist es empfehlenswert, die aktuelle Joomla! Release News Seite im Blick zu behalten. Hier wird jedes Release verkündet und man kann den Blog praktisch als RSS-Feed abonnieren. Das gleiche gilt für die Sicherheitsmeldungen für Joomla!.
3rd-Party-Erweiterungen
Unter Drittparty-Erweiterung versteht man jede Erweiterung (Plugin, Modul, Komponente, Template, Sprachdatei, Script), die nicht mit dem original Joomla! Installationspaket mitgeliefert wird. Im Joomla!-Umfeld gibt es keine Qualitätskontrolle für diese Fremdanbieter, das bedeutet, jeder darf Erweiterungen erstellen und verteilen, ob er/sie die Programmierfähigkeit hat oder auch nicht.
Hier wird es schon komplizierter, eine Update-Strategie zu finden. Idealerweise hat der Entwickler einen eigenen Updateserver. Das bedeutet, neue Versionen der Erweiterung werden automatisch im Backend der Seite angekündigt.
Die Krux hier ist, man muss sich aktiv ins Backend einloggen, es wird vom System keine Email versendet wenn ein Update zur Verfügung steht. Deshalb sollte man sich weitere Quellen bereit halten, die einen mit neusten Updateinformationen versorgen.
Hier ist ganz klar die J!VEL (Joomla! Vulnerable Extensions List) zu empfehlen. Dies ist eine der größten Anlaufstellen für unsichere Erweiterungen. Auch hier gilt es wieder den RSS-Feed per Email zu abonnieren, um sofort eine Beachrichtigung zu erhalten, falls eine genutzte Erweiterung als unsicher gemeldet wurde.
Um sich hier Arbeit zu sparen ist es auch sinnvoll, sich erstmal einen Überblick über alle installierten Erweiterungen zu verschaffen (Erweiterungen => Verwalten) und jede Erweiterung, die nicht mehr genutzt wird, zu deinstallieren (nicht nur deaktivieren). Denn: je weniger Erweiterungen installiert sind, desto weniger potenzielle Einfallstore sind vorhanden. Mittlerweile kann man mit Custom Fields eine Menge abdecken; auch sollte man es sich zweimal überlegen, ob man nicht doch den Joomla! Standardeditor verwendet oder das Kontaktformular um notwendige Felder erweitert. Selbst für ein Impressum braucht es keine eigene Erweiterung, man nutzt dafür einfach die interne Artikelverwaltung von Joomla!.
Nicht unerwähnt lassen möchte ich Services wie myjoomla oder watchful.li. Diese Anbieter bieten eine Oberfläche an, mit der man all seine Seiten mit einem Klick aktuell halten und u.a. auch Sicherheitsaudits durchführen lassen kann. Soweit eine gute Idee, aber ich bin immer skeptisch und denke nicht, dass man einer völlig fremden Person Vollzugriff auf seine Seite geben sollte (und ja, das tut man bei diesen Services).
- Joomla! aktuell halten
- Das System - Joomla!-Aktualisierungsmitteilung Plugin aktivieren
- Dritterweiterungen aktuell halten
- Unnötige Dritterweiterungen deinstallieren
- J!VEL abonnieren
.htaccess anpassen
Als nächstes solltest du deine .htaccess scharf schalten. Joomla! liefert eine htaccess.txt aus, die schon einen sehr rudimentären Schutz bietet. Um die Datei scharf zu schalten, benenne sie in .htaccess um (ja, der . (Punkt) vor dem Dateinamen ist Absicht. Falls du Windows auf deinem PC verwendest, musst du das wahrscheinlich direkt online machen, da Windows mit solchen Dateinamen nicht klar kommt)
Als nächstes geht es nun um den Schutz durch die .htaccess selbst. Hier lege ich dir ganz klar ans Herz, dein Administrator-Verzeichnis per .htaccess abzusichern. Somit sind direkte Angriffe auf das Backend schon mal wirkungslos.
Nun geht es um ein paar Befehle für das Frontend. In unserem Sicherheitskonzept sagen wir: niemand soll auf irgendwas zugreifen, außer wir erlauben es. Das führt im ersten Schritt dazu, dass wir erstmal die Seite komplett sperren.
<Files "*.*"> Deny from all </Files>
Wirst du nun deine Seite aufrufen, wirst du eine Server-Fehlermeldung erhalten, dass der Zugriff verboten wurde, denn "*.*" ist ein Ausdruck, der sagt: folgender Befehl gilt für jede Datei. Deny from all sperrt dann jede dieser Dateien. Natürlich wollen wir dem Besucher die Seite trotzdem anbieten. Also erlauben wir ihm Zugriff auf die Standard index.php und fügen in einer neuen Zeile folgenden Code hinzu.
<FilesMatch "index\.php"> Allow from all </FilesMatch>
Nun geht zumindest die Webseite wieder, aber es werden keine Bilder, Schriften, CSS, JS geladen (da diese ja von uns gesperrt wurden). Deshalb erlauben wir nun jede Dateiendung, die wir benötigen:
<FilesMatch "\.(?i:js|css|png|jpg|jpeg|gif|ico|ttf|woff|woff2|html)|index\.php"> Allow from all </FilesMatch>
Diese Liste kann nun beliebig erweitert werden. Die Pipe | steht hierbei für ein "oder", die Klammer gruppiert die Ausdrücke. In diesem Fall sagen wir, dass wir jede Datei erlauben, die ein Punkt enthält, gefolgt von "js" oder "css" oder "png", ... oder einfach index.php heißt. Die Endungen in der Klammer können nun beliebig erweitert werden (bietest du z.B. Word-Dokumente zum Download an, muss "docx" hinzugefügt werden, bei PDF-Dateien "pdf" etc.). Der Befehl ?i: sorgt dafür, dass die Groß-Kleinschreibung ignoriert wird.
An dieser Stelle empfiehlt es sich, mit geöffneter Entwicklerwerkzeug-Konsole (das haben die meisten Browser on Board) auf der Seite zu surfen und darauf zu achten, ob es beim Versuch eine Datei zu laden zu 403 bzw. 404 Fehlermeldungen kommt. Diese Datei muss dann entsprechend freigegeben werden. Auch wenn verschiedene Anbieter (z.B. Google Analytics) zur Verifizierung der Domain eine bestimmte Datei anfordern, muss diese eingetragen werden.
Als letztes sollten noch zwei spezielle Dateien freigegeben werden, zum einen ist das die robots.txt und eine restore.php. Die erste Datei ist für Suchmaschinen; in dieser steht drin, welche Ordner die Suchmaschine nicht besuchen soll (liegt Joomla! schon bei) und das zweite ist der Joomla!-Updater. Dieser verläuft über eine eigene Datei und wir müssen diese auch freigeben, ansonsten funktionieren die Joomla!-Updates nicht mehr:
<FilesMatch "\.(?i:js|css|png|jpg|jpeg|gif|ico|ttf|woff|woff2|html)|index\.php|restore\.php|robots\.txt"> Allow from all </FilesMatch>
Nun da der allgemeine Schutz steht, können nun gezielt unerwünschte Anfragen abgeblockt werden. Hier sei eine Warnung angebracht: Die nächsten Befehle sperren Besucher (oder Bots, je nachdem) gezielt anhand vorher definierten Muster aus. Es kann aber immer vorkommen, dass diese Muster völlig legitime Aufrufe sind, deshalb gibt es auch keine "Allheillösung" sondern nur eine Anleitung wie man es nutzt, welche Filter man dann tatsächlich anwendet muss jeder für sich selbst herausfinden.
# Blockieren aller Anfragen, die nicht POST oder GET sind RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|put|trace|track) [NC,OR] # Blockieren von allen Anfragen, die im URL-Query-String den begriff "xxx" enthalten (kann individuell angepasst werden) RewriteCond %{QUERY_STRING} xxx [NC,OR] # Verschiedene User Agents blockieren RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget) [NC,OR] # Referer Spam blocken RewriteCond %{HTTP_REFERER} example.com [NC,OR] # 403 Werfen RewriteRule ^(.*)$ - [R=403,L]
- Backend absperren
- Zugriff auf alle Dateien sperren (und nur die erlauben, die wirklich nötig sind)
- Informieren über verschiedene Filtermethoden um gezielte Angriffe abzublocken
Server richtig einstellen
Wie oben schon geschrieben ist ein System nur so gut wie die Software die darauf läuft. Das gilt nicht nur für Joomla! und dessen Erweiterungen sondern fängt schon eine Ebene tiefer an: auf dem Server.
Hier sollte darauf geachtet werden, dass immer eine aktuelle PHP, Apache und mySQL-Version installiert ist. Idealerweise immer am Maximum, den Joomla! unterstützt. Auf joomla.org gibt es eine Übersicht, wobei diese sehr defensiv formuliert ist, das heißt, es lohnt sich durchaus auch neuere Versionen zu testen.
Apache konfigurieren
Der Apache-Server bietet viele Möglichkeiten, sicher konfiguriert zu werden. Aus dem großen Pool an Möglichkeiten möchte ich exemplarisch die HTTP-Security-Header erwähnen. Mit diesen kann man z.B. relativ effektiv XSS-Angriffe unterbinden. Eine ausführliche Erklärung würde den Rahmen hier sprechen, aber folgende Stichpunkte helfen bei der Eigenrecherche:
Content-Security Policy Public-Key-Pins Strict-Transport-Security X-Content-Type X-Frame-Options X-XSS-Protection
Heutzutage ist es aber definitiv nicht mehr cool, noch mit einer PHP 5.x zu arbeiten. Auch 7.0 oder 7.1 sind fast schon grenzwertig. Also hier immer relativ offensiv mit neuen (stabilen!) Versionen arbeiten.
PHP selbst hat über eine php.ini viele verschiedene Einstellungsmöglichkeiten um die Seite ein bisschen sicherer zu machen. Hier ein paar gelistet:
# Keine Fehler anzeigen display_errors=Off # Das Laden von externen URLs über z.B. file_get_contents(...) verbieten allow_url_fopen=Off # das Einbinden von fremden URLs über include/require Befehle verbieten allow_url_include=Off # Die maximale Größe, die die Daten (z.B. Dateien) eines kompletten Formulars haben dürfen. # Muss z.B. bei einem Frontend-Upload erhöht werden. Je kleiner der Wert, desto besser post_max_size=2M # Sekunden, die für den Aufruf einer Seite verbraucht werden darf, je weniger, desto besser max_execution_time=30 # Speicherverbrauch (RAM), den ein Aufruf verbrauchen darf memory_limit=16M
PHP selbst liefert verschiedene vorkompilierte Pakete mit, wie z.B. Verschlüsselungen, diese sollten auch immer auf der neuesten Version sein.
Auch hier kann man keine pauschale Empfehlung geben außer: je kleiner desto besser. Aber du musst selbst ausprobieren, was für deine Webseite funktioniert. Nun stellst du vielleicht fest, dass du in deinem Hostingaccount weder die PHP-Version noch die php.ini bearbeiten kannst? Da kann ich nur eins empfehlen: so schnell wie möglich den Hoster wechseln. Heutzutage gibt es viele günstige Anbieter, die diese Funktionen anbieten, da lohnt es sich nicht, auf einem veralteten Modell stehen zu bleiben.
- PHP, SQL, Apache, etc. aktualisieren
- PHP, SQL, Apache sicherer konfigurieren
Login schützen
Ein interessantes Einfallstor ist auch immer der Super User Login. Wenn dieser geknackt wird, dann hat der Hacker Vollzugriff auf die Webseite. Aber auch eingeschränkte Accounts können, wenn geknackt, Schaden anrichten. Deshalb ist es wichtig, hier verschiedene Sicherheitsfeatures zu nutzen.
Benutzername und Passwort
Der erste Benutzername in Joomla! wird automatisch vorgeschlagen: admin. Hier solltest du direkt ansetzen und einen neuen vergeben.
Das Passwort ist der nächste Angriffspunkt. Dies sollte von dir nur einmal verwendet werden (d.h. für jeden von dir genutzten Dienst solltest du ein eigenes Passwort vergeben) und eine entsprechend hohe Komplexität aufweisen. Ansonsten musst du jedesmal, wenn ein System kompromitiert wurde (und ja, es hat schon viele erwischt: Sony um nur mal eins zu nennen) überall deine Passwörter ändern.
Es gibt verschiedene Arten im Browser oder in unterschiedlichen Programmen, Passwörter zu speichern. Das bedeutet, du selbst musst dir all die Passwörter gar nicht merken sondern nur ein Master-Passwort. Sie liefern auch meistens einen Zufalls-Passwortgenerator mit. Wenn nicht, gibt es viele im Internet. 16-20 Stellen, Groß-Kleinschreibung, Buchstaben, Zahlen und Sonderzeichen. Das regelmäßige Ändern eines Passwortes ist wiederum nicht sinnvoll.
2FA (Zwei-Faktor-Autorisierung)
Seit vielen Jahren gibt es in Joomla! die Möglichkeit, seinen Account mit einer 2FA zu schützen. Das Prinzip ist sehr einfach: es gibt eine externe Quelle, die Einmalpasswörter/Hashes generiert, die zusätzlich zum Benutzername und dem Passwort eingegeben werden. Das kann eine (kostenpflichtige) Hardwarelösung (Yubikey) oder eine (kostenlose) Softwarelösung (Google Authenticator) sein.
Um diese Lösung zu aktivieren, musst du im Backend unter "Erweiterungen => Plugins" die entsprechenden Plugins aktivieren und kannst dann in jedem User-Account die entsprechenden Dienste aktivieren.
Benutzerregistrierung
In Joomla! ist es möglich, dass sich Gäste auf der Seite anmelden und zu registrierten Benutzern werden. Falls diese Funktion nicht gebraucht wird, empfiehlt es sich, sie einfach in den Optionen auszuschalten.
Falls eine Registrierung benötigt wird, ist die sicherste Einstellung, dass ein Administrator den Benutzer manuell freischaltet oder zumindest ein Benutzer seinen Account per Email verifizieren muss.
Wichtig sind auch die Benutzergruppen für registrierte Benutzer und Gäste. Hier sollte überprüft werden, welche davon gesetzt sind und welche Rechte der entsprechende Benutzer dann haben wird. Dies kann sehr einfach über den erweiterten Berechtigungsbericht abgefragt werden. Dazu musst du bei den Benutzergruppen die entsprechende Information anklicken:
Das funktioniert, nebenbei bemerkt, auch für einzelne Benutzer. Im sich öffnenden Fenster siehst du für jede Erweiterung was die Gruppe darf. Je weniger desto besser.
- Standard-Benutzername ändern
- Sicheres Passwort setzen
- 2FA aktivieren
- Registrierung überprüfen
Sichere Verbindungen und FTP
Als nächstes wird es Zeit, ein Zertifikat zu besorgen. Seit Let's Encrypt sollte niemand mehr eine Ausrede haben, kein SSL für seine Webseite zu aktivieren. Verschiedene Zertifkate können beim Hoster bestellt und eingerichtet werden. Wenn nicht => Hoster wechseln.
SSL-Zertifikate verschlüsseln die Verbindung zwischen Webserver und Browser des Besuchers. Damit wird sichergestellt, dass z.B. die Übertragung von Logindaten beim Login nicht abgehört und missbraucht werden können. Gleichzeitig erlaubt es im Regelfall auch FTP Zugänge über SFTP zu verbinden. Also eine verschlüsselte Verbindung.
Meine Erfahrung hat gezeigt, dass neben unsicheren Dritterweiterungen, meistens über abgegriffene FTP-Zugänge gehackt wird. Deshalb sollte man die Zugangsdaten niemals irgendwo speichern (verschiedene Viren lesen diese gerne vom System aus), immer über eine gesicherte Verbindung arbeiten und das Passwort entsprechend sicher wählen.
- SSL-Zertifikat für Webseite und FTP aktivieren
Backups
"Kein Backup - kein Mitleid", ein geflügelter Spruch im Joomla!-Umfeld. Eine der wichtigsten Sicherheitsmaßnahmen ist ein regelmäßiges Backup. Denn wenn doch mal der GAU eintritt, dann kann man relativ einfach auf einen sauberen Stand zurückgreifen und die Seite wieder online bringen (natürlich erst, nachdem man die Lücke geschlossen und sichergestellt hat, dass das Backup nicht schon gehackt ist).
Um ein Backup zu machen gibt es mehrere Möglichkeiten:
- Akeeba Backup - eine etablierte Backuperweiterung für Joomla!
- per Hand Datenbank exportieren und alle Dateien herunterladen
- per Shell-Script über die Konsole
Zwei Sachen sind hierbei wichtig: das Backup darf nicht auf dem Server verbleiben sondern muss irgendwo völlig getrennt abgesichert werden (denn wenn der Server gehackt wurde, ist das Backup auch nicht mehr gesichert sauber) und es muss getestet werden, ob es wieder einspielbar ist (wäre doch blöd, wenn man erst im Ernstfall feststellt, dass die Backups der letzten 10 Jahre alle defekt sind).
Eine regelmäßige Kontrolle der Backups ist auch zwingend erforderlich, nur so kann man sichergehen, dass man nicht jahrelang einen unentdeckten Hack mit sich herumschleppt und ggfl. wieder einspielt. Eine einfache Möglichkeit ist es, mit einer Versionsverwaltung wie GIT diese Tests durchzuführen:
Man legt einmalig eine saubere Urversion an (direkt nach dem Erstellen der Webseite) und kann dann durch drüberkopieren deraktuellen Seite sofort feststellen, welche Dateien sich geändert haben. Valide, von einem selbst geänderte Dateien kann man dann als neuen "sauberen" Stand commiten. Fremde Dateien deuten aber auf einen Hack hin.
- Backup
- Backup
- Backup
Monitoring
Last but not least ist es auch immer wichtig, seine Seite regelmäßig auf Hacks zu überprüfen. Zum einen kann das über die oben beschrieben GIT-Methode passieren, zum anderen über verschiedene Monitoring-Software. Einige Hoster bieten da von sich aus Scans an, aber es gibt auch einige Programme "in der freien Wildbahn". Worauf zurückgegriffen wird, überlasse ich dem Leser. Stichwort: Security Audits.
- Seite überwachen