GNU/Linux >> Linux Esercitazione >  >> Linux

Come limitare gli utenti SSH a un set predefinito di comandi dopo l'accesso?

Puoi anche limitare le chiavi ai comandi consentiti (nel file authorized_keys).

Cioè. l'utente non effettuerebbe l'accesso tramite ssh e quindi disporrà di un insieme ristretto di comandi, ma piuttosto gli sarà consentito solo di eseguire tali comandi tramite ssh (ad es. "ssh somehost bin/showlogfile")


Quello che stai cercando si chiama Restricted Shell. Bash fornisce una tale modalità in cui gli utenti possono solo eseguire i comandi presenti nelle loro home directory (e non possono spostarsi in altre directory), il che potrebbe essere abbastanza buono per te.

Ho trovato questo thread molto esplicativo, anche se un po' datato.


ssh segue il rsh tradizione utilizzando il programma shell dell'utente dal file delle password per eseguire i comandi.

Ciò significa che possiamo risolverlo senza coinvolgere ssh configurazione in alcun modo.

Se non vuoi che l'utente sia in grado di avere accesso alla shell, sostituisci semplicemente la shell di quell'utente con uno script. Se guardi in /etc/passwd vedrai che c'è un campo che assegna un interprete dei comandi della shell a ciascun utente. Lo script è usato come shell sia per il loro login interattivo ssh [email protected] così come per i comandi ssh [email protected] command arg ... .

Ecco un esempio. Ho creato un utente foo la cui shell è uno script. Lo script stampa il messaggio my arguments are: seguito dai suoi argomenti (ciascuno su una riga separata e tra parentesi angolari) e termina. Nel caso di log, non ci sono argomenti. Ecco cosa succede:

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

Se l'utente tenta di eseguire un comando, avrà questo aspetto:

webserver:~# ssh [email protected] cat /etc/passwd
[email protected]'s password:
my arguments are:
<-c>
<cat /etc/passwd>

La nostra "shell" riceve un -c style, con l'intero comando come argomento, proprio come /bin/sh lo riceverebbe.

Quindi, come puoi vedere, ciò che possiamo fare ora è sviluppare ulteriormente lo script in modo che riconosca il caso in cui è stato invocato con un -c argomento, quindi analizza la stringa (diciamo per pattern matching). Le stringhe consentite possono essere passate alla shell reale invocando ricorsivamente /bin/bash -c <string> . Il caso di rifiuto può stampare un messaggio di errore e terminare (incluso il caso in cui -c è mancante).

Devi stare attento a come lo scrivi. Consiglio di scrivere solo corrispondenze positive che consentono solo cose molto specifiche e non consentono tutto il resto.

Nota: se hai root , puoi comunque accedere a questo account sovrascrivendo la shell in su comando, come questo su -s /bin/bash foo . (Sostituire shell a scelta.) Non root non può farlo.

Ecco uno script di esempio:limita l'utente a usare solo ssh per git accesso ai repository sotto /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"

Naturalmente, confidiamo che questi programmi Git git-upload-pack e git-receive-pack non avere buchi o portelli di fuga che consentano agli utenti di accedere al sistema.

Ciò è insito in questo tipo di schema di restrizione. L'utente è autenticato per eseguire il codice in un determinato dominio di sicurezza e stiamo introducendo una restrizione per limitare tale dominio a un sottodominio. Ad esempio, se consenti a un utente di eseguire vim comando su un file specifico per modificarlo, l'utente può semplicemente ottenere una shell con :!sh[Enter] .


Linux
  1. Come impostare le chiavi SSH

  2. Come verificare se una shell è login/interactive/batch?

  3. Come cambiare Cron Shell (sh To Bash)?

  4. Continua Comandi Shell una volta connesso a Ssh?

  5. Come modificare (permanentemente) la shell predefinita dopo l'accesso su un Ttyn specifico in Linux?

Come configurare l'accesso SSH senza password

Come configurare l'accesso SSH senza password utilizzando ssh-keygen?

Come limitare l'accesso SSH a determinati utenti in Linux

Come modificare una shell utente in Linux

Come disabilitare l'accesso SSH con password

Come configurare SSH su CentOS e RHEL