Einfache Mittel für eine sichere Website

von Tobias Kündig

    Das Wichtigste in Kürze

  • Deine Website ist unter ständigem Beschuss
    Die Wahrscheinlichkeit ist extrem hoch, dass Deine Website einmal Ziel von automatisierten Angriffen wird. Nutze die folgenden Sicherheitspraktiken, um die Website abzusichern.
  • Alles beginnt mit der Architektur
    Bereits vor der ersten Codezeile solltest Du Dir über den Aufbau Deiner Applikation Gedanken machen. So lassen sich Sicherheitspraktiken einfach und effizient anwenden.
  • Nutze moderne Sicherheitsfunktionen des Browsers
    Moderne Browser haben diverse Sicherheitsmechanismen eingebaut. Nutze spezielle HTTP-Header um diese für Deine Besucher zu aktivieren.

Mit einfachen Mitteln zur sicheren Website

Das Internet ist voller Gefahren. Stellst Du einen Server mit SSH-Zugang ins Netz, so dauert es nicht lange, bis Angreiffer aus aller Welt versuchen, sich Zugang auf Deine Daten zu verschaffen. Durchschnittlich werden dabei 13 Login-Versuche pro Minute registriert (Exposed: Cyberattacks on Cloud Honeypots, Sophos [PDF]).

Wie es dem Server ergeht, so ergeht es natürlich auch der darauf gehosteten Website. In diesem Blogbeitrag zeigen wir Dir einige Sicherheitstipps, um Deine Website vor Angriffen zu schützen.

Informiere Dich über die Risiken

Bist Du selber Entwickler, solltest Du mit den gängigsten Sicherheitslücken vertraut sein. Cross-Site-Scripting und SQL-Injections dürfen für Dich keine Fremdwörter sein. Informationen zu XSS, SQLi und Co. findest Du im Wiki von owasp.org.

Überlege Dir beim Entwickeln einer Applikation stets, welche Angriffspunkte ausgenutzt werden könnten. Ein fundiertes Basiswissen in diesem Bereich kann schon eine grosse Anzahl von Sicherheitslücken verhindern.

Spare nicht beim Hosting

Das Hosting ist das Fundament Deiner Website. Setze hier auf bekannte Namen und auf Anbieter mit gutem Image. Ein paar investierte Franken mehr im Monat werden sich über die Jahre doppelt und dreifach auszahlen.

Shared-Hosting

Wenn Du Deine Website auf einem Shared-Hosting betreibst, informiere Dich über angebotene Sicherheitsfunktionen der Anbieter. Die Spannweite ist hier enorm gross. Bei vielen Anbietern gibt es noch grosses Optimierungspotential.

Informiere Dich darüber, welche PHP-Versionen eingesetzt werden. Stellt der Anbieter neue PHP-Versionen schnell zur Verfügung? Werden alte Versionen gemäss dem Support-Kalender deaktiviert? Kannst Du selber Einfluss auf die PHP-Konfiguration nehmen und nicht benötigte Funktionen deaktivieren? Werden nicht mehr unterstütze PHP-Versionen lange über Ihre Lebensdauer hinaus betrieben, deutet dies auf eine verwahrloste Infrastruktur hin.

Ebenfalls sollte zu einem modernen Hosting mindestens eine einfache «Web Application Firewall (WAF)» angeboten werden. Diese sorgt dafür, dass potenziell schädliche Anfragen Deine Website gar nicht erst erreichen.

Wenn Du mehr Kontrolle über die WAF haben möchtest, lohnt es sich, Deine Besucher über externe Anbieter wie Cloudflare auf Deine Website zu leiten. Cloudflare bietet eine Vielzahl an Schutzmechanismen vor schädlichen Anfragen oder DDoS-Attacken. Durch integriertes Caching Deiner Website gibt es zudem noch einen guten Performance-Boost dazu, was sich letztendlich auch in einer besseren Suchmaschinenplatzierung widerspiegeln kann.

Cyon, der Hostinganbieter unserer Wahl, geht beim Thema Sicherheit sogar noch einen Schritt weiter: Dank der Integration von Patchman werden bekannte Sicherheitslücken auf einem Hosting automatisch erkannt und geschlossen.

Self hosted/Self managed

Wenn Du Deine Server selber betreibst, informiere Dich über Server-Hardening.

Mit Tools wie fail2ban oder psad kannst Du Deinen Server in wenigen Minuten vor unerwünschten Login-Versuchen und Port-Scans schützen. Erkannte Angreifer werden dabei automatisiert auf Firewall-Ebene vom Server ausgesperrt.

