sshsegue la rshtradizione utilizzando il programma shell dell'utente dal file delle password per eseguire i comandi.
Ciò significa che possiamo risolvere questo problema senza coinvolgere sshin 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 foocui 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 -cun'invocazione di stile, con l'intero comando come un argomento, proprio nello stesso modo in cui /bin/shlo 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 -cargomento, 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 -cmanca).
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 sucomando, 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 sshper l' gitaccesso 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-packe git-receive-packnon 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 vimcomando su un file specifico per modificarlo, l'utente può semplicemente ottenere una shell con :!sh[Enter].