Wie SSH-Benutzer auf einen vordefinierten Satz von Befehlen nach dem Login beschränken?

StackOverflow https://stackoverflow.com/questions/402615

  •  03-07-2019
  •  | 
  •  

Frage

Dies ist eine Idee für eine Sicherheit. Unsere Mitarbeiter haben Zugang zu einigen Befehlen auf einem Linux-Server haben, aber nicht alle. Sie werden zum Beispiel haben die Möglichkeit, eine Protokolldatei (less logfile) zuzugreifen oder verschiedene Befehle (shutdown.sh / run.sh) zu starten.

Hintergrundinformationen:

Alle Mitarbeiter Zugriff auf den Server mit dem gleichen Benutzername: Unser Produkt läuft mit „normalen“ Benutzerberechtigungen, wird keine „Installation“ erforderlich. Einfach entpacken Sie es in Ihrem Benutzerverzeichnis und führen Sie es. Wir verwalten mehrere Server, auf denen unsere Anwendung „installiert“. Auf jeder Maschine gibt es einen Benutzer johndoe. Unsere Mitarbeiter müssen manchmal Zugriff auf die Anwendung auf der Kommandozeile für den Zugriff auf und überprüfen Sie die Protokolldateien oder die Anwendung von Hand neu zu starten. Nur werden einige Leute volle Kommandozeile Zugriff haben.

Wir verwenden PPK-Authentifizierung auf dem Server.

Es wäre toll, wenn employee1 nur das Logfile zugreifen und employee2 kann auch tun X etc ...

Lösung: Als Lösung werde ich die command Option wie in der aufgeführt sind akzeptiert Antwort. Ich werde meinen eigenen kleinen Shell-Skript, das die einzige Datei sein, die für ausgeführt werden können einige Mitarbeiter. Das Skript wird mehrere Befehle bieten, die ausgeführt werden können, aber keine anderen. Ich werde die folgenden Parameter in authorized_keys von verwenden wie angegeben hier :

command="/bin/myscript.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
ssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= user@host

Das ist genug, um die Sicherheit für uns. Danke, Community!

War es hilfreich?

Lösung

Sie können auch Tasten auf dem zulässigen Befehl (in der authorized_keys-Datei) beschränken.

d. würde der Benutzer über ssh nicht anmelden und dann einen eingeschränkten Befehlssatz hat, sondern nur dann erlaubt, würde diese Befehle via ssh (zum Beispiel „ssh some ist / showlogfile“)

auszuführen

Andere Tipps

ssh folgt die rsh Tradition durch den Shell-Programm aus der Passwort-Datei des Benutzers unter Verwendung von Befehlen auszuführen.

Das bedeutet, dass wir dies ohne Beteiligung ssh Konfiguration in irgendeiner Weise lösen können.

Wenn Sie nicht der Benutzer möchte in der Lage sein, einen Shell-Zugang zu haben, dann ersetzen Sie einfach, dass Shell des Benutzers mit einem Skript. Wenn Sie in /etc/passwd aussehen werden Sie sehen, dass es ein Feld, das jedem Benutzer eine Shell-Befehlsinterpreter zuweist. Das Skript wird als Shell verwendet, um sowohl für ihre interaktive Login ssh user@host sowie für Befehle ssh user@host command arg ....

Hier ist ein Beispiel. Ich habe einen Benutzer foo der Schale ist ein Skript. Das Skript gibt die Meldung my arguments are: von seinen Argumenten gefolgt (jeweils auf einer separaten Zeile und in spitze Klammern) und endet. Im Login-Fall gibt es keine Argumente. Hier ist, was passiert:

webserver:~# ssh foo@localhost
foo@localhost's password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.

Wenn der Benutzer einen Befehl auszuführen versucht, sieht es wie folgt aus:

webserver:~# ssh foo@localhost cat /etc/passwd
foo@localhost's password:
my arguments are:
<-c>
<cat /etc/passwd>

Unsere „Shell“ erhält einen -c Stil Aufruf, mit dem gesamten Befehl als ein Argument, nur die gleiche Art und Weise, dass /bin/sh es erhalten würde.

So wie Sie sehen können, was wir tun können, ist jetzt das Skript weiter zu entwickeln, so dass sie den Fall erkennt, wenn es mit einem -c Argument aufgerufen wurde, und analysiert dann die Zeichenfolge (zB durch Pattern-Matching). Diese Strings, die erlaubt sind, können durch rekursiv Aufruf /bin/bash -c <string> auf dem Real Shell übergeben werden. Der ablehnen Fall kann eine Fehlermeldung aus und beenden (einschließlich dem Fall, wenn -c fehlt).

