Apache als Nicht-Root


7

Ich mache gerade ein Audit bei der Arbeit durch, und es gibt eine Unternehmensanforderung, dass bestimmte Dienste nicht als Root-Benutzer für Linux-Systeme ausgeführt werden. Apache startet den ersten Prozess als Root-Benutzer, der an Port 80 (oder 443) bindet, und erzeugt dann die verbleibenden Prozesse als WWW-Daten. Gibt es eine Möglichkeit, Apache und Ubuntu (14.04) so ​​zu konfigurieren, dass der erste Prozess auch als WWW-Daten gestartet wird?

Antworten:


16

Ich bin mit der vorhandenen Antwort (und hundert Antworten im Internet) nicht einverstanden.

Es ist möglich, Apache2 als etwas anderes als root auszuführen.

Das ist jedoch nicht standardmäßig so und es ist das Standardverhalten, das mit Ubuntu geliefert wird, das die Dinge für Sie wirklich schwierig macht. Alle Skripte und Konfigurationen werden voraussichtlich das Root-Then-Drop-Privilegs-Modell verwenden.

Ich werde nur die Dinge ansprechen, die allgemein als "definitiv Wurzel brauchen" (oben und anderswo) zitiert werden:

  • Port 80 . Vergessen Sie für eine Minute, dass Sie möglicherweise auf einem nicht privilegierten Port ausgeführt werden möchten (einige Leute haben Apache wie folgt hinter Nginx ausgeführt) ... Sie können weiterhin niedrige Ports als Nicht-Root mit dem Linux-Funktionsframework binden (seit 2.6.24) ;; Geben Sie Apache die Rechte zum Binden an beliebige Ports, unabhängig vom Benutzer:

    sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/apache2
    

    Oder Sie können iptables verwenden, um Port 80 auf einen nicht privilegierten Port umzuleiten.

  • Konfigurationsdateien und Zertifikate lesen . Standardmäßig kann die Konfiguration von jedem Benutzer gelesen werden. Wenn Sie www-data(oder einen anderen Benutzer, der Apache ausführt) daran hindern, Konfigurationen oder Zertifikate zu lesen - was Sie können -, wird der Server beschädigt.

    Einige Leute sprechen über den anfänglichen Root-Prozess, als ob er verwendet werden könnte, um nach dem Start Berechtigungen zu erhalten . Das ist nicht der Fall. Das wäre schrecklich unsicher. Es führt nur nichtprivilegierte untergeordnete Prozesse durch.

Die Wahrheit ist, dass Sie Dinge zerbrechen können, damit dies funktioniert. Tu das nicht. Zumindest nicht, bis Sie den ganzen Beitrag gelesen haben.

sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/apache2
sudo /etc/init.d/apache2 stop
sudo chown -R www-data: /var/{log,run}/apache2/
sudo -u www-data apache2ctl start

Und da bist du ja. Laufen Apache wie ein Badass als www-data.

Geben Sie hier die Bildbeschreibung ein

Aber ich würde das nicht in der Produktion machen. Mein Code oben hat kein Init-Skript dafür, daher müssten Sie ihn ersetzen oder "reparieren" /etc/init.d/apache2, um die Ausführung einer Root-Version zu stoppen und Ihre WWW-Datenversion zu starten. Das ist kein kleines Unterfangen; Schau dir das Skript an.

Vor allem das von Apache verwendete Modell der Deeskalation von Privilegien ist kampferprobt. Jahrelang. Andere Server machen das auch so. Es ist nicht böse .

Wenn Ihre Administratoren sich über das, was Sie ausführen, aufregen, haben Sie mehrere Möglichkeiten:

  • Tun Sie es in einer VM (wie ich es getan habe, um diese Antwort zu testen). lxc, dockerEtc, etc, etc. Minimal - Setup, schönes Licht und sauber und können als „normalen“ Benutzer auf der Außenseite laufen , während wie blankes Metall auf der Innenseite suchen.

  • Verwenden Sie ein httpd, das kein root benötigt. Apache hat ein ganzes Ökosystem, das bestimmte Dinge erwartet, daher ist es keine gute Wahl. Aber was auch immer Sie auswählen, Sie müssen wahrscheinlich ihre Init-Skripte bekämpfen.

  • Wenn Sie nur super-grundlegende Dinge an einem nicht-privaten Port benötigen, können Sie Folgendes ausführen:

    python -m SimpleHTTPServer 8000
    

