GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man SSH-Benutzer nach der Anmeldung auf einen vordefinierten Satz von Befehlen beschränken?

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 .


Linux
  1. So richten Sie SSH-Tunneling ein

  2. So beschränken Sie den SSH-Zugriff für Benutzer mit LShell (Limited Shell)

  3. So richten Sie SSH-Schlüssel ein

  4. Wie überprüfe ich, ob eine Shell angemeldet/interaktiv/Batch ist?

  5. Wie ändere ich die Cron-Shell (sh in Bash)?

So richten Sie eine passwortlose SSH-Anmeldung ein

Wie richte ich eine passwortlose SSH-Anmeldung mit ssh-keygen ein?

So beschränken Sie den SSH-Zugriff auf bestimmte Benutzer in Linux

So ändern Sie eine Benutzer-Shell in Linux

So richten Sie SSH unter CentOS und RHEL ein

Wie führe ich automatisch Befehle bei der SSH-Anmeldung aus?