Ebenfalls lohnt es sich, eine gute Zwei-Faktor-Authentifizierung via SSH einzurichten. Tools wie der Google Authenticator oder Security-Keys, wie sie Yubico anbietet, sind hier beliebte Lösungen.

Trotzdem, eine 100-prozentige Sicherheit gibt es nicht. Umso wichtiger ist es darum sofort informiert zu werden, sollte mit der Website etwas nicht stimmen. Aus diesem Grund lohnt es sich, in eine Monitoring-Lösung zu investieren. Neben nahe liegenden Messwerten wie Ladezeit, Online-Status oder Speicherplatzverbrauch, lassen sich mit den meisten Tools auch Sensoren einrichten, die Dich darüber informieren, wenn schädliche JavaScript-Dateien geladen werden oder das SSL-Zertifikat nächstens abläuft.

Beliebte Tools um Deine Website zu monitoren sind Paessler's PRTG, Zabbix oder ‒ für wen es etwas komplizierter sein darf ‒ Nagios.

Wenn Du lieber eine gehostede Monitoringlösung verwenden möchtest, empfehlen wir Dienste wie 1pilot.io oder Oh Dear!. Natürlich ist dies nur eine winzige Auswahl basierend auf unseren Erfahrungswerten und Vorlieben. Die Anzahl an Monitoringtools ist enorm ‒ informiere Dich und Du wirst etwas Passendes finden.

Verwende sichere Software

Läuft Deine WordPress-Installation noch auf PHP 5? Befinden sich in Deinem Quellcode noch unzählige Aufrufe zu mysql_-Funktionen? Dann ist es höchste Zeit, dass Du aktiv wirst und alle Komponenten aktualisiert. Zudem ist die Wahrscheinlichkeit gross, dass Du Deine Website der Gefahr von SQL-Injections aussetzt.

Zurzeit (Juli 2019) ist die letzte unterstützte PHP-Version 7.2. Alles davor sollte nicht mehr betrieben werden! Bietet Dir Dein Hoster keine neuen Versionen an, musst Du aktiv werden.

Als Website-Administrator bist Du Deinem Kunden gegenüber verpflichtet, ihn auf die Gefahren veralteter Software aufmerksam zu machen. Lege dem Kunden nahe, Geld in eine Aktualisierung zu investieren. Die Verluste bei erfolgreichen Angriffen können um das Vielfache höher sein, als die investierte Arbeit in ein Update.

Achte bei verwendeten CMS und Frameworks darauf, dass moderne Funktionen zur Verfügung stehen. So ist ein CMS ohne Template-Engine wie Twig oder Laravel's Blade ein No-Go. Die Template-Engine sorgt nicht nur für einen besser organisierten Code, sondern auch für einen zusätzlichen Schutz vor XSS-Attacken. Ebenfalls sollte eine saubere Datenbank-Abstraktion vorhanden sein, die SQL-Injections mit Prepared Statements entgegenwirkt.

Bei Abhängigkeiten, wie einem einfachen CMS-Plugin oder einer JavaScript-Bibliothek, solltest Du verwendeten Code von Drittanbietern prüfen. Ein kurzer Blick in den Code sagt oft schon genug aus, um die Kompetenz eines Anbieters einschätzen zu können. Auch lohnt es sich zu überprüfen, wie oft und schnell Updates veröffentlicht werden, wie viele Sicherheitslücken es in Produkten des Entwicklers in der Vergangenheit gab und wie man damit umgegangen ist.

Applikationsstruktur

Egal wie viel Mühe Du Dir gibst, es wird der Tag kommen, an dem einer Deiner Server angegriffen und infiziert wird. Sei für diesen Fall vorbereitet! Achte beim Planen Deiner Applikation darauf, dass ein Applikationsserver schnell und ohne grosse Umstände von Grund auf neu erstellt werden kann.

Für die Architektur der Applikation gilt es zu beachten, dass keine Vermischung von Daten und Logik entsteht. Nutze einen dedizierten Datenbankserver und hoste Benutzerdaten auf einem der unzähligen Object Storage Angebote (Amazon S3, Digital Ocean Spaces, Google Cloud Store etc.). So gibt es keine Abhängigkeiten auf dem eigentlichen Applikationsserver und Du kannst diesen innert Minuten ersetzen.

