ssh
segue la rsh
tradizione utilizzando il programma shell dell'utente dal file delle password per eseguire i comandi.
Ciò significa che possiamo risolvere questo problema senza coinvolgere ssh
in alcun modo la configurazione.
Se non vuoi che l'utente possa avere accesso alla shell, sostituisci semplicemente la shell dell'utente con uno script. Se guardi dentro /etc/passwd
, vedrai che c'è un campo che assegna un interprete dei comandi di shell ad ogni utente. Lo script viene utilizzato come shell sia per il loro login interattivo ssh user@host
che per i comandi ssh user@host command arg ...
.
Ecco un esempio. Ho creato un utente la foo
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 del registro, non ci sono argomenti. Ecco cosa succede:
webserver:~
foo@localhost's password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.
Se l'utente tenta di eseguire un comando, assomiglia a questo:
webserver:~
foo@localhost's password:
my arguments are:
<-c>
<cat /etc/passwd>
La nostra "shell" riceve -c
un'invocazione di stile, con l'intero comando come un argomento, proprio nello stesso modo in cui /bin/sh
lo riceverebbe.
Quindi, come puoi vedere, quello che possiamo fare ora è sviluppare ulteriormente lo script in modo che riconosca il caso quando è stato invocato con un -c
argomento, e quindi analizzi la stringa (diciamo tramite pattern matching). Quelle 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
manca).
Devi stare attento a come scrivi questo. Consiglio di scrivere solo corrispondenze positive che consentono solo cose molto specifiche e non consentono tutto il resto.
Nota: se lo sei root
, puoi comunque accedere a questo account sovrascrivendo la shell nel su
comando, in questo modo su -s /bin/bash foo
. (Sostituisci la shell di scelta.) Non root non può farlo.
Ecco uno script di esempio: limita l'utente all'utilizzo solo ssh
per l' git
accesso ai repository in /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 )
;;
( * )
printf "command not allowed\n"
exit 1
;;
esac
gitpath=$(readlink -f "$2")
case "$gitpath" in
( /git/* )
;;
( * )
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, ci fidiamo che questi programmi Git git-upload-pack
e git-receive-pack
non abbiano buchi o portelli di fuga che consentiranno agli utenti di accedere al sistema.
Ciò è inerente a questo tipo di regime di restrizione. L'utente è autenticato per eseguire codice in un determinato dominio di sicurezza e stiamo adottando una restrizione per limitare quel dominio a un sottodominio. Ad esempio, se consenti a un utente di eseguire il vim
comando su un file specifico per modificarlo, l'utente può semplicemente ottenere una shell con :!sh[Enter]
.