Dies ist eine kanonische Frage zum Sichern eines LAMP-Stapels
Was sind die absoluten Richtlinien zum Sichern eines LAMP-Servers?
Dies ist eine kanonische Frage zum Sichern eines LAMP-Stapels
Was sind die absoluten Richtlinien zum Sichern eines LAMP-Servers?
Antworten:
Davids Antwort ist eine gute Grundlage für die allgemeinen Prinzipien des Server-Hardening. Wie David angedeutet hat, ist dies eine große Frage. Die spezifischen Techniken, die Sie anwenden, können stark von Ihrer Umgebung und der Verwendung Ihres Servers abhängen. Achtung, es kann eine Menge Arbeit in einer Testumgebung erfordern, bis alles richtig aufgebaut und erledigt ist. Es folgt viel Arbeit, um sich in Ihre Produktionsumgebung und vor allem in Ihre Geschäftsprozesse zu integrieren.
Überprüfen Sie jedoch zunächst, ob Ihre Organisation über Richtlinien zur Absicherung verfügt, da diese möglicherweise am unmittelbarsten relevant sind. Wenn dies nicht der Fall ist, ist dies abhängig von Ihrer Rolle möglicherweise ein guter Zeitpunkt, um sie auszubauen. Ich würde auch empfehlen, jede Komponente einzeln von unten nach oben anzugehen.
Das L
Es gibt viele gute Führer, die Ihnen helfen. Diese Liste kann Ihnen je nach Distribution helfen oder auch nicht.
Der A
Apache kann spaßig zu sichern sein. Ich finde es einfacher, das Betriebssystem zu härten und die Benutzerfreundlichkeit beizubehalten, als entweder Apache oder PHP.
Sie
Das P
Dies führt zu der ganzen Idee von Secure Programming Practices, die eine eigene Disziplin darstellt. SANS und OWASP haben eine Menge lächerlicher Informationen zu diesem Thema, deshalb werde ich hier nicht versuchen, sie zu replizieren. Ich werde mich auf die Laufzeitkonfiguration konzentrieren und Ihren Entwicklern den Rest überlassen. Manchmal bezieht sich das 'P' in LAMP auf Perl, aber normalerweise auf PHP. Ich gehe von letzterem aus.
Sie haben eine Frage gestellt, die ein paar Bücher zu diesem Thema verdient. Es gibt jedoch einige allgemeine Grundregeln, die gut funktionieren:
Hoffe das hilft dir beim Einstieg.
Hier ist eine gute Checkliste, mit der ich gerne anfange.
Je modularer Ihre Installation ist, desto sicherer ist Ihr LAMP-Stack, wenn Sie beispielsweise einen Apache-Benutzer haben für Apache-Dateien / -Ordner mit entsprechend festgelegten Berechtigungen und nicht in Gruppen, die auf wichtige Systemdateien / -ordner zugreifen können. Ein Benutzer, der auf die MySql-Tabellen zugreifen kann, die Ihren zu versorgenden Websites zugeordnet sind, und nur auf diese Tabellen. Darüber hinaus können Sie deren Zugriff einschränken, um die Mindestzugriffsmenge für einen PHP-Aufruf festzulegen. Stellen Sie außerdem sicher, dass der in der PHP-Datei verwendete / offen gelegte MySQL-Benutzername nicht mit dem Benutzernamen oder Kennwort eines anderen Benutzers übereinstimmt.
Was dies bedeutet: Wenn entweder der Apache-Benutzer oder der MySQL-Benutzer kompromittiert werden, können sie keinen Schaden anrichten, der außerhalb des Bereichs der Ordner liegt, auf die Apache Zugriff hat (im Fall des Apache-Benutzers) und außerhalb der Tabelle ( s) / database (s) (im Fall des Benutzers für die MySQL-Datenbank).
Wenn der MySQL-Benutzer auf irgendeine Weise gefährdet wäre, könnte er beispielsweise nicht auf die Datenbank zugreifen und alle Datenbanken von MySQL löschen und alle Ihre Daten ruinieren. Sie KÖNNTEN unter Umständen in der Lage sein, Tabellen zu löschen oder Informationen in einige Tabellen in einer isolierten Datenbank einzufügen. Aus diesem Grund ist es wichtig, Tabellenzugriff nur dort zu gewähren, wo dies unbedingt erforderlich ist, und nur dann, wenn Sie die erforderlichen Berechtigungen erteilen. Sie müssen keine Rechte zum Löschen von Tabellen oder zum Aktualisieren von Tabellen haben und dürfen diese nicht an diesen Benutzer vergeben.
Wenn aus irgendeinem Grund der Benutzername und das Kennwort Ihres Administratorkontos für MySQL ermittelt werden und Sie einen anderen Benutzernamen als die Benutzernamen auf Ihrem System verwenden, müssen Sie zuerst die Sicherheit Ihres Systems unterbrechen, bevor Sie in Ihre Datenbank gelangen, um Schäden zu verursachen. Gleiches gilt für den Apache-Benutzer und den Zugriff auf Dateien.
Beispiel Zeit! Ich werde ein Systembeispiel geben, um die Idee zu vereinfachen.
Angenommen, Sie haben Benutzer auf Ihrem System (root sollte aus Sicherheitsgründen durch etwas wie umod -l oder passwd -l usw. deaktiviert sein): john, barney, terence und lisa.
Sie können in MySQL einen Benutzer mit dem Namen bigbird erstellen (stellen Sie sicher, dass Sie ein Hash-Passwort verwenden). Bigbird hat nur Auswahl- und Aktualisierungsrechte, aber keine Drop- oder Create-Rechte und schon gar nicht . Außerdem erstellen Sie einen weiteren administrativen MySQL-Benutzer mit dem Namen garfield für die Arbeit an der MySQL-Datenbank und löschen den Root-Benutzer aus der MySQL-Datenbank, damit er nicht kompromittiert werden kann. Garfield wurde gewährt . Privilegien in MySQL (effektiv ist dies nur das Umbenennen von root).
Jetzt erstellen Sie entweder eine Apache-Gruppe oder einen Benutzer und wir nennen es apweb2. Appweb2 ist kein Mitglied einer anderen Gruppe und alle Dateien / Ordner für Apache sind in / home / apweb2 / gespeichert. Jeder virtuelle Host verfügt über einen eigenen Unterordner, und für jeden dieser Hosts ist der Dokumentenstamm auf diesen Unterordner festgelegt. Symlinks würden deaktiviert, um nicht versehentlich Zugriff auf den Rest des Systems zu gewähren.
Sie können den SSH-Zugriff auch nur auf bestimmte Benutzer beschränken (oder auf bestimmte Gruppen, ich möchte sie in die SSH-Gruppe aufnehmen, damit nur diese SSH verwenden können).
Sie können auch auswählen, welche Benutzer über Sudo-Berechtigungen verfügen, um die Aktivitäten weiter einzuschränken. Ein weiterer Schritt, den Sie noch weiter ausführen können, besteht darin, alle SSH-Benutzer dazu zu bringen, nicht sudo-fähig zu sein. Sie könnten spezielle Benutzer erstellen, die sudo verwenden können, ohne ssh zu verwenden Zugriff auf sudo.
Wenn Sie also jedes Segment modularisieren, wird der gesamte Stapel nicht beeinträchtigt, und Sie können das Problem 1 beheben, anstatt von vorne beginnen zu müssen.
Ich fand dieses Dokument von SANS.org wirklich hilfreich http://www.sans.org/score/checklists/linuxchecklist.pdf
Vernachlässigen Sie derzeit nicht die Containervirtualisierung, dh Docker, systemd-nspawn und die Mechanismen der Containervirtualisierung, auf denen sie basieren (Namespaces, Cgroups). Mithilfe der Containervirtualisierung können Sie Prozesse isolieren. Wenn beispielsweise einer der Dienste gefährdet ist, kann ein Angreifer nicht auf andere Dienste zugreifen.
Im Falle von LAMP können beispielsweise vier Docker-Container mit SSH-Server, Apache, MySQL, PHP-FPM / Python / Perl / etc verwendet werden.