Cybersecurity-Website-Blog-PM
9. Juli 2020

Wie sichere ich meine Webseite gegen Angreifer ab?

  • Website

In unserem heutigen Beitrag möchten wir Sie über die Absicherung von Webseiten informieren. Dabei werden wir uns einige der wichtigsten Sicherheitstipps für Server, Frontend-Entwicklung und die Backend-Entwicklung ansehen. Ziel ist es, über mögliche Sicherheitslücken zu informieren und Sie auch ein wenig für die Sicherheit Ihrer Anwendungen zu sensibilisieren. Wichtig: Die sicherste Infrastruktur bringt Ihnen nichts, wenn der Zugriff nicht über gute Passwörter gesichert ist.

Sicherheitstipps für die Serverkonfiguration

Grundlage einer sicheren Webseite ist ein sicherer Server mit entsprechender Konfiguration. Da dieses Thema viel zu komplex für einen einzelnen Blogbeitrag ist, stellen wir Ihnen im Folgenden nur die wichtigsten Punkte vor, die nicht immer automatisch von jedem Hoster abgehandelt werden.

Wichtig: Sorgen Sie dafür, dass regelmäßige Backups ihrer Anwendung (Quellcode und Datenbanken) erstellt werden. Im schlimmsten Fall sind diese ihre einzige Möglichkeit, eine angegriffene Seite wieder zu retten.

Benutzen Sie HTTPS

HTTPS ist einer der wichtigsten und am einfachsten umzusetzenden Sicherheitsmechanismen. Bei dem normalen HTTP Protokoll wird der Datenaustausch zwischen dem Browser des Benutzers und dem Server in Klartext vorgenommen. Dies bedeutet, dass jemand einfach die Kommunikation auf dem Weg abgreifen und mitlesen kann. Das beinhaltet auch Benutzernamen und Passwörter, die zum Beispiel bei einem Login eingeben werden. Sogar für Zahlungsdaten sind davon betroffen!

Diese Problematik lässt sich ganz einfach mit dem SSL Verschlüsselungsverfahren beheben. Denn genau dies ist “HTTPS”. Dabei wird zwischen dem Server und jedem einzelnen Nutzer eine eigene Verschlüsselung aufgebaut. Für potenzielle “Abhörer” sind so nur noch kryptische Zeichenketten zu sehen. Um HTTPS zu aktivieren, bedarf es in den meisten Fällen lediglich eines gültigen SSL Zertifikates. Diese können von mehreren zertifizierten Stellen ausgestellt werden und kommen in verschiedenen Stufen. Die meisten Hoster heutzutage bieten günstige bis kostenlose Zertifikate mit ihren Hosting-Paketen an. Seit Ende 2015 bietet die open-source Zertifizierungsstelle Let’s Encrypt kostenlose Zertifikate über eine automatisierte Schnittstelle. Moderne Browser informieren den Nutzer mittlerweile darüber, ob eine Webseite HTTPS verwendet oder nicht. Dies erkennen Sie an dem Vorhängeschloss Symbol neben der URL im Browser.

HTTPS weiter mit HSTS absichern (optional)

Wenn Sie ausschließlich HTTPS auf Ihrer Webseite verwenden wollen, können Sie “HTTPS Strict Transport Security (HSTS)” verwenden. Dies ist eine Anweisung, die vom Server an den Browser gesendet wird und dem Browser mitteilt, dass die Seite ausschließlich über HTTPS kommuniziert. Der Browser nimmt dann keine Anfragen mehr gegen HTTP vor. Dies sichert den Nutzer gegen einen Angriffstypen ab, bei dem eine HTTP-Kopie der Webseite ausgespielt wird und der Browser dann wieder in Klartext kommuniziert. Dies ist ein sehr spezifischer Angriff und die Absicherung sollte als optional gelten.

Wichtig zu beachten: Wenn Sie HSTS verwenden möchten, muss die gesamte Seite über HTTPS funktionieren. Falls Teile noch über HTTP laufen, werden diese nicht mehr funktionieren. Um diese Einstellung auf den Browsern Ihrer Nutzer zu verwenden, muss der Server diese in der Kommunikation immer darüber informieren. Dafür wird in der Regel der HTTP-Header verwendet. Dieser beinhaltet Meta-Informationen zur Kommunikation. Für HSTS muss folgende Zeile in dem HTTP-Header vorkommen:

