AdminDay 2009: Wenn sich der Admin in den Fuß schießt

Seite 6: ins Auge

Inhaltsverzeichnis

Manchmal hat der Administrator die Chance, seinen Fußschuss ungeschehen zu machen. Das schmerzt zwar oft, spart aber meist viel Zeit:

11:50 Uhr. Ich ändere schnell die Konfiguration des SSH-Servers. Server einmal stoppen und wieder starten:

# vi /etc/sshd/sshd_config
# /etc/init.d/sshd stop
# /etc/init.d/sshd start

Der zweite Befehl beendet neben dem Server-Prozess auch die aktuelle SSH-Sitzung. Leider steht der Rechner 20 Kilometer entfernt, wird aber in 10 Minuten gebraucht. Was also tun?

Der Netzwerkscanner nmap zeigt auf dem Server eine aktiven FTP-Server, bei dem sich ein Root-Benutzer anmelden kann.

# ftp host
ftp> get /etc/init.d/sshd
ftp> cd /etc/cron.hourly
ftp> put sshd
ftp> chmod +x sshd

Punkt 12:00 Uhr weckt Cron den SSH-Server auf. Nach dem Anmelden schnell die Datei /etc/cron.hourly/sshd löschen, und die Situation ist gerettet!

In einer ähnlichen Situation fummelten zwei Hobby-Admins auf ihrem Root-Server am installierten Debian-Linux (Woody). Der Hoster bot zu jener Zeit weder einen automatischen Neustart noch ein Rescue-System an, das die Situation kostengünstig hätte retten könnten. Ob es damals ein Up- oder ein Downgrade war, das den SSH-Server lahmlegte, ist nicht mehr sicher festzustellen:

Große Panik, wir kamen nicht mehr per SSH-Konsole auf den Server. Allerdings liefen alle anderen Dienste wie FTP, WWW und E-Mail ohne Probleme weiter. Ach, FTP! Das ist ja praktisch. Damit bekommt man ja Dateien auf den Server und wieder runter. Und der Webserver führt CGIs aus. Damit wären wir ja fast schon wieder drinnen!

Der Gedanke wurde schnell in einem CGI-Script umgesetz, das uns per ps mitteilte, dass der SSH-Server nicht läuft. Was wir ja bereits wussten! Also einmal den SSH-Server neu starten, vielleicht sagt er dabei ja was Sinnvolles. Aber unser CGI-Script läuft mit den Rechten des Webserver-Benutzer www-data. Die üblichen Methoden via su oder sudo wollten auch nicht so recht im CGI funktionieren, da sie interaktiv ein Passwort abfragen.

Hilfe versprach das glücklicherweise installierte Tool expect. Das CGI-Skript wechselte per expect in den Root-Account und startet testweise den SSH-Server. Der beendet sich wegen falscher Parameter in der Konfiguration wieder, schrieb aber ins Browser-Fenster, dass er den eingestellten Wert von ListenAddr nicht mag.

Die neue Fassung des Skripts ändert mit dem Stream-Editor sed den Eintrag in der Einrichtungsdatei und wirft erneut den Server an. Nach einigen Sekunden konnten wir uns wieder anmelden.

#!/bin/sh

echo "Content-Type: text/plain"
echo
echo "-----------------"
expect 2>&1 <<END
set timeout 30
spawn "su"
expect -re "Password: "
sleep 1
send "XXX\r"
expect -re "#"
send "/etc/init.d/ssh start"
expect -re "#"
#send "apt-get install ssh=1:3.4p1-1.woody.3 -y --force-yes\r"
#expect -re "#"
#send "sed -i '/ListenAddr/ s/::/0.0.0.0/' /etc/ssh/sshd_config\r"
#expect -re "ssp:"
END