fragen stichworte

Tipps zum Sichern eines LAMP-Servers

This is a Canonical Question about Securing a LAMP stack

Was sind die absoluten Richtlinien für die Absicherung eines LAMP-Servers?

antworten

Davids Antwort ist eine gute Grundlage für die allgemeinen Prinzipien der Serverhärtung. 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, dies kann in einer Testumgebung sehr viel Arbeit in Anspruch nehmen, um sie auszubauen und richtig zu erledigen. Es folgt viel Arbeit für die Integration in Ihre Produktionsumgebung und vor allem für den Geschäftsprozess.

Überprüfen Sie jedoch zunächst, ob in Ihrem Unternehmen Richtlinien zur Absicherung vorhanden sind, da diese möglicherweise am direktesten relevant sind. Wenn dies nicht der Fall ist, könnte dies, abhängig von Ihrer Rolle, ein guter Zeitpunkt sein, um sie auszubauen. Ich würde auch empfehlen, jede Komponente getrennt von unten anzugehen.

Das L
Es gibt viele gute Führer, die Ihnen helfen können. Diese Liste kann Ihnen je nach Ihrer Distribution möglicherweise nicht helfen.

Das A
Apache kann Spaß machen. Ich finde es einfacher, das Betriebssystem zu härten und die Benutzerfreundlichkeit zu erhalten, als entweder Apache oder PHP.

Das M

Das P
Dies läuft geradezu in die ganze Idee von Secure Programming Practices ein, einer ganz eigenen Disziplin. SANS und OWASP haben eine lächerliche Menge an Informationen zu diesem Thema, daher werde ich nicht versuchen, es hier zu replizieren. Ich werde mich auf die Laufzeitkonfiguration konzentrieren und Ihre Entwickler um den Rest kümmern. Manchmal bezieht sich das 'P' in LAMP auf Perl, normalerweise jedoch auf PHP. Ich gehe von Letzterem aus.

Sie haben eine Frage gestellt, die ehrlich gesagt einige Bücher zu diesem Thema verdient. Es gibt jedoch einige allgemeine grundlegende Richtlinien, die gut funktionieren:

  1. Bleiben Sie auf dem Laufenden. Dies bedeutet das Betriebssystem, alle Dienste und vor allem alle Webapps, die Sie ausführen.
  2. Deaktivieren Sie nicht benötigte Dienste, beschränken Sie die erforderlichen Dienste auf die Mindestbelastung (wenn Sie keine Fernverbindung zu MySQL herstellen und TCP nicht abhören), und führen Sie eine hostbasierte Firewall aus. (Wenn es streng LAMP ist, sollten Sie mit 80 und 443 gut sein, aber vielleicht auch mit SSH für die Administration.))
  3. Verwenden Sie sichere Kennwörter. Besser noch, wenn Sie SSH verwenden, verwenden Sie nur die schlüsselbasierte Authentifizierung.
  4. Stellen Sie sicher, dass Sie sich nicht als root anmelden. Melden Sie sich als Benutzer an und verwenden Sie su & amp; Sudo.
  5. Auch wenn es nicht sicherer wird, sollten Sie Tools wie logwatch ausführen, damit Sie wissen, was auf Ihrem Server passiert.

Ich hoffe, das hilft Ihnen beim Einstieg.

Hier ist eine gute Checkliste, mit der ich gerne anfangen möchte.

Firewall

  • Ein guter Ansatz besteht darin, keinen Datenverkehr zuzulassen, sondern nur öffnen Sie, was Sie brauchen, wie Sie es brauchen. Dies führt zum Öffnen der minimale Ports/IPS, damit die Dinge funktionieren und das minimiert Ihre Exposition.
  • Für einen LAMP-Server müssen Sie möglicherweise nur Ports öffnen http/https an die Welt und ssh für Sysadmins.
  • Stellen Sie sicher, dass Dinge wie der IPv6-Verkehr gesperrt sind, wenn Sie ihn nicht verwenden.
  • AWS bietet Sicherheitsgruppen, Linux verfügt über iptables sowie zahlreiche Pakete zur Auswahl von.

SSH & amp; Benutzer

  • Kein Kennwort für den SSH-Zugriff (privaten Schlüssel verwenden)
  • Erlauben Sie root nicht für ssh (die entsprechenden Benutzer sollten ssh verwenden, dann su oder sudo)
  • Verwenden Sie Sudo für Benutzer, sodass Befehle protokolliert werden
  • Protokollieren Sie nicht autorisierte Anmeldeversuche (und erwägen Sie Software, um Benutzer, die versuchen, zu häufig auf Ihren Server zuzugreifen, wie fail2ban, zu blockieren/verbieten)
  • ssh auf einem nicht standardmäßigen Port (dies kann nützlich sein, um sicherzustellen, dass Sie keine Früchte hängen und viel lästigen Verkehr fernhalten, aber nicht viel für die Sicherheit tun, insbesondere nicht für sich alleine).
  • Sperren Sie SSH nur auf den IP-Bereich, den Sie benötigen (ein großer Bereich ist besser als kein Bereich)

