PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : start-stop-daemon Chrooted



jghj
14.05.07, 16:30
Hallo Leute,

seit Tagen beiße ich mir nun schon die Zähne daran aus.
Ich möchte meinen Apache in einem jail laufen lassen. Dafür habe ich mir ein kleines startscript geschrieben:



case $1 in
start)
mount -t proc proc $CHRDIR/proc
start-stop-daemon --start --pidfile $PIDFILE --exec $CHRDIR$APCTL --chroot $CHRDIR -- -k start

if [ $? = 0 ]; then
echo "Apache started."
else
echo "Apache konnte nicht gestartet werden."
fi
;;


Das Problem ist, dass er mir sagt, dass er die Datei nicht findet (die ich in --exec angegeben hab)

1. Gedanke ist, er versucht es schon im chrooteten directory (wie es auch in der manpage steht). Also lasse ich $CHRDIR weg. Dann passiert genau das gleiche. D.h. er checkt Vor- und Nach dem ausführen des Prozesses die Verfügbarkeit der Datei.

Hab mir das ganze mit strace angeguckt, was mir auch bestätigt hat, dass ich beim Weglassen des $CHRDIR-Präfix in einer anderen Abfrage lande als wenn der Präfix angeführt ist.

Das heißt start-stop-daemon probiert wirklich, davor UND danach zu prüfen.

Testweise hab ich dann in beide Verzeichnisse (Im echten und im gejailten) eine Kopie des Apacheservers gemacht. Damit kann ich ihn starten. Der arbeitet dann komplett mit den Daten (z.B. Konfigurationsdateien) außerhalb des jails. Aber sitzen tut er im Jail. Das PID-File legt er auch in diesem Jail an.

Das ist aber nicht der Sinn des ganzen würde ich sagen, oder?

Gibt es andere Möglichkeiten, wie ich start-stop-daemon umgehen kann? Oder ähnliche Work-arounds / Bugfixes?

Danke schonmal.

mfg

jghj
17.05.07, 15:46
Hat wirklich keiner eine Idee?

Roger Wilco
17.05.07, 17:02
Warum benutzt du überhaupt den start-stop-daemon? Alle Funktionen kann der Apache httpd (bzw. dann apachectl) selbst ausführen. Das Einsperren des kompletten Webservers oder einzelne Prozesse in einer chroot-Umgebung kannst du dann entweder direkt mit chroot(1) oder mit einem Apache-Modul wie mod_chroot oder mod_security machen.

derRichard
17.05.07, 17:03
hallo!

funktioniert das jail überhaupt?
vielleicht hast du ein paar libs oder sowas vergessen.
es reicht nicht aus, einfach nur die apache-binary in das verzeichnis zu kopieren. :D

//richard

jghj
17.05.07, 17:42
Soo...danke erstmal für eure Antworten.

@Roger Wilco
Dass der Apache diese komplette Funktionalität bietet wusste ich nicht. Aber das Gleiche kann ich nicht für jeden anderen Server als selbstverständlich gegeben nehmen, deshalb wärs schön wenn ich dafür auch eine Lösung finde.

@derRichard
Es funktioniert alles. Habe alles kopiert, und wenn ich per Konsole chroote und dann den selben Pfad auswähle startet der Apache.


Ich denke aber, dass ich den Fehler gefunden habe. Habe mir mal den Source von start-stop-daemon runtergeladen und angeguckt, und voila:



if (execname && stat(execname, &exec_stat))
fatal("stat %s: %s", execname, strerror(errno));


Das wird direkt nach dem parsen der Argumente aufgerufen.

chrooten tut er aber erst viel später. Danach wird dann ausgeführt.

Das heißt ich habe 3 Möglichkeiten:
1. ich gucke, dass ich eine Kopie der Datei im "echten" fs und im gejailten an gleicher Stelle habe (PFUI!)

2. Ich modifiziere den Sourcecode so, dass er im chroot-dir sucht, wenn eins angegeben ist. (Klingt nett, aber wenn dann sollte der Rest der Welt wohl auch diese Änderung mitbekommen und ich weiß nicht an wen ich mich zur publizieren dieses "Bugfixes" wenden soll)

