Tomcat ohne root Rechte neu starten

Freitag, der 9. Januar 2009, 21:51 Uhr von Stefan

Problemstellung/Motvation:
Bei einem Ubuntu 8.04 LTS Server trat das Problem auf, dass wir jemanden zwar die Möglichkeit geben wollten den Tomcat-Server neu zu starten, jedoch keine root Rechte für diesen Benutzer ausgeben wollten. Das Neustarten war notwendig, da bei häufigeren Dispatchen der Tomcat-Server abstürzt und zusätzlich noch Java Prozesse hängen bleiben.

Der Ansatz ist folgender:
Um mit Benutzerrechten das neu starten anstoßen zu können muss der Vorgang zweigeteilt werden.
1. Gibt es ein vordefiniertes Skript welches tomcat beendet, alle Javaprozesse killt (es gibt sonst keine Anwendung auf diesem Server die Java Prozesse verwendet) und danach tomcat wieder startet.
Dieses Script wird zyklisch von einem Cron Job aufgerufen welcher mit root Rechten ausgeführt wird.
Dabei überprüft das Skript ob eine ausgewählte Datei im Dateisystem vorhanden ist. Ist diese Vorhanden wird tomcat neu gestartet und die Datei wieder gelöscht.

2. Der Benutzer bekommt ein Skript mit dem er diese Datei anlegen kann.

Vorgang für den Benutzer:

1. Anmeldung per ssh auf den Server
2. Ausführung des Scripts
3. 1 Minuten warten bis der Cronjob die “Auslöser-Datei” gefunden hat.
4. Tomcat wird neu gestartet und die Datei wird gelöscht.

Die Einrichtung dieser Funktion ist denkbar einfach:
1. Scriptdatei zum Neustarten (hier gespeichert unter /root/script/reset_tomcat.sh)

if [ -f /usr/local/tomcat/script/reset_tomcat ]
then
/etc/init.d/tomcat stop
killall -v java
/etc/init.d/tomcat start
rm /usr/local/tomcat/script/reset_tomcat
fi

2. Skript ausführbar machen

chmod 744 /root/script/reset_tomcat.sh

3. Anlegen eines für den Benutzer schreibbares Unterverzeichnis:

mkdir /usr/local/tomcat/script
chown tomcat:users /usr/local/tomcat/script

4. Anlegen des Benutzerskripts zu Ablegung der Auslöser-Datei. (hier /usr/local/tomcat/reset_tomcat.sh)

echo "Tomcat wird in der nächsten Minute neu gestartet..."
echo "" > /usr/local/tomcat/script/reset_tomcat

5. Auslöser-Script ausführbar machen

chmod 755 /usr/local/tomcat/reset_tomcat.sh

5. Cronjob anlegen welcher die Datei /root/script/reset_tomcat.sh jede Minute ausführt.

Schlusswort
Diese Auslöser können natürlich auch für alle anderen vordefinierten Möglichkeiten und Programme verwendet werden. Auch wäre es möglich die Auslöser Datei durch ein PHP Script erstellen zu lassen und somit den Benutzer gar keine SSH Zugangsdaten geben zu müssen.
Jedoch müsste diese PHP Seite am besten nur per https zugänglich gemacht und mit einem Passwort abgesichert werden um Missbrauch zu verhinden.
Die Sicherheit ist dadurch gegeben, dass der Benutzer keine Veränderungen an dem Script welches mit root Rechten ausgeführt wird vornehmen kann.
In meinem Beispiel habe ich einen vertrauenswürdigen Programmierer. Natürlich könnte jemand auch jede Minute den Server neu starten und somit die Applikation unbrauchbar machen. Aber die Lösung ist erweiterbar um eine “Floodsperre” oder ähnliche Limitierungen

Update:
Neulich habe ich eine weitere wohl viel elegantere Lösung für dieses Problem gesehen.
(da ich zufälligerweise von einer Sicherheitslücke in diesem System gehört hab http://www.heise.de/security/meldung/Schwachstellen-in-sudo-geschlossen-942611.html)
Mit dem sudoers kann man jedem User root Rechte für bestimmte Befehle geben. z.B. eben, dass der User tomcat den Befehl /etc/init.d/tomcat restart durchführen darf. http://wiki.ubuntuusers.de/sudo/Konfiguration

Geschrieben in: Ubuntu-Linux | Schlagwörter: , ,
0 Trackbacks | 3 Kommentare »

3 Antworten

  1. Peter sagt:

    Wie verschlüsselst du php-Seiten per SSL? Wenn dann Verschlüsselst du die Verbindung von Client zur Server per SSL. Was das aber genau für einen Sicherheitsvorteil bringen soll, ist mir grad nicht klar..

  2. Stefan sagt:

    @Peter
    Du hast recht es wird die Verbindung zwischen Server und Client verschlüsselt.
    Sinn macht das genau dann wenn manden Zugriff auf die “Neustartkonsole” per Passwort schützt und das Passwort nicht unsicher über die Leitung gehen soll.
    Vielleicht hätte ich schreiben, sollen, dass besser eine https Verbindung für den Aufruf der PHP Datei dienen soll, damit Passwörter nicht im Klartext über die Leitung gehen.

    Danke und Grüße

  3. Alex sagt:

    Das mit dem umgehen der vergabe der Root-Rechte hast du gut gelöst finde ich :-)

Einen Kommentar abgeben

Bitte beachten Sie: Die Kommentare werden moderiert. Dies kann Ihren Kommentar verzögern. Es besteht aber kein Grund, ihn nochmal abzuschicken.

*