einiges zu avanti (linux) -> das gute startskript
Thomas Berger
ThB at gymel.com
So Mai 23 10:55:22 CEST 2004
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hallo Herr Lehmann,
vielen Dank fuers Debuggen meines Startskripts!
| aber ein problem:
| mittlerweile ist eine weitere conf.datei in ihrer sammlung aufgetaucht.
|
| am ende ihres startskiptes steht:
| probe)
| ## Optional: Probe for the necessity of a reload, print out the
| ## argument to this init script which is required for a reload.
| ## Note: probe is not (yet) part of LSB (as of 1.2)
|
| test /etc/avanti2/avanti2.conf -nt $AVANTI_PID && echo reload
| ;;
| *)
| echo "Usage: $0
{start|stop|status|try-restart|restart|force-reload|relo
| exit 1
| ;;
|
|
| ich greife mal das raus:
| test /etc/avanti2/avanti2.conf -nt $AVANTI_PID && echo reload
| ~~~~~~~~~~~~
| also, DAS hatten wir nicht ausgemacht ;-) wo kommt diese conf. her?
garnicht. es sollte die normale avanti.conf sein. An dieser Stelle wird
verglichen, ob die Datei $AVANTI_CONF (also bei mir /etc/avanti.conf )
neuer ist als die pid-Datei von Avanti: Wenn ja, behauptet das Skript,
dass ein Reload angebracht waere.
Die Zeile sollte also lauten:
test $AVANTI_CONF -nt $AVANTI_PID && echo reload
| ich hoffe sehr, daß das ein schreibfehler ist, und eigentlich ... ja
was heisst?
| komme nicht dadrauf: mit $AVANTI_PID arbeitet doch nur (ihr) startskript?!
Ja. Das ist aber eigentlich auch ein Bug: In meinem Kaefig fehlte
/var/run und irgendwann hatte ich (falsch) geschlossen, dass der
neue avanti keine pid-Datei mehr erzeugt, in der er seine Prozessnummer
hinterlegt und diesen Mechanismus dann simuliert.
Wenn avanti nicht als root laeuft, muss man etwas aufpassen, was die
Rechte angeht: Hier muss man vorher in /var/run eine leere avanti.pid
erzeugen, die avanti gehoert, denn sonst kann avanti sie nicht
anlegen, wenn er nicht als root laeuft. Das war frueher anders, da
wurde die pid-Datei noch unstandardmaessiger im Startverzeichnis
abgelegt. Das Z-Target z.B. hat einen eingebauten Mechanismus, die
effektive Userid zu aendern, d.h. es kann als root gestartet werden,
erzeugt seine .pid-Datei und beschneidet sich dann von alleine die
Rechte...
Andererseits wird die pid-Datei auch nicht benoetigt, wenn
man checkproc hat (startproc, killproc, checkproc beruecksichtigen
sie nur, wenn sie mit der Realitaet uebereinstimmt)...
| zusammenfassend mal wieder:
| es gibt diese !dateien!, die sich um das wohl und wehe (oder auch das
sein und nicht sein) von sh. kümmern:
|
| /etc/avanti.conf (aus dem avantipaket, deklaration der datenbankdateien)
| gehört logischerweise zu /etc m weil dort alles
conf-mäßiges landet
Ist aber nur eine Kopiervorlage. Genauer: Ich habe es als "Original"
deklariert, damit avanti es nutzt, wird die Datei staendig an den
von avanti erwarteten Ort kopiert.
| /etc/suseconfig/avanti2
| enthält variablen z.b. die vorgabe des avanti-users und
des käfigs
| (run_chrootes=yes)
ist bei mir /etc/sysconfig/avanti2 (Suse 8.2)
| /etc/init.d/avanti2
| das moderne&gute startskript, welches avanti starten
lässt z.b.
| mit einem ausgewählten user. dieses skript verhindert
auch, daß avanti mehrfach
| laufen kann
das Skript ist es nicht, das das verhindert. Das Skript arbeitet nur
konsequent mit startproc und checkproc, die Mehrfachstarts verhindern.
Diese Kommandos gibt es allerdings nur unter Linux, nicht unter allen
U**Xen.
| eine kopie von /etc/avanti.conf gibt es in (z.b.:)
/usr/local/avanti-x.x.x/etc/avanti.conf
wenn /usr/local/avanti-x.x.x die Avanti-Installation ist, die benutzt
wird.
| fehlt eine datei?
huebsch ist /etc/logrotate.d/avanti2
/var/log/avanti/avanti.log {
~ daily
~ dateext
~ missingok
~ compress
~ copytruncate
~ notifempty
~ maxage 60
~ rotate 99
~ postrotate
~ /etc/init.d/avanti2 reload
~ endscript
}
aber das ist wieder ein anderer Mechanismus (man logrotate)
oder /etc/cron.d/avanti2:
# check existence of avanti every 5 minutes
1-56/5 * * * * root ~avanti/bin/av-dog
mit dem Skript ~avanti/bin/av-dog:
#!/bin/sh
function av_start() {
~ echo "Have to restart avanti!";
~ /etc/init.d/avanti2 restart;
~ /etc/init.d/avanti2 status;
~ return
~ }
/sbin/checkproc -c ~avanti/jail /bin/avanti || av_start;
# that's it
In Ihrer 2. Mail dann:
| /etc/avanti2/avanti2.conf
| es gibt doch gar kein !verzeichnis! mit dem namen /etc/avanti2 ????
| (s.a. vorherige mail)
s.o.
| kl>Hm. Normalerweise haben Pakete kein eigenes etc-Verzeichnis.
| kl>Ich selber habe fuer mich daher eingefuehrt, in /etc/avanti.conf
| kl>die Einstellungen zu machen. Das Verwaltungsskript aus
| kl>/etc/init.d kopiert das dann an die unuebliche Stelle, wo avanti
| kl>es erwartet. Wenn avanti chrooted ablaeuft, werden dabei auch
| kl>gleichzeitig die Pfade umgeschrieben.
|
| ja. eigentlich sonnenklar.
| die conf oder cnf-files gehören nach /etc und evtl in dort vorhandene
unterverzeichnisse (z.b. apache1 hat
| /etc/httpd; währenddessen apache2 ein /etc/apache2 hat; aber das
gehört nicht hierher ;-)
... das hatte mich zu "avanti2" als Namen angeregt.
| eine kleine macke gibt es noch, und das hat etwas mit suse's YAST zu
tun. wird yast mit dem runlevel-editor
| aufgerufen, dann wird automatisch avanti runtergefahren. (bei mir
unter 8.2 so!). mit webmin gibt es keine
| probleme! start/stop usw ist dort alles ok! sehr ok!
Naja: Einerseits erkennt der runlevel-Editor, dass es etwas
zu erkennen gibt:
### BEGIN INIT INFO
# Provides: avanti2
# Required-Start: $syslog $remote_fs
# X-UnitedLinux-Should-Start: $time ypbind
# Required-Stop: $syslog $remote_fs
# X-UnitedLinux-Should-Stop: $time ypbind
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: avanti server for allegro databases
# Description: avanti server for access to databases under allegro-C
# (TU Braunschweig, http://www.allegro-c.de), listening on 4949 TCP
### END INIT INFO
andererseits sind in /etc/rc3.d und /etc/rc5.d die entsprechenden
Links noch nicht eingerichtet (das macht schliesslich der runlevel-
Editor). Beim Beenden (oder muss man dafuer einmal im runlevel-
Editor den Dienst noch einmal aktivieren?)
| (kleine) frage(n):
| startproc -e -l /var/log/avanti.out -t5 -u domainadmin -g www .....
| ~~~~~~~~~~~~~~~~~
| welchen sinn hat eigentlich diese logdatei? sie ist sicherlich NICHT
ein ersatz für die avanti.log, die in
| avanti.conf definierg wird.
Ist das stdout von avanti. Gluecklicherweise bislang immer
leer. Evtl. nicht leer, wenn es Probleme mit der hineinkonfigurierten
Logdatei gibt?
| kl>| ich habe den eindruck, daß mit dem startskript eine künstliche welt
| kl>aufgebaut wird. diese soll DEN DA
| kl>| draussen ver(w)irren! ist die verwirrung tatsächlich nötig?
| kl>
| kl>Das mit der kuenstlichen Welt sehen Sie richtig. Die hat aber nicht
| kl>unbedingt den Zweck zu verwirren, sondern sie soll ausreichend sein,
| kl>damit ihre Einwohner lebensfaehig sind: Ein in einer chroot-Umgebung
| kl>ablaufender Prozess sieht nur diese kuenstliche Welt und hat absolut
| kl>keine Chance mehr, auf die "reale Welt" jenseits des Kaefigs
| kl>zuzugreifen.
|
| ja, sie setzen sogar ash ein.
Der Grund ist folgender: Die Sache lief nicht, bis mir Herr Butkus
erklaerte, dass avanti irgendeinen System-Call benutzt, der eine
Shell aufmacht. Welche ist wohl ziemlich egal, und "ash" benoetigt
viel weniger Libraries als bash.
| aber, ist denn die welt auf einem normalen linux-server nicht auch
sicher?
| apache hilft dabei. ich habe document_root, ich habe data, auf die per
avanti zugegriffen wird. auf die
| einzelnen rechte usw (chmod/chown) muss man natürlich aufpassen.
| WAS kann da schiefgehen?
So genau kenne ich mich da nicht aus. Typische Exploits laufen wohl
so ab, dass durch irgendwelche Eingabedaten der Prozess "kontrolliert"
zum Absturz gebracht wird und dabei irgendwelche eigentlich nicht
ueberschreibbaren Dateien ueberschreibt (Angeblich auch, wenn er
nicht als root laeuft, aber als root gestartet wurde). Das ist
dann der erste Schritt, um von ferne die Kontrolle ueber das
System zu bekommen (vgl. die von Ihnen zitierten code-Red-Angriffe:
Hier wird unter Windows etwas aehnliches gemacht, naemlich versucht,
eine gefaelschte cmd.exe irgendwo unterzubringen). In einem chroot-
Kaefig gibt es aber keine gefaehrlichen Orte mehr, weil das
Dateisystem nur simuliert ist. Fuer ftp-Server z.B. ist das
ziemlich gaengig.
| kl>~ - Ein Skript in /etc/rc3.d braucht man stets, damit avanti
| kl>~ beim Boot automatisch gestartet wird, am besten jedoch (nur Linux)
| kl>~ ein elaborierters in /etc/init.d, damit auch der Runlevel-Editor
| kl>~ damit etwas anfangen kann
|
| ist interessant: yast (oder wer?) hat automatisch in /etc/rc.d/rc3.d
eine datei(link):
| @S13avanti2 reingeschieben .....
der Runlevel-Editor, nachdem Sie Ihn aufgerufen hatten.
| denke dass hier die probleme (u.a.) auch liegen:
| im pidfile. (in status wird /var/run/avanti.pid verlangt!). man sollte
vielleicht sicherheitshabler das
| pidfile in conf.php ebenfalls definieren.
/var/run/avanti.pid ist fest verdrahtet. Existiert standardmaessig
aber nur dann, wenn avanti als root laeuft (s.o.)
| dann wird in der status.php dort beim starten nicht mit "startproc -e
- -l /var/log/avanti.out -t5 -u
| domainadmin -g www ....." gearbeitet.
| kann man nicht in der status.php mit so etwas ähnlichem arbeiten wie
s.o. -u und -g ???
Nein, checkproc etc. benoetigen root-Rechte.
Aber auch mit primitiveren Mechanismen wie "kill" haben Sie Probleme:
Das kann nur root oder der User, unter dessen Kennung der Prozess
laeuft. D.h. entweder avanti unter der apache-Kennung (wwwrun) laufen
lassen, oder auf Restart ueber avadmin verzichten (Neustart eines
abgestuerzten avanti geht mit suid, das ist nicht das Problem.
Ist zudem "IniFileTimeCheck=on" gesetzt, sollte avanti die meisten
Konfigurationsaenderungen auch ohne Restart mitbekommen).
viele Gruesse
Thomas Berger
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3-nr1 (Windows XP)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org
iD8DBQFAsGb6ENVh3bB0lwMRAk+HAJ0Y5wAKXaGU5Yt8SeEt5GHC3CtwIwCfWTD7
KtajPs7wKiwJ2Rdl0c8G6M8=
=pd/B
-----END PGP SIGNATURE-----
Mehr Informationen über die Mailingliste Allegro