Datenbank

  • Benutzerdaten desinfizieren
  • Abfragen parametrieren
  • Erwägen Sie, die Datenbank von der eigenen Maschine zu abstrahieren. Diese Trennung kann es für einen Angreifer schwieriger machen, an Ihren Web-Stack zu gelangen und umgekehrt.
  • Wie bei jeder Software ist es wichtig, auf dem neuesten Stand zu bleiben.
  • Ein Benutzer für jeden Zweck. Beim Erstellen beginnen Benutzer ohne Berechtigungen und fügen nur die hinzu, die sie für ihre Rolle benötigen. Durch separate Benutzer für verschiedene Anwendungen (oder manchmal für bestimmte Teile von Anwendungen) kann der Vorteil eines Angreifers reduziert werden, wenn er ein Konto gefährdet. Seien Sie auch mit besonderen Privilegien wie GRANT vorsichtig, die nicht leicht vergeben werden sollten.
  • Es ist eine gute Idee, eine Richtlinie zum regelmäßigen Ändern von Kennwörtern zu haben. Wenn Sie sich Sorgen um den erforderlichen Aufwand machen, denken Sie daran, dass weniger häufig besser ist als nie zuvor.
  • Verstehen Sie die Passwortverschlüsselung. Salzkennwörter. Verwenden Sie nicht md5!

Software

  • Halten Sie die Software auf dem neuesten Stand (Betriebssystem, Webserver, Skriptsprache, CMS). Viele Leute werden in alten (nicht gepatchten) Versionen nach bekannten Schwachstellen suchen
  • Entfernen Sie nicht benötigte Software (idealerweise sollten Sie das für die Kompilierung der Software auf den Produktionsservern erforderliche Paket nicht aufbewahren. Es ist besser, die Software vorab zu kompilieren und auf Ihren Produktionsmaschinen als Paket verfügbar zu machen)
  • Stellen Sie sicher, dass die Berechtigungen für die Datei gesperrt sind (insbesondere für Benutzeruploads und Konfigurationsdateien)
  • Kennwortschutz für den CMS auf Webserver-Ebene (http-Authentifizierung kann sich vor einem verwundbaren CMS befinden und dazu beitragen, den Zugriff zu blockieren. Dies ist eine gute Möglichkeit, Angriffe zu verhindern)
  • Verwenden Sie SSL für den Verwaltungsbereich und andere vertrauliche Daten
  • Automatisieren Sie die Verwaltung Ihrer Server und Ihrer Infrastruktur (etwa Puppet, Chef oder SaltStack. Bei Verwendung von AWS CloudFormation). Auf diese Weise können Sie Patches auf vielen Servern patchen und Szenarien wie das Korrigieren von Berechtigungen für Server A reduzieren, aber auf Server B
  • vergessen
  • Geben Sie möglichst keine bestimmte Version Ihres CMS, PHP oder WebServers an. Obwohl das Verschleiern dieser Informationen keine Sicherheit darstellt, suchen viele Leute nach bestimmten Versionen unterschiedlicher Software. Je weniger Informationen Sie freigeben, desto mehr muss ein Angreifer arbeiten. Dies ist eine gute Möglichkeit, um sicherzustellen, dass Sie nicht zu den niedrig hängenden Früchten gehören. Natürlich wird dies nichts für jemanden tun, der ein bisschen mehr Mühe beim Einsteigen aufwenden möchte
  • Beschränken Sie die Personen, die Zugriff auf den Server haben

Zusätzlich zu dem, was David vorschlägt, je modularer Ihre Installation ist, dh ich beschränke den Zugriff auf bestimmte Benutzer/Gruppen, die speziell für eine Aufgabe erstellt wurden, und schränkt deren Umfang ein, desto sicherer ist Ihr LAMP-Stack: Ein Beispiel dafür ist zu haben ein Apache-Benutzer 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 mit Ihren zu versendenden Websites und nur mit diesen Tabellen verknüpft sind. Darüber hinaus können Sie ihren Zugriff einschränken, um den Zugriff auf einen PHP-Aufruf so gering wie möglich zu halten. Stellen Sie außerdem sicher, dass der MySQL-Benutzername, der über die PHP-Datei verwendet/verfügbar gemacht wird, nicht derselbe Benutzername oder dasselbe Passwort ist, das für einen anderen Benutzer verwendet wird.