Sie müssen vorsichtig sein, wie Sie diese schreiben. Ich empfehle nur positive Begegnungen schreiben, die nur ganz bestimmte Dinge zu erlauben und verbieten alles andere.

Hinweis: , wenn Sie root sind, können Sie immer noch in dieses Konto anmelden, indem Sie die Schale in dem su Befehl überschreibt, wie diese su -s /bin/bash foo. (Ersatzschal der Wahl.) Nicht-Wurzel kann dies nicht tun.

Hier ist ein Beispiel-Script: den Benutzer in nur mit ssh für git Zugriff auf Repositorys unter /git beschränken

.
#!/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 sind wir darauf vertrauen, dass diese Git Programme git-upload-pack und git-receive-pack keine Löcher haben oder Luken entkommen, die Benutzer auf das System zugreifen, geben wird.

Das ist in dieser Art von Beschränkung Schema inhärent. Der Benutzer wird authentifiziert Code in einer bestimmten Sicherheitsdomäne auszuführen, und wir sind kludging in einer Einschränkung, dass die Domain auf eine Sub-Domain zu begrenzen. Zum Beispiel, wenn Sie erlauben es einem Benutzer den vim Befehl auf einer bestimmten Datei ausführen zu bearbeiten, kann der Benutzer nur eine Schale mit :!sh[Enter] erhalten.

Was Sie suchen heißt Restricted Shell . Bash stellt einen solchen Modus, in dem Benutzer nur dann vorhanden Befehle in ihren Home-Verzeichnissen ausführen können (und sie können nicht in andere Verzeichnisse verschieben), die gut genug für Sie sein könnte.

Ich habe dieses Thema gefunden sehr illustrativ sein, wenn etwas veraltet.

Sie sollten erwerben `rssh‘, die eingeschränkt Shell

Sie können die Einschränkung Führern erwähnt oben folgen, sind sie alle ziemlich selbsterklärend und einfach zu folgen. Verstehen Sie die Begriffe `chroot Gefängnis‘, und wie man effektiv sshd / Anschlusskonfigurationen implementieren, und so weiter.

Sein als die meisten Ihrer Benutzer Zugriff auf Ihre Terminals über sshd, sollten Sie auch prüfen sshd_conifg wahrscheinlich, der SSH-Daemon-Konfigurationsdatei, bestimmte Einschränkungen über SSH anzuwenden. Seien Sie vorsichtig, aber. Verstehen Sie richtig, was Sie versuchen, zu implementieren, für die Auswirkungen von Fehlkonfigurationen sind wohl eher düster.

Warum nicht Sie Ihre eigenen Login-Shell schreiben? Es wäre ganz einfach sein Bash zu verwenden für diese, aber Sie können eine beliebige Sprache verwenden.

Beispiel in Bash

Verwenden Sie Ihre Lieblings-Editor die Datei /root/rbash.sh zu erstellen (dies einen beliebigen Namen oder Pfad sein kann, aber sollte chown root:root und chmod 700 werden):

#!/bin/bash

commands=("man" "pwd" "ls" "whoami")
timestamp(){ date +'%Y-%m-%s %H:%M:%S'; }
log(){ echo -e "$(timestamp)\t$1\t$(whoami)\t$2" > /var/log/rbash.log; }
trycmd()
{
    # Provide an option to exit the shell
    if [[ "$ln" == "exit" ]] || [[ "$ln" == "q" ]]
    then
        exit

    # You can do exact string matching for some alias:
    elif [[ "$ln" == "help" ]]
    then
        echo "Type exit or q to quit."
        echo "Commands you can use:"
        echo "  help"
        echo "  echo"
        echo "${commands[@]}" | tr ' ' '\n' | awk '{print "  " $0}'

    # You can use custom regular expression matching:
    elif [[ "$ln" =~ ^echo\ .*$ ]]
    then
        ln="${ln:5}"
        echo "$ln" # Beware, these double quotes are important to prevent malicious injection

        # For example, optionally you can log this command
        log COMMAND "echo $ln"

    # Or you could even check an array of commands:
    else
        ok=false
        for cmd in "${commands[@]}"
        do
            if [[ "$cmd" == "$ln" ]]
            then
                ok=true
            fi
        done
        if $ok
        then
            $ln
        else
            log DENIED "$cmd"
        fi
    fi
}

# Optionally show a friendly welcome-message with instructions since it is a custom shell
echo "$(timestamp) Welcome, $(whoami). Type 'help' for information."

# Optionally log the login
log LOGIN "$@"

# Optionally log the logout
trap "trap=\"\";log LOGOUT;exit" EXIT

