PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SSH restricted commands



valhalla
14-09-2010, 07:44
Hallo zuasammen,

Ich habe folgendes Problem.

ssh user@host < /path/script

funktioniert ohne Probleme, in "script" steht nur hostname drin, führe ich den Befehl aus bekomme ich den Hostnamen der remote Maschine, so weit so gut.

Wenn ich nun aber in der authorized_keys folgendes hinzufüge.
command="/path/allowed_commands"

und den Befehl erneut aufrufe funktioniert es nicht, in der allowed_commands steht hostname* als erlaubt drin, ein
"ssh user@host hostname" funktioniert weiterhin, ich möchte aber den input aus einer Datei nehmen und nicht die Kommandos einzeln eintippn.

Hat jemand eine Idee warum das mit < /path/script nicht funktioniert ?
Bin für jeden Tip dankbar.

Der Vollständigkeit hier der Inhalt von allowed_commands

#!/bin/bash

echo "$SSH_ORIGINAL_COMMAND" >>/tmp/ssh_log.log

case "$SSH_ORIGINAL_COMMAND" in

hostname*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo ERROR: invalid command "${SSH_ORIGINAL_COMMAND}" is not allowed.
;;
esac

John W
14-09-2010, 09:14
Hat jemand eine Idee warum das mit < /path/script nicht funktioniert ?
Ganz einfach: Das ist interaktiv, da musst du die Shell erlauben, die das ausführt.

Da das nicht ungefährlich ist (sonst hättest du das ja anders gelöst), wäre es sinnvoller, das Skript einmal per scp rüberzuschieben und zu den allowed commands hinzuzufügen, dann brauchst du bloß das Skript per "ssh user@host -c <pfad>" auszuführen.
Dabei Shebang ("#!/bin/bash" als erste Zeile) und chmod u+x nicht vergessen.

Wenn du das Skript für root chown'st, musst du natürlich a+x setzen, damit dein Nutzer das ausführen kann, er kann das Skript dann nicht bearbeiten -> sicher.

valhalla
14-09-2010, 09:39
Hi erstmal danke für deine Antwort.

mir ist noch etwas schleierhaft was genau ich den erlauben müsste damit es geht ?

John W
14-09-2010, 09:51
Zunächst hast du ja die Datei "/path/script" lokal auf deinem Rechner, die lädst du per "scp /path/skript/ user@host:/usr/local/bin/skript" in die Path-Umgebung des Servers (kannst du zwar auch woanders hinlegen, aber /usr/local/bin ist für sowas eig. vorgesehen). Dann machst du folgendes:


ssh user@host
chmod a+x /usr/local/bin/skript
su -c chown root:root /usr/local/bin/skript
# dann Passwort für root eintippseln
sed 's#hostname#skript#' /pfad/zu/allowed_commands -i # Alternativ den hostname-Zweig in case durch skript ersetzen: skript*) ...

Des weiteren müsstest du in deiner allowed_commands an den Anfang folgendes einfügen:


SSH_ORIGINAL_COMMAND="$@"

Sonst ist SSH_ORIGINAL_COMMAND nicht gesetzt, es würde also in keinem Falle etwas ausgeführt werden.

Zudem eine Berichtigung: Der ssh-Aufruf sieht dann so aus:


ssh user@host -c /pfad/zu/allowed_commands skript

Wenn du skript woanders hinlegst als in /usr/local/bin (oder anderweitig außerhalb von PATH), musst du in allen Fällen den kompletten Pfad angeben.
Desweiteren muss deine allowed_commands ausführbar sein (x-Flag).

valhalla
14-09-2010, 09:59
Hi ich glaube jetzt haben wir aneinander vorbei geredet bzw. ich hab mich nicht klar genug ausgedrückt.

Was ich eigentlich wissen wollte ist, wenn ich den aufruf trotzdem über
ssh user@host < /path/script
machen wollte was müsste in der allowed_commands stehen damit es klappt.

Trotzdem noch mal danke für die Ausführliche Erklärung.

John W
14-09-2010, 10:03
Wo hast du die allowed_commands überhaupt her? In keiner Dokumentation von SSH steht was über diese Datei drin. Wenn du diese Datei benutzen willst, musst du sie von Hand ausführen. Übrigens ist die Datei zwecklos, wenn sie dadurch umgangen werden kann, dass man sich interaktiv einloggt, da darf man alles, was der User darf.

valhalla
14-09-2010, 10:20
die allowed_commands ist slebst angelegt und in der authorized_keys definiert

content authorized_keys:
command="/srv/www/shared/allowed_commands" EIN_PUB_KEY


content allowed_commands:
#!/bin/bash

echo "$SSH_ORIGINAL_COMMAND" >>/tmp/ssh_log.log

case "$SSH_ORIGINAL_COMMAND" in

hostname*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo ERROR: invalid command "${SSH_ORIGINAL_COMMAND}" is not allowed.
;;
esac

Wer mit dem enstprechenden Public Key kommt kann dann eben nur noch das ausführen was in allowed_commands steht.

Auch wenn ich es nach dieser diskusion anderst lösen werde würde mich doch intressieren was ich in der allowed_commands erlauben müsste damit
ssh user@host < /path/script
doch funktioniert.

John W
14-09-2010, 10:27
ES GEHT NICHT. Da müsstest du eine komplette Shell für erlauben, damit das möglich wäre, die kannst du dann zwar in eine chroot sperren, aber der Aufwand wird nicht lohnen, zumal du damit je nach Zweck auch gar nichts mehr mit diesem System anfangen kannst.

valhalla
14-09-2010, 11:44
merci für deine Mühe