FWIW Ich habe nicht gesagt, dass Sie nicht können , ich sagte, es wäre schwierig ... und erhebliche Kopfschmerzen.
Thomas Ward

2
Fairer Punkt, du hast gesagt, kann nicht :)
Oli

1
+1 ausgezeichnete Antwort und Empfehlungen. Ein weiterer Grund, warum ich es nicht tun würde, ist, dass wenn apt/ dpkgdas apache2Paket aktualisiert wird, einige Dinge, die Sie getan haben, rückgängig gemacht werden, wodurch wahrscheinlich Ihr Setup beschädigt wird. Sie können Apache von der Quelle anstatt von den Repos installieren, müssen es dann jedoch jedes Mal manuell aktualisieren, wenn ein Update verfügbar ist, bei dem es sich um eine PITA handelt.
Carlos Campderrós

+1 für python -m SimpleHTTPServer 8000. Es hat mir geholfen, auf einem Server zu laufen, auf den ich keinen Root-Zugriff habe, um Apache zu installieren.
Vardhan

8

Die kurze Antwort :

Sie können den ersten Master-Apache-Prozess nicht auf vernünftige Weise als Nicht-Root für den Master-Prozess starten lassen. Dies liegt daran, dass der Master-Prozess als Superuser ausgeführt werden muss, um eine Verbindung zu Port 80 (HTTP) und 443 (HTTPS) herzustellen und auf Konfigurationsdateien zuzugreifen ( /etc/apache2/standardmäßig), damit die Mitarbeiter wissen, was sie tun sollen.

Details dazu finden Sie weiter unten. Viele Webserver in den Repositorys verfügen über ähnliche Setup-Typen (NGINX arbeitet ebenfalls nach denselben Grundprinzipien).



Die Details


Der Apache-Master-Prozess - Hiermit wird auf Konfigurationsdateien zugegriffen und Mitarbeiter an Ports <= 1024 gebunden:

Der Master-Prozess von Apache muss als ausgeführt werden root.

Dies liegt daran, dass alle Konfigurationsdateien in der /etc/apache2/...Regel im Besitz von root sind und für den Zugriff auf (einige) private SSL-Zertifikatdaten ( /etc/ssl/private/...normalerweise) Superuser-Strom benötigt werden.

Administratorzugriff ist auch erforderlich, um an Ports unter 1024 zu binden, einschließlich Port 80 (HTTP) und 443 (HTTPS), damit ein Webserver, der mit typischen HTTP / HTTPS-Ports arbeitet, an diesen Ports ordnungsgemäß funktioniert.

Der Master-Prozess macht nicht viel mehr als das und verarbeitet weder tatsächliche Anforderungen von Clients noch interagiert er tatsächlich mit Webdokumenten usw.


Die Apache Worker-Prozesse - Sie verarbeiten Anfragen von und Antworten auf Webbrowser:

Die Mitarbeiter von Apache bearbeiten tatsächlich Anfragen, die an den Webserver gesendet werden, und kümmern sich um den Zugriff auf Daten im System und das Senden der Antwort an Clients. Ich glaube, hier geht es in Ihrer IT-Richtlinie wirklich darum, als Nicht-Root ausgeführt zu werden.

Dies wird als www-datakein Konto auf Administratorebene ausgeführt und verfügt nicht über erhöhte Berechtigungen. Hier können Standardzugriffskontrollen auf dem System verwendet werden, und genau das gilt für die Einschränkung "Kann nicht als Root ausgeführt werden" - insofern, als Sie nicht möchten, dass die Worker-Prozesse als Root / Superuser ausgeführt werden.


Warum ich denke, dass es eine Fehlkommunikation zwischen Richtlinien und Ihnen gibt, oder warum ich denke, dass Ihre IT-Richtlinien überarbeitet werden müssen und Sie mit den IT-Mitarbeitern in Ihrer Umgebung sprechen sollten:

Wenn in Ihrem Unternehmen / Arbeitsplatz angegeben ist, dass Apache überhaupt nicht als Root ausgeführt werden darf, wenden Sie sich an die IT-Mitarbeiter des Unternehmens.