Was das bedeutet: Wenn entweder der Apache-Benutzer oder der MySql-Benutzer kompromittiert sind, können sie keinen Schaden außerhalb des Bereichs des/der Ordner, auf den Apache Zugriff hat (im Falle des Apache-Benutzers) und außerhalb, vornehmen die Tabelle (n)/Datenbank (en) (im Falle des Benutzers für die MySQL-Datenbank).

Wenn der MySQL-Benutzer irgendwie kompromittiert werden sollte, 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 Tabellen löschen oder Informationen in Tabellen in einer isolierten Datenbank einfügen. Aus diesem Grund ist es wichtig, den Tabellenzugriff nur dort zu gewähren, wo es absolut notwendig ist, und nur die erforderlichen Berechtigungen zu erteilen. t müssen Tabellenprivilegien oder Aktualisierungsberechtigungen haben, dann geben Sie diese nicht an diesen Benutzer weiter.

Wenn aus irgendeinem Grund Ihr Benutzername und Passwort für Ihr Administratorkonto bei MySQL gefunden wird, müssen Sie zuerst die Sicherheit Ihres Systems unterbrechen, bevor Sie in Ihre Datenbank gelangen, wenn Sie einen anderen Benutzernamen als Benutzernamen auf Ihrem System verwenden Schaden anrichten. Dasselbe gilt für den Apache-Benutzer und den Zugriff auf Dateien.

Beispiel Zeit! Ich werde ein Systembeispiel geben, um die Idee zu vereinfachen.

sagen Sie haben Benutzer auf Ihrem System (root sollte für Sicherheit durch etwas wie umod-l oder passwd-l, etc. deaktiviert werden): John, Barney, Terence und Lisa.

Sie könnten einen Benutzer in MySQL mit dem Namen bigbird erstellen (stellen Sie sicher, dass Sie ein Hash-Passwort verwenden). Bigbird verfügt nur über ausgewählte Berechtigungen und Update-Berechtigungen, aber nicht über das Löschen oder Erstellen und sicherlich nicht über . Zusätzlich erstellen Sie einen anderen administrativen MySQL-Benutzer mit dem Namen garfield für die Arbeit an der MySQL-Datenbank und Sie löschen den Root-Benutzer aus der MySQL-Datenbank, so dass er nicht komprimiert werden kann. garfield hat . Privilegien in MySQL erhalten (effektiv heißt das nur root).

Sie erstellen jetzt entweder eine Apache-Gruppe oder einen Benutzer und wir nennen es apweb2. Appweb2 ist kein Mitglied anderer Gruppen und alle Dateien/Ordner für Apache sind in/home/apweb2/gespeichert. Jeder virtuelle Host hätte seinen eigenen Unterordner und jeder dieser Hosts würde den Dokumentenstamm auf diesen Unterordner setzen. Symlinks würden deaktiviert werden, um nicht versehentlich Zugriff auf den Rest des Systems zu gewähren.

Außerdem kannst du den ssh-Zugriff auf bestimmte Benutzer beschränken (oder bestimmte Gruppen, die ich gerne in die ssh-Gruppe lege und das einzige, das ssh verwenden kann).

Sie können auch auswählen, welche Benutzer über sudo-Rechte verfügen, um die Dinge noch weiter einzuschränken. Ein weiterer Schritt, den Sie weiterführen können, besteht darin, dass ssh-Benutzer nicht in der Lage sind, sudo zu verwenden. Sie könnten spezielle Benutzer erstellen, die sudo verwenden können, die ssh nicht verwenden können, so dass Sie sich bei einem anderen Benutzer einloggen müssen Zugang zu Sudo.

Wenn man also jedes Segment modularisiert, wird, wenn man kompromittiert ist, der gesamte Stapel nicht kompromittiert und man kann das Problem lösen, anstatt von vorne anfangen zu müssen.

Ich fand dieses Dokument von SANS.org sehr hilfreich http://www.sans.org/score/checklists/linuxchecklist.pdf

Vernachlässigen Sie derzeit nicht die Containervirtualisierung, namentlich Docker, systemd-nspawn und die Mechanismen der Containervirtualisierung, auf denen sie gebaut werden (Namespaces, Cgroups). Mithilfe der Containervirtualisierung können Sie Prozesse isolieren. Wenn beispielsweise einer der Dienste gefährdet ist, erhält ein Angreifer keinen Zugriff auf andere Dienste.

Bei LAMP können beispielsweise vier Docker-Container mit SSH-Server, Apache, MySQL, PHP-FPM/Python/Perl/etc. verwendet werden.