Bio: Die BSDler muessten das wissen: Braucht Apache Root?

Hallo!

Ich habe gerade so eine Ultra-Hochsicherheits-Installation unter Linux in der Mache, bei der der Webserver mit Hilfe der - natuerlich von BSD abgekupferten - "Capabilities" in einem unausbrechbaren chroot-Kaefig als User laufen soll. Das ist dann quasi Jail fuer Linux, nennt sich aber compartment oder auch cage.
Diese Capabilities ermoeglichen, einem Prozess in einer sehr feinen Granularitaet Rechte zu geben, also z.B. auf Ports zugreifen, Raw-Packets schicken, Dateien zerbroeseln etc..
Dummerweise scheint der Apache, obwohl ich ihm die Rechte dazu gegeben habe, davon ueberzeugt zu sein, nicht auf Port 80 "bind"en zu koennen; moeglicherweise, weil er nicht als root laeuft?
Nun steht in der Doku vom Apache nichts davon, dass man ihn evtl. davon ueberzeugen koennte, dass er auch als User auf Port 80 zugreifen darf.

Weil es ja moeglicherweise noch viel sicherer sein koennte, wenn nicht mal der Parent-Prozess vom Apache root waere, haetten wir das gerne hinbekommen.
Ich hoffe, die BSD-ler unter uns, die Streiter wieder die Unsicherheit, die uebrigens meine Helden sind, wenn sie mir nicht gerade wegen irgendwelcher Lapalien Vorwuerfe machen (als root im chat etc... dabei wisst ihr ja nicht mal, ob die ID vom User root bei mir lokal auch 0 ist...), kennen sich aus und koennen Auskunft geben.

Bitte bitte!

Hatte ich erwaehnt, dass das morgen fertig sein muss?

;-)

Gruesse,

Bio

  1. Dummerweise scheint der Apache, obwohl ich ihm die Rechte dazu gegeben habe, davon ueberzeugt zu sein, nicht auf Port 80 "bind"en zu koennen; moeglicherweise, weil er nicht als root laeuft?
    Nun steht in der Doku vom Apache nichts davon, dass man ihn evtl. davon ueberzeugen koennte, dass er auch als User auf Port 80 zugreifen darf.

    Nur wenn Apache root ist, kann er sich unter Linux mit dem privilegierten Port 80 (unter 1024 dürfen AFAIK nur root-Programme ran) binden, und er wechselt zur Laufzeit ja auch den User (vermutlich "insgesamt"), nachdem er sich verbunden hat.

    Und wenn ich Apache so sehe, dann denke ich, daß er keinen einzigen Request als root ausführt, sondern erstmal den port bindet, dann die UID und GID changet, und dann erst childs forkt, um requests zu handlen. ;)

    Von BSD komm ich nicht, mein Apache fiel bei der Suse-Installation mit raus, keine Ahnung gibts bei mir kostenlos, aber vermutlich ist das der einzige Moment, wo ein root-Apache irgendwelchen Schaden anrichten könnte, wenn er denn dürfte. Und da er ja nicht alle Sekunde neu gestartet werden soll, ist das recht selten.

    - Sven Rautenberg

    1. Hoi, <-- Begruessung

      Nur wenn Apache root ist, kann er sich unter Linux mit dem
      privilegierten Port 80 (unter 1024 dürfen AFAIK nur root-Programme ran)
      binden, und er wechselt zur Laufzeit ja auch den User (vermutlich
      "insgesamt"), nachdem er sich verbunden hat.

      Stimmt.

      Und wenn ich Apache so sehe, dann denke ich, daß er keinen einzigen
      Request als root ausführt, sondern erstmal den port bindet, dann die
      UID und GID changet, und dann erst childs forkt, um requests zu
      handlen. ;)

      Auch das stimmt. Aber die Problematik ist eine andere: Programme, die als
      root gestartet wurden und den root-status wieder abgeben, koennen ihn
      theoretisch auch wiederholen. Wenn also der Apache irgendwann mal einen
      Buffer-Overrun-Exploit bekommt, dann kann es durchaus sein, dass der
      Angreifer darueber eine root-Shell bekommt.
      Letztenendes koennen wir uns also nur auf die Programmierer verlassen, dass
      sie keinen Mist bauen.

      Gruesse,
       CK

      1. Sup!

        Es gibt also auch unter BSD keinen megageheimen Spezialtrick? Ich muß den Apache als Root starten?

        Verdammt, ist das aber _gefährlich_!

        ;-)

        Gruesse,

        Bio

        1. Sup!

          Es gibt also auch unter BSD keinen megageheimen Spezialtrick? Ich muß den Apache als Root starten?

          Vielleicht nicht unter BSD ...

          ... aber unter Linux!

          Wenn Du den Apache partout nicht als root starten willst, dann laß den Apache unter einem unpriviligierten User-Account laufen, binde ihn an einen anderen Port, z.B. 8765, aber nur für die IP-Adresse 127.0.0.1 (localhost). Dann baust Du mit iptables bzw. ipchains ein Port-Forwarding, daß extern Port 80 auf 127.0.0.1 Port 8765 umleitet.

          Möglicher Seiteneffekt: Der Apache könnte eine etwas andere Meinung über die REMOTE_IP_ADDRESS haben als im Normalbetrieb.

          Verdammt, ist das aber _gefährlich_!

          ;-)

          Eben. So löcherig wie der Apache ist. Nimm besser gleich den IIS, da kann auch keiner im Quelltext nach Sicherheitslücken suchen. ;-))

          Tux2000

          Gruesse,

          Bio

          1. Sup!

            Wenn Du den Apache partout nicht als root starten willst, dann laß den Apache unter einem unpriviligierten User-Account laufen, binde ihn an einen anderen Port, z.B. 8765, aber nur für die IP-Adresse 127.0.0.1 (localhost). Dann baust Du mit iptables bzw. ipchains ein Port-Forwarding, daß extern Port 80 auf 127.0.0.1 Port 8765 umleitet.

            Möglicher Seiteneffekt: Der Apache könnte eine etwas andere Meinung über die REMOTE_IP_ADDRESS haben als im Normalbetrieb.

            Gute Idee! Die hatten wir nämlich auch gehabt... und im Notfall machen wir das auch.
            Naja, der Apache ist eigentlich ziemlich safe, und wenn die capabilities einigermassen funktionieren, dann ist das insgesamt schon wesentlich sicherer als die meisten Sachen.

            Eben. So löcherig wie der Apache ist. Nimm besser gleich den IIS, da kann auch keiner im Quelltext nach Sicherheitslücken suchen. ;-))

            Grrrr! Den Server hat unsere Linux-Gruppe hart erkämpft, den geben wir doch nicht der Novell bzw. Windoof-Gruppe zurück! ;-)

            Gruesse,

            Bio