Não. Não é o comando "permitido", mas o comando "forçado" (como ForceCommand
option).
A única possibilidade é usar chaves diferentes para comandos diferentes ou ler parâmetros de stdin
.
O authorized_keys tem uma opção command="..." que restringe uma chave a um único comando. Existe uma maneira de restringir uma chave a comandos múltiplos ? Por exemplo. por ter um regex lá, ou editando algum outro arquivo de configuração?
Você pode ter apenas um comando por chave, porque o comando é "forçado".
Mas você pode usar um script de wrapper. O comando chamado obtém a linha de comando original como variável de ambiente $SSH_ORIGINAL_COMMAND
, que pode avaliar.
Por exemplo coloque isso em ~/.ssh/allowed-commands.sh
:
#!/bin/sh
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.
case "$SSH_ORIGINAL_COMMAND" in
"systemctl restart cups")
systemctl restart cups
;;
"shutdown -r now")
shutdown -r now
;;
*)
echo "Access denied"
exit 1
;;
esac
Em seguida, referencie-o em ~/.ssh/authorized_keys
com
command="/home/user/.ssh/allowed-commands.sh",…
No excelente livro SSH, O Secure Shell: The Definitive Guide de O'Reilly, no capítulo oito , há um bom exemplo dado usando um script como o seguinte:
#!/bin/sh
/bin/echo "Welcome!
Your choices are:
1 See today's date
2 See who's logged in
3 See current processes
q Quit"
/bin/echo "Your choice:"
read ans
while [ "$ans" != "q" ]
do
case "$ans" in
1)
/bin/date
;;
2)
/usr/bin/who
;;
3)
/usr/bin/top
;;
q)
/bin/echo "Goodbye"
exit 0
;;
*)
/bin/echo "Invalid choice '$ans': please try again"
;;
esac
/bin/echo "Your choice:"
read ans
done
exit 0
Usando isso no seu arquivo .authorized_keys
como:
command="/path/to/your/script.sh" <ssh-key>
... dá-lhe isto quando faz ssh
:
Welcome!
Your choices are:
1 See today's date
2 See who's logged in
3 See current processes
q Quit
Your choice:
Outras abordagens utilizam, e. um shell restrito para o usuário especificado ou use um wrapper que restringe comandos a todos os arquivos / scripts encontrados em um diretório específico, permitindo assim aumentar a lista de comandos sem alterar o wrapper.
Outro artigo descreve um script genérico, que também permite que argumentos de linha de comando sejam permitidos comandos, mas permite bloqueá-los com regras expressas como expressões regulares.
Este exemplo seria expresso da seguinte maneira:
command="only systemctl shutdown"
E um .onlyrules
arquivos seriam criados com este conteúdo:
\:^systemctl restart cups$:{p;q}
\:^shutdown -r now$:{p;q}
A vantagem dessa abordagem 'única' é que não há necessidade de escrever scripts individuais para cada usuário e situação.