Strict-Transport-Security: max-age=86400; includeSubDomains

max-age gibt die Dauer der HSTS-Sicherung in Sekunden an. In dem Beispiel entspricht das 24 Stunden. Dies ist ein geeigneter Wert um die Funktionsweise zu testen, weil bei Fehlern die Nutzer am nächsten Tag trotzdem wieder eine fehlerfreie Seite sehen. Bei gut getesteten Seiten kann man den Zeitraum auch auf einen sehr langen Zeitraum stellen. includeSubDomains weist den Browser darauf hin, dass die HSTS-Absicherung auch für Subdomains von meine-domain.de wie beispielsweise shop.meine-domain.de gelten soll.

Ordner Listing auf dem Server ausstellen

Ein Server kann so konfiguriert sein, dass Nutzer über den Browser eine Auflistung der Server-Dateien und Ordner sehen können. Die meisten Hoster deaktivieren dies automatisch, aber Sie sollten trotzdem sicherstellen, dass dies unterbunden ist. Potentielle Angreifer können sonst kompletten Einblick in Ihre Webseite bekommen und eventuell sogar funktionale Dateien mit gefährlichen Eingaben simulieren. Bei einem Apache Server lässt sich dies durch das Entfernen der Option “Indexes” erreichen:

Options -Indexes

Damit dies funktioniert muss der Server entsprechend konfiguriert sein. Fordern Sie am besten eine Korrektur durch den Hoster an, wenn Sie dieses Problem auf Ihrer Webseite feststellen.

Tipp für Entwickler: Man kann (je nach Framework) leere index.php Dateien in den Ordnern hinterlegen. Das führt dazu, dass der Browser einfach eine leere Seite anstatt des Ordnerinhalts anzeigt. So kann im Fall einer falschen Serverkonfiguration der Einblick ins Dateisystem unterbunden werden.

Zugriffskontrolle auf Teile der Webseite

Die meisten modernen Webseiten haben Bereiche, die von den normalen Nutzern der Seite niemals benutzt werden sollen. Zum Beispiel der Administrationsbereich der Webseite. Den Zugriff darauf können Sie auf den Webservern einschränken. Dazu stellen Sie zum Beispiel einen vorgeschalteten Login für den Bereich ein. Dazu erstellen Sie einfach eine .htpasswd Datei und hinterlegen diese auf dem Server. Diese Datei definiert verschlüsselt die Login-Daten. Dann kann diese Datei einem Ordner, einer Datei oder einer URL zugewiesen werden. Hier eine Anleitung dazu.

Falls Sie eine statische IP-Adresse besitzen, können Sie auf ähnlichem Wege den Zugriff nur auf die eigene IP beschränken. Nutzer mit einer anderen IP gelangen dann nicht einmal bis zum Login.

Bruteforce-Schutz bei Logins (optional)

Wenn Ihre Webseite eine Login-Seite hat ist es wichtig, dass der Loginversuch nicht endlos oft wiederholt werden kann. Das würde es einem Angreifer ermöglichen, automatisiert Logins auszutesten und so nach einer Weile Zugriff zu bekommen. Dieses Vorgehen nennt man “Bruteforcing”. Einige Hoster bieten mittlerweile einen serverseitigen Schutz davor an. Wenn Sie die Option haben, ist es empfehlenswert diese auch wahrzunehmen. Wenn Sie den Schutz nicht serverseitig umsetzen können, muss dies in der Software passieren.

Tipp: Verwenden Sie keine offensichtlichen Nutzernamen wie zum Beispiel “Admin” oder “Administrator”. Diese versprechen entsprechende Berechtigungen. Alternativ können Sie aber so ein Konto auch anlegen und mit keinerlei Berechtigungen ausstatten, um so einen potentiellen Angreifer auf eine falsche Fährte zu locken. Allgemein empfehlen wir, auf die Default-Accountnamen zu verzichten, falls das System welche anbietet.

Sicherheitstipps für die Frontend-Entwicklung

Im Allgemeinen ist es wichtig zu beachten, dass das Frontend immer im Browser des Nutzers (oder ggf. Angreifers) ausgeführt wird. Daher kann ein potentieller Angreifer Sicherheitsmaßnahmen, die ausschließlich im Frontend ausgeführt werden, einfach umgehen oder deaktivieren. Trotzdem müssen Sie sicherstellen, dass ein Angreifer keinen ausführbaren Code in die Ausführung der Webseite bei Ihren legitimen Kunden einschleusen kann. Auch Datei-Uploads im Frontend sollten entsprechend entwickelt werden, um die im Backend umgesetzten Upload-Regeln darzustellen.

