Sie können Schlüssel auch auf zulässige Befehle beschränken (in der Datei "authorized_keys").
D.h. Der Benutzer würde sich nicht über ssh anmelden und dann einen eingeschränkten Satz von Befehlen haben, sondern würde diese Befehle nur über ssh ausführen dürfen (z. B. "ssh somehost bin/showlogfile")
Was Sie suchen, heißt Restricted Shell. Bash bietet einen solchen Modus, in dem Benutzer nur Befehle ausführen können, die in ihren Home-Verzeichnissen vorhanden sind (und sie nicht in andere Verzeichnisse wechseln können), was für Sie gut genug sein könnte.
Ich fand diesen Thread sehr anschaulich, wenn auch etwas veraltet.
ssh
folgt auf rsh
Tradition, indem das Shell-Programm des Benutzers aus der Passwortdatei verwendet wird, um Befehle auszuführen.
Das bedeutet, dass wir dies lösen können, ohne ssh
einzubeziehen Konfiguration in irgendeiner Weise.
Wenn Sie nicht möchten, dass der Benutzer Shell-Zugriff hat, ersetzen Sie einfach die Shell dieses Benutzers durch ein Skript. Wenn Sie in /etc/passwd
suchen Sie werden sehen, dass es ein Feld gibt, das jedem Benutzer einen Shell-Befehlsinterpreter zuweist. Das Skript wird als Shell sowohl für ihren interaktiven Login ssh [email protected]
verwendet sowie für Befehle ssh [email protected] command arg ...
.
Hier ist ein Beispiel. Ich habe einen Benutzer foo
erstellt dessen Shell ein Skript ist. Das Skript gibt die Nachricht my arguments are:
aus gefolgt von seinen Argumenten (jeweils in einer separaten Zeile und in spitzen Klammern) und endet. Im Log-in-Fall gibt es keine Argumente. Folgendes passiert:
webserver:~# ssh [email protected]
[email protected]'s password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.
Wenn der Benutzer versucht, einen Befehl auszuführen, sieht das so aus:
webserver:~# ssh [email protected] cat /etc/passwd
[email protected]'s password:
my arguments are:
<-c>
<cat /etc/passwd>
Unsere "Hülle" erhält eine -c
Stilaufruf, mit dem gesamten Befehl als ein Argument, genauso wie /bin/sh
würde es erhalten.
Wie Sie sehen, können wir das Skript jetzt so weiterentwickeln, dass es den Fall erkennt, wenn es mit einem -c
aufgerufen wurde -Argument und analysiert dann die Zeichenfolge (z. B. durch Mustervergleich). Die erlaubten Zeichenketten können durch rekursiven Aufruf von /bin/bash -c <string>
an die echte Shell übergeben werden . Der Ablehnungsfall kann eine Fehlermeldung ausgeben und sich beenden (einschließlich des Falls, wenn -c
fehlt).
Du musst aufpassen, wie du das schreibst. Ich empfehle, nur positive Übereinstimmungen zu schreiben, die nur sehr bestimmte Dinge zulassen, und alles andere zu verbieten.
Hinweis: wenn Sie root
sind , können Sie sich trotzdem bei diesem Konto anmelden, indem Sie die Shell in su
überschreiben Befehl, wie dieser su -s /bin/bash foo
. (Ersetzen Sie die Shell Ihrer Wahl.) Nicht-Root kann dies nicht.
Hier ist ein Beispielskript:Beschränken Sie den Benutzer darauf, nur ssh
zu verwenden für git
Zugriff auf Repositories unter /git
.
#!/bin/sh
if [ $# -ne 2 ] || [ "$1" != "-c" ] ; then
printf "interactive login not permitted\n"
exit 1
fi
set -- $2
if [ $# != 2 ] ; then
printf "wrong number of arguments\n"
exit 1
fi
case "$1" in
( git-upload-pack | git-receive-pack )
;; # continue execution
( * )
printf "command not allowed\n"
exit 1
;;
esac
# Canonicalize the path name: we don't want escape out of
# git via ../ path components.
gitpath=$(readlink -f "$2") # GNU Coreutils specific
case "$gitpath" in
( /git/* )
;; # continue execution
( * )
printf "access denied outside of /git\n"
exit 1
;;
esac
if ! [ -e "$gitpath" ] ; then
printf "that git repo doesn't exist\n"
exit 1
fi
"$1" "$gitpath"
Natürlich vertrauen wir darauf, dass diese Git-Programme git-upload-pack
und git-receive-pack
keine Löcher oder Notausstiege haben, die Benutzern Zugang zum System gewähren.
Das ist dieser Art von Beschränkungssystem inhärent. Der Benutzer wird authentifiziert, um Code in einer bestimmten Sicherheitsdomäne auszuführen, und wir fügen eine Einschränkung hinzu, um diese Domäne auf eine Unterdomäne zu beschränken. Zum Beispiel, wenn Sie einem Benutzer erlauben, vim
auszuführen Befehl auf eine bestimmte Datei, um sie zu bearbeiten, kann der Benutzer einfach eine Shell mit :!sh[Enter]
erhalten .