Um Dir eine Neuinstallation zu vereinfachen, verwende Konfigurations-Management-Tools wie Ansible, Salt oder Chef. Falls Du Dich bisher noch nicht mit der Welt von Docker auseinandergesetzt hast, wird es höchste Zeit: Dank Containern kann Infrastruktur noch einfacher und schneller wiederhergestellt werden ‒ auch ohne Kubernetes Cluster.

Content Security Policy (CSP)

Alle modernen Browser unterstützen heute Content Security Policies.

Mit CSPs kannst Du dem Webbrowser mitteilen, von welchen Domains, welche Art von Code auf Deiner Website geladen werden darf. Gelingt es einem Angreifer, zum Beispiel JavaScript-Code von der Domain malware.ru auf Deiner Website einzuschleusen, wird dieser Code von Deinem Browser blockiert, weil die Domain nicht via CSP freigegeben wurde.

CSPs können als HTTP-Header oder Meta-Tags einfach integriert werden.

<!-- Erlaube alles von der eigenen Domain (self) und *.trusted.com -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' *.trusted.com">

Subresource Integrity (SRI)

Mittels Subresource Integrity kannst Du sicherstellen, dass verwendete Ressourcen nicht verändert wurden, seitdem Du sie eingebunden hast. Dies kann das Ausführen von infiziertem Code auf Deiner Website unterbinden.

Dabei wird im <script>-Tag ein integrity-Attribut ergänzt, welches den Hash der geladenen Datei enthält. Wird die Datei auf dem externen Server verändert, stimmt dieser Hash nicht mehr und Der Webbrowser blockiert die Ressource.

Das crossorigin-Attribut sollte stets den Wert anonymous haben. Dies verhindert, dass der Browser Cookies mit dem Request für die Datei mitsendet.

<script src="https://code.jquery.com/jquery-3.4.1.min.js"
        integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
        crossorigin="anonymous"></script>

Es lohnt sich auch, das integrity Attribut für eigene Ressourcen zu ergänzen. Den Hash einer Datei lässt sich wie folgt berechnen:

cat deine-datei.js | openssl dgst -sha384 -binary | openssl base64 -A
> ppFEhOhRId6Bu63h2Sa42npGN3x+UIC+T6hJkFBjs4BYZGAuBQskTtWuaopTF9Rw

Anschliessend kannst Du Dein Script mit dem generierten Hash versehen. Erwähne die verwendete Hash-Funktion vor dem eigentlichen Hash:

<script src="deine-datei.js"
        integrity="sha384-ppFEhOhRId6Bu63h2Sa42npGN3x+UIC+T6hJkFBjs4BYZGAuBQskTtWuaopTF9Rw"
        crossorigin="anonymous"></script>

Denke daran, dass der Hash mit jeder Änderung an der Datei aktualisiert werden muss. Dieser Schritt lässt sich ideal während des Deploymentprozesses automatisieren.

X-Frame-Options

Über den X-Frame-Options-Header lässt sich die Einbindung Deiner Website in einem iframe-Element unterbinden. Dies verhindert sogenannte «Clickjacking»-Attacken.

Beim Clickjacking wird eine Website auf einer fremden Website in einem iframe geladen. Dann wird über das iframe ein weiteres Element platziert, welches klickbare Ziele (Links, Buttons) enthält, diese Klicks aber an das darunterliegende iframe-Element weiterreicht.

So kann es passieren, dass Deine E-Banking-Website im iframe geladen wird und Du eine Zahlung auslöst, weil Du ein Katzenfoto geliked hast.

X-Frame-Options: deny

Überprüfe die Sicherheit Deiner Website regelmässig

Du siehst also, dass sich mit wenig Aufwand einiges für die Sicherheit Deiner Website tun lässt. Integriere die beschriebenen Sicherheitspraktiken aus diesem Blogbeitrag, um mehr Sicherheit für Deine Website zu erhalten.

Wie es um die aktuelle Sicherheit Deiner Website steht, kannst Du mit dem Mozilla Obeservatory oder einem der vielen erhältlichen Vulnerability Scanning Tools testen.

Ein Beitrag aus dieser Serie
Security

Artikel zum Thema Sicherheit im Web.

Weitere Beiträge anzeigen »
Mehr aus dieser Kategorie
Entwicklung
Hier findest du Blogartikel technischer Natur.
Weitere Beiträge anzeigen »

Los geht's!

Kontaktiere uns noch heute

Für Offerten, technische Anfragen oder einfach nur um Hallo zu sagen.