Einschleusen von Code in die Webseite unterbinden – Cross Site Scripting (XSS)

Cross Site Scripting Angriffe missbrauchen in fast allen Fällen Mechanismen, die durch Nutzerinteraktion oder das Hinzufügen von URL-Parametern schädlichen Code auf dem Browser des Nutzers ausführen. Stellen wir uns vor wir haben eine Seite, bei der ein Kunde Text in ein Inputfeld eingibt und der Text dann schön formatiert wird und als HTML-Inhalt auf der Seite dargestellt wird. Wenn die Nutzereingabe nicht überprüft und gefiltert wird, kann jeder Nutzer JavaScript auf die Seite bringen, indem er einfach seinen JavaScript-Code in das Input eintippt. Dieser kann auch in einem normalen Text versteckt sein. Wenn wir nun Texte per Link sharen können, kann dieser infizierte Link einfach versendet werden. Daher müssen alle Inhalte, die durch Nutzerinteraktionen in den ausgeführten Code ergänzt werden vorher korrekt gefiltert und bereinigt werden.

Tipp für Entwickler: Auf dieser Seite des Open Web Application Security Project (OWASP) finden Sie detaillierte Informationen, wie verschiedenste XSS Angriffsvektoren abgesichert werden können. Die OWASP ist im Allgemeinen sehr als Informationsquelle zur Absicherung von Webanwendungen zu empfehlen und bietet auch viele Open-Source Bibliotheken für Entwickler an.

Datei-Uploads absichern

Das wichtigste zuerst: Sichern Sie Datei-Uploads niemals ausschließlich im Frontend ab! Alle diese Sicherheitsmechanismen lassen sich sogar von Laien direkt im Browser aushebeln. Die Upload-Dialoge oder -Inputs im Frontend sollen die Backend-Absicherung für Ihre echten Kunden transparent darstellen – nicht ersetzen. Eventuelle Fehler bei der Prüfung im Backend sollten also auch im Frontend zurückgegeben werden. Ansonsten lässt sich der sichere Upload manchmal nicht von einem defekten Upload unterscheiden. Wenn der Upload auf bestimmte Dateitypen beschränkt werden soll, dann sollte der Dialog dies auch berücksichtigen. Dafür kann einfach das HTML-Attribut accept verwendet werden.

Tipp für Entwickler: Obwohl die meisten Browser gut mit den Dateiendungen als Wert beim accept-Attribut zurecht kommen, haben die vollständigen MIME-Type Notationen den besten Browser-Support.

Sicherheitstipps für die Backend-Entwicklung

Das Backend ist (fast) immer die kritische Komponente einer Webanwendung, da sie die Logik, Funktionalität und Administration Ihrer Anwendung vereint. Deshalb müssen sehr viele Sicherheitsregeln eingehalten werden. Zum Beispiel dürfen Passwörter nur mit aktuellen Kryptographie-Verfahren verschlüsselt gespeichert werden. So kann sogar jemand mit einem Datenbankvollzugriff die Passwörter in Klartext nicht wiederherstellen.

Ebenso wichtig: Nutzereingaben dürfen nie über ausführende Funktionen verarbeitet werden (Stichwort eval). Alleine zu dem Thema können ganze Bücher geschrieben werden, daher begrenze ich mich hier auf einen generellen Tip für Entwickler und gehe nur auf drei wichtige Punkte ein, die heutzutage immer noch gerne übersehen werden.