3. Ihr sagt mir wie ich die gleiche funktionalität in bashscript umsetzen kann, sodass ich kein "start-stop-daemon" brauche ;-) Bzw. ich müsste da ja einen neuen Prozess erstellen können, weil wenn ich chroot aufrufe dürfte der Aufrufer sich dann auch in dem chroot-jail wiederfinden oder?

Dann hoff ich mal, dass ihr mich beratet ;-)

mfg jghj

derRichard
17.05.07, 17:45
hallo!

ich würde, wie roger schon gesagt hat die chroot-funktion von mod_security verwenden. :)

//richard

jghj
17.05.07, 17:59
Und was mache ich dann für den ftp-server, den mail-server, den dns usw. ? Es reicht ja schon, dass nur einer von diesen Servern diese Funktionalität nicht unterstützt.

Für den Apache an sich werde ich den offiziellen Weg (also über mod_chroot) gehen. Aber wenn ich jetzt schonmal dabei bin, kann ich mir gleich Gedanken über mein weiteres Vorgehen machen denke ich.

mfg

derRichard
17.05.07, 18:03
hallo!

alles in chroot() legen ist nicht immer sinnvolle.
gute programme machen sowas von haus aus.
am besten man verwendet auch programme, die keine sicherheitsprobleme haben.
(unterschwellige werbung für qmail, djbdns und pure-ftpd...)

//richard

jghj
17.05.07, 18:10
Naja wie auch immer. JEDES Programm hat Sicherheitsprobleme ;-) Manche mehr manche weniger.

Wenn die Guten Programme das jetzt anbieten ist es gut, werde ich das verwenden.

Was mich aber wirklich gewundert hat, dass ich zu diesem Fehler in start-stop-daemon NICHTS gefunden habe. Sowas hätte doch mal auffallen müssen...

Ich habe jetzt kurzerhand den source ergänzt, dass er die Prüfung am Anfang auf den richtigen Pfad anwendet. Und so funktioniert es jetzt auch ;-)

Falls jemand von euch die Anlaufstelle kennt, an wen ich mich -OHNE VIEL ZEITAUFWAND- wenden kann, damit davon auch andere Menschen provitieren können, soll mir die doch bitte nennen.

mfg

derRichard
17.05.07, 18:23
Naja wie auch immer. JEDES Programm hat Sicherheitsprobleme ;-) Manche mehr manche weniger.


naja, kommt drauf an...

welche distri ist das überhaupt? weil das default sysvinit kann bei start-stop-daemon gar kein chroot, das muss jemand reingeflickt haben...

//richard

jghj
17.05.07, 18:30
ein redhat 3.4.5. Das ist die portierte, neuere Version. Die alte war ja in Perl geschrieben. Die neue in C.

Also in den Manpages die ich gefunden habe war chroot überall dokumentiert

derRichard
17.05.07, 18:39
hallo!

redhat 3.4.5? aus welchem gletscher hast das ausgegraben?

also bei dem sysvinit, das es bei sf.net gibt (das offizielle) ist kein chroot dabei.
bei meinem von suse ebenfalls ned.

//richard

jghj
17.05.07, 18:42
Haha ich weiß es selber nicht. Ich bin auch die ganze Zeit davon ausgegangen dass das hier irgendein debian ist. (Ist ein vserver) und soweit ich mich erinnere hab ich den mit debian bestellt.

Jetzt als du mich aber gefragt hast:
cat /proc/version

da steht redhat 3.4.5 ...

naja shit happens

EDIT:

Ich seh aber gerade, dass bei
start-stop-daemon --help

die chroot option nicht aufgeführt wird. Aber in der manpage schon.

derRichard
17.05.07, 18:47
das ist was gaaaaaanz anderes.
das sind nur infos zum kernel.
ich wette das mit redhat 3.4.5 steht beim kompiler, mit dem der kernel gebaut wurde.

//richard

derRichard
17.05.07, 18:49
Ich seh aber gerade, dass bei
start-stop-daemon --help

die chroot option nicht aufgeführt wird. Aber in der manpage schon.

ja, das werden schon die debian-typen reingeflickt haben.
aber beim offiziellen start-stop-daemon gibt es kein chroot, pasta^^

//richard