Der Grund dafür, dass dies eine "schlechte" oder "falsch interpretierte" Richtlinie ist, liegt darin, dass Sie http://somewebaddress.tldoder https://somewebaddress.tldin Ihrer Domain nicht verwenden können, wenn Apache nicht an Port 80 bzw. 443 binden kann. Wenn der Master-Prozess nicht als Root ausgeführt werden soll, müssen Sie den Besitz eines /etc/apache2/*Konfigurationsverzeichnisses manuell ändern oder ein separates Datenverzeichnis für Konfigurationen bereitstellen. Anschließend müssen alle von Apache bereitgestellten Sites Ports abhören, die höher als 1024 sind.


Dies scheint eine gute Erklärung zu sein, aber falls das Audit des OP nicht erfüllt ist, können Sie Apache nicht einfach an einen High-Port (ohne Root) binden und dann eine Port-Umleitung auf Systemebene verwenden (z. B. mit iptables). Um den Verkehr auf Port 80 zum Apache-Port zu bringen? Vielleicht ist das besser auf eine völlig separate Antwort beschränkt.
Apsiller

@apsillers möglicherweise, aber das ist eine andere Frage, die außerhalb des Rahmens dieser Frage liegt. Trotzdem ist das Apache-Paket als Dienst programmiert , der über root ausgeführt wird. Sie könnten Apache manuell ausführen, benötigen aber dennoch "Root" -Zugriff für all diese Dinge. Möglicherweise stoßen Sie auch auf bestimmte Webanwendungen (WordPress usw.), die sich bei diesem Setup nicht richtig verhalten.
Thomas Ward

1

Die Verwendung sudomit nur für die Apache-Steuerungsskripten konfiguriertem Zugriff wird im Allgemeinen als bewährte Methode angesehen. Beseitigt den vorübergehenden "Root" -Zustand zu Beginn nicht vollständig, aber jeder Sicherheitsprüfer, der dies nicht versteht, ist das Geld, das er erhält, nicht wert.

Es ist auch ziemlich einfach, eine benutzerdefinierte Version von Apache im Benutzerbereich zu installieren, um den gesamten Dateieigentum für einen weniger privilegierten Benutzer einzurichten, der nur über sudo über dieses kontrollierte erhöhte Privileg verfügt.


Dadurch wird der Apache-Masterprozess weiterhin als Root gestartet, was von der Richtlinie möglicherweise nicht zugelassen wird, wie ich in meiner Antwort in der Beschreibung darlege, warum der Masterprozess als Root oder mit Superuser-Berechtigungen ausgeführt wird. Meiner Meinung nach fügt diese Antwort nichts hinzu. (Dies würde auch die Probleme mit der Portbindung nicht lösen, und ich glaube nicht, dass sie Apache individuell erstellen möchten.)
Thomas Ward

hah ... meine Klarstellung hat sich mit Ihrem Kommentar gekreuzt ... Sie sind zu schnell für mich. Ja, Sie haben Recht damit, den Zugmeisterprozess als root zu starten, aber ich glaube, dass er nicht direkt die Antwort darauf liefert Was ist aus Sicherheitsgründen die beste Vorgehensweise?
Ricardo Newbery

Dies gilt jedoch als "sicheres" Setup, wenn die Mitarbeiter, die tatsächlich Website-Anfragen / -Daten bearbeiten, nicht privilegiert sind. Ich habe noch keine aus der Quelle kompilierte Version gefunden, die nicht von Apache abweicht und den Master-Prozess tatsächlich korrekt als Nicht-Root ausführen kann ...
Thomas Ward

seufz ... wenn Sie in den Kommentaren auf "Return" klicken ... versuchen Sie es erneut ... Sie haben Recht, dass es vorübergehend als Root gestartet wird, aber wenn Sie sich die nicht vorübergehenden Prozesse ansehen ... sind sie alle Nicht-Root-Benutzer. Dies ist eine bewährte Methode. Die Portbindung an einen niedrigen Port ist in Ordnung. Jeder Sicherheitsprüfer, der dies nicht akzeptieren würde, wird einfach wertlos gekündigt.
Ricardo Newbery

Vielen Dank für Ihre Kommentare / Antworten ... Ich werde versuchen, ihnen zu sagen, dass dies nicht machbar ist.
Beerman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.