# Optionally check for '-c custom_command' arguments passed directly to shell
# Then you can also use ssh user@host custom_command, which will execute /root/rbash.sh
if [[ "$1" == "-c" ]]
then
    shift
    trycmd "$@"
else
    while echo -n "> " && read ln
    do
        trycmd "$ln"
    done
fi

Alles, was Sie tun müssen, ist diese ausführbare Datei als Login-Shell gesetzt. Zum Beispiel, bearbeiten Sie Ihre /etc/passwd-Datei, und ersetzen Sie die aktuellen Login-Shell des Benutzers /bin/bash mit /root/rbash.sh.

Dies ist nur ein einfaches Beispiel, aber man kann es so weit fortgeschritten, wie Sie wollen, ist die Idee, dort. Seien Sie vorsichtig, um sich nicht aussperren von Login-Shell der eigenen und nur Benutzer zu ändern. Und testet immer seltsame Symbole und Befehle, um zu sehen, ob es tatsächlich sicher ist.

Sie können es testen mit:. su -s /root/rbash.sh

Achtung: , stellen Sie sicher, dass der gesamten Befehl entspricht, und seien Sie vorsichtig mit Wildcards! Besser ausschließen Bash-Symbole wie ;, &, &&, ||, $ und Backticks sicher sein.

auf die Freiheit Je Sie den Benutzer geben, wird es nicht viel sicherer als dieses. Ich habe das oft finde ich nur einen Benutzer machen benötigt, die den Zugriff auf nur wenige relevanten Befehle haben, und in diesem Fall ist dies wirklich die bessere Lösung. Allerdings müssen Sie mehr Freiheit geben wollen, ein Gefängnis und Berechtigungen könnten besser geeignet sein. Fehler leicht gemacht werden, und bemerken erst, wenn es schon zu spät.

Sie können ein Gefängnis .

Ein andere Möglichkeit, dies zu betrachten POSIX ACLs verwendet, muss sie von Ihrem Dateisystem unterstützt werden, jedoch kann man feinkörnige Abstimmung aller Befehle in Linux auf die gleiche Weise die gleiche Kontrolle, unter Windows (nur ohne die schönere UI). Link

Eine andere Sache zu prüfen, ist PolicyKit .

Sie finden alles ziemlich viele googeln zu tun haben, zum Laufen zu bringen, da dies definitiv nicht eine Stärke von Linux im Moment ist.

[Disclosure: Ich schrieb sshdo die weiter unten beschrieben wird]

Wenn Sie die Login wollen interaktiv sein dann nur eine eingeschränkte Shell Einrichtung ist wahrscheinlich die richtige Antwort. Aber wenn es ein tatsächlicher Satz von Befehlen, die Sie zulassen wollen (und sonst nichts), und es ist in Ordnung für diese Befehle einzeln per ssh ausgeführt werden (zB ssh user @ host cmd arg bla bla), dann eine generische Befehlssteuerung Whitelisting für ssh könnte sein, was Sie brauchen. Dies ist nützlich, wenn die Befehle irgendwie am Client Skript und erfordern nicht die Benutzer tatsächlich im ssh-Befehl eingeben.

Es gibt ein Programm namens sshdo, dies zu tun. Es steuert die über eingehende SSH-Verbindungen ausgeführt werden können Befehle. Es ist zum Download verfügbar unter:

http://raf.org/sshdo/ (lesen Manpages hier) https://github.com/raforg/sshdo/

Es hat einen Trainingsmodus alle Befehle zu ermöglichen, die versucht werden, und eine --learn Option, um die Konfiguration zu erzeugen, benötigt, um gelernte Befehle dauerhaft zu ermöglichen. Dann können Trainingsmodus ausgeschaltet werden und alle anderen Befehle nicht ausgeführt werden.

Es hat auch eine --unlearn Option, so dass Befehle zu stoppen, die nicht mehr in Gebrauch sind, um strenge geringst möglichen Privilegien zu erhalten, wie Anforderungen im Laufe der Zeit ändern.

Es ist sehr wählerisch, was es erlaubt. Es wird kein Befehl mit irgendwelchen Argumenten erlauben. Nur vollständige Shell-Befehle erlaubt werden können.

Aber es hat einfache Muster unterstützen Ähnliche Befehle darstellen, die nur in den Stellen unterscheiden, die in der Befehlszeile erscheinen (z Sequenznummern oder Datum / Zeitstempel).

Es ist wie eine Firewall oder ein Whitelisting-Steuerung für ssh-Befehle.

Und es unterstützt verschiedene Befehle für verschiedene Benutzer dürfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top