Opção de comando SSH allowed_keys: vários comandos?

17

As teclas autorizadas possuem uma opção command = "..." que restringe uma chave a um único comando. Existe uma maneira de restringir uma chave a vários comandos? Por exemplo, tendo um regex lá ou editando algum outro arquivo de configuração?

dkaeae
fonte

Respostas:

9

Não. Não é um comando "permitido", mas um comando "forçado" (como opção ForceCommand ).

A única possibilidade é usar teclas diferentes para diferentes comandos ou ler parâmetros stdin.

Jakuje
fonte
27

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 ser avaliada.

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 ~/.ssh/authorized_keyscom

command="/home/user/.ssh/allowed-commands.sh",…
hfs
fonte
1
Útil. Pode valer a pena esclarecer que é o próprio sshd que adiciona SSH_ORIGINAL_COMMAND(por man sshd) para que esteja disponível em scripts. Também para dar um exemplo de scripts automatizados que permitem SSH_ORIGINAL_COMMANDa execução de certos padrões . Veja também unixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
Cedric Knight
7

No grande SSH, The Secure Shell: O Guia Definitivo 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 em seu .authorized_keysarquivo, como:

command="/path/to/your/script.sh" <ssh-key>

... fornece isso ao fazer ssh:

Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit
Your choice:
gf_
fonte
Mas esse script basicamente breaks scp, sftpe todas as outras coisas que você pode achar útil algum dia.
Jakuje 4/10/16
3
@Jakuje Isso não é válido para a commandopção em geral?
gf_ 06/10
1

Outras abordagens usam, por exemplo, um shell restrito para o usuário especificado ou usam um wrapper que restringe os 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 argumentos de linha de comando para os comandos permitidos, mas permite bloqueá-los com regras expressas como expressões regulares.

Este exemplo seria expresso da seguinte maneira:

command="only systemctl shutdown"

E um .onlyrulesarquivo seria criado 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.

Georg Lehner
fonte
O problema com a alteração do shell é que ele se aplicará a todos os logons, mesmo aqueles com uma chave que não se destina a ser restrita. Além disso, se você apenas fizer o login no shell e não tiver acesso de administrador, não poderá simplesmente mudar o shell configurado para o que quiser. Mas você ainda pode editar seu arquivo allowed_keys.
kasperd
Você pode usar um "shell restrito" como umForcedCommand
Georg Lehner
Ocorre-me que, na situação em que a conta sendo usada é uma conta de usuário normal e as ações necessárias são privilegiadas, pode-se contar com o sudo para fazer a verificação e definir a opção de comando author_keys como "sudo $ SSH_ORIGINAL_COMMAND"?
Steve Dee