Tipp für Entwickler: Wenn Sie ein sicheres Backend entwickeln wollen, starten Sie immer mit einem etablierten open-source Framework wie zum Beispiel Laravel (PHP), ASP.NET (C#) oder Django (Python). Diese haben in der Regel die wichtigsten Sicherheitsaspekte eingebaut. Oder sie stellen Module dafür zur Verfügung und können bei Funden von neuen Sicherheitslücken einfach upgedatet werden, um diese zu schließen.

CSRF (Cross-Site Request Forgery) – Gefälschte Anfragen von externen Seiten

Damit Sie einigermaßen komfortabel durch das Internet navigieren können, nehmen Ihnen die Browser im Hintergrund jede Menge Arbeit ab. Nachdem Sie sich zum Beispiel auf einer Platform angemeldet haben, verwendet der Browser die Autorisierung weiterhin bei Anfragen gegen den gleichen Server oder die gleiche Domain. Dies kann in einigen Fällen aber auch zu Problemen führen. So könnte eine dritte Seite einfach eine Anfrage im Hintergrund an Ihren Server stellen (zum Beispiel “Passwort ändern”). Wenn ihre Anwendung keinen Mechanismus hat, um dies zu erkennen, hat Ihr Kunde nun ein neues Passwort, welches er selbst nicht kennt. Ähnlich wie bei den Cross Site Scripting (XSS) Angriffen im Frontend, gibt es viele Varianten um dieses Problem zu lösen. Daher verweise ich auch hier auf den umfangreichen Artikel der OWASP zu CSRF.

Hinweis für Entwickler: Viele von den gängigen Frameworks haben eingebaute Lösungen für CSRF-Tokens, die Sie auch für selbstentwickelte Vorgänge nutzen können.

Datei-Uploads absichern

Wie bereits im Frontend-Teil erwähnt, sollten Sie alle Datei-Uploads serverseitig validieren lassen. So verhindern Sie, dass ungewünschte Dateien auf dem eigenen Server landen. Dazu können Sie mehrere Stufen der Validierung verwenden. Zunächst sollten Sie, wenn möglich, die Funktion mit einer Autorisierung verbinden, so dass nur bestimmte User überhaupt diese Anfragen an den Server senden können. Danach sollten Sie einmal prüfen, ob der MIME-Type, also der Datei-Typ nach Internet-Standard, stimmt. Und, ob die Datei auch wirklich diesen Inhaltstypen darstellt. Hierzu bietet eigentlich jede Programmiersprache und nahezu jedes Framework eine Bibliothek an.

SQL-Injections verhindern

Eine der ältesten aber auch gefährlichsten Angriffe gegen das Backend sind die sogenannten SQL-Injections. Dabei werden unsicher programmierte SQL-Anfragen gegen die Datenbank, die aus User-Inputs zusammengebaut werden, ausgenutzt um zusätzlich ganz andere Datenbank-Operationen auszuführen. Stellen Sie sich ein Telefonbuch als Webseite vor, bei der ein Nutzer zum Beispiel nach einem Nachnamen suchen kann. Wenn man einen Nachnamen eingeben hat, wird dieser einfach als SQL-Abfrage

SELECT * FROM adressen WHERE adressen.nachname = "{$nachname}";

ausgeführt. Der Wert {$nachname} wird dabei aber mit dem Userinput ausgetauscht. Falls ein Nutzer nun aber

Schmidt";DROP TABLE adressen

eingibt, werden zuerst alle Schmidts gesucht und dann wir die gesamte Adresstabelle gelöscht.

Um SQL-Injections zu verhindern, sollten Datenbank-Zugriffs-Bibliotheken verwendet werden, die sogenannte prepared statements implementieren. Diesen übergibt man zunächst die SQL-Abfrage mit dem Parameter (erstes Codebeispiel in diesem Absatz) und im Anschluss den Parameterwert. Das prepared statement erkennt vorab, welche Parameter-Werte valide und sicher sind und verhindert dadurch das Übergeben zusätzlicher SQL-Anweisungen. Zusätzlich werden die Ergebnisse von prepared statements gecached, was die Performance der Datenbankanfragen erhöht.

Schlusswort: Cybersecurity nach Maß

Wir hoffen, Ihnen hat dieser Blogbeitrag einen Einstieg in die komplexe aber spannende Welt der Software-Sicherheit in der Webentwicklung gegeben. Vielleicht konnten Sie einige Anregungen für zukünftige Projekte mitnehmen. In meinem nächsten Blogbeitrag werde ich allgemeine, speziell auf WordPress zugeschnittene Sicherheitstipps geben. Wenn Sie weitere individuelle Fragen zum Thema haben, wenden Sie sich gerne an uns. Wir beraten Sie unabhängig und unverbindlich zu allen Themen aus dem Bereich Webentwicklung und Softwareentwicklung.

Foto von Mathias Leonhardt, Geschäftsführer

Lassen Sie uns sprechen!

Unser CTO Mathias Leonhardt berät Sie gerne.

Über den Autor

Waldemar Schiller

Scroll to Top