Adicionando um usuário que só pode executar scripts remotamente

14

Gostaria de criar um usuário que possa fazer apenas uma coisa: via ssh, especifique um script (e argumentos de linha de comando para o script) que reside em uma pasta específica (para os fins desta pergunta, vamos chamá-lo /local/remote_only_scripts/foo) e fazer com que o script seja executado e retornar sua saída.

Para esclarecer alguns exemplos de coisas que não quero que o usuário possa fazer:

  • Faça login localmente na conta. O aplicativo de login é /bin/login. Não é um script na /local/remote_only_scripts/foopasta, portanto, não deve ser chamado pelo usuário.
  • Faça login remotamente na conta. Novamente, o login (é o que é chamado pelo ssh?) Não é um script na pasta relevante.
  • Listar o conteúdo do diretório. Está dentro /bin/ls. Não é um script no diretório apropriado.
  • Edite um arquivo nesse diretório. O emacs, vi, gedit, a maioria dos outros editores não são scripts nesse diretório.
  • Veja o conteúdo de um arquivo nesse diretório.
  • Execute um arquivo nesse diretório que ele não tem permissão para executar.

Observe que estes são exemplos. Existem muitas outras ações que eu não quero que o usuário possa executar. Ao considerar uma ação, pergunte "isso está sendo feito por um script /local/remote_only_scripts/foo?" se a resposta for negativa, o usuário não poderá fazê-lo. Se a resposta for sim, o usuário deve ser capaz de fazê-lo.

PS: Deixe-me esclarecer o que quero dizer com "adicionando um usuário". Não quero adicionar um usuário a algum subsistema ssh. Em vez disso, quero dizer adicionar um usuário ao sistema do computador. Então, por exemplo, eu tenho um sistema executando o debian stable, chame-o pelo seu endereço, www.hg.bar.com. Eu quero adicionar um usuário (via kuser, users-admin ou useradd ou alguma maneira similar) chamá-lo de hg_guest. O hg_guest não pode fazer login localmente ou executar qualquer uma das ações da lista acima. Tudo o que o hg_guest pode fazer é executar scripts "remotamente". Eu disse que ele deveria ser capaz de fazê-lo via ssh, mas pensando nisso agora, talvez permitir que ele use o ssh pode permitir que ele efetue login localmente, portanto, pode ser necessário outro mecanismo.

HandyGandy
fonte

Respostas:

12

Há uma opção de comando no arquivo allowed_keys. Esta opção parece fazer exatamente o que você deseja.

Observe que não é um chroot ou um shell restrito. Está permitindo executar apenas esses comandos via ssh. Com o seu exemplo, seria:

ssh somehost /local/remote_only_scripts/foo

Para este arquivo allowed_keys:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

Há muitas maneiras, se você não quiser que seu usuário possa fazer login localmente. Você também pode :

  • basta definir seu shell como / bin / false (talvez você precise de / bin / true, pois o ssh precisa de um login válido)
  • bloqueie sua senha, consulte passwd -l

EDIT : adicionadas mais opções de restrição e esclarecemos como você remove o acesso local.

Coren
fonte
Eu não acho que você precise especificar esse comando no ssh no lado do cliente, é um comando 'forçado', para que seja sempre executado;) O usuário no site remoto ainda precisa de um shell válido definido em / etc / passwd.
jirib
1
Além disso command=, no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptysão necessárias opções para realmente restringir a conta.
Jofel
Está bem. Acordei no meio da noite e decidi verificar as respostas. Como estou sonolento, não assimilarei a resposta inteira, mas perguntarei algo que me deixa confuso. Como isso impede que o hg_quest efetue login a partir de um tty?
HandyGandy
@HandyGandy Esta é a parte mais simples. Eu adicionei 2 maneiras de fazer isso, mas eu acho que há mais
Coren
0

Tente isso como o shell de logon para o usuário:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

Você provavelmente também desejará incluir isso no authorized_keysarquivo explicitamente, como na resposta de Coren; mas substitua o '... / foo; com o programa aqui. Isso vai impedir que os comandos do SSH como sftp, scp, e ssh hostname command.

Arcege
fonte
Se você deseja que o usuário possa executar apenas os comandos do seu diretório (e não há muitos), retire o "prog" da leitura acima e use uma instrução select para oferecer um menu de texto com opções desses programas e faça a leitura dos argumentos. Também testaria isso para garantir o que acontece se você digitar vários Ctrl-Cs em vários pontos do script. Você pode querer um comando trap aqui também.
29512 Joe
0

Na hipótese de eles precisarem acessar apenas um script, isso funciona muito bem para mim. Adicione o usuário e altere seu shell padrão para o caminho do script. Quando eles se conectam via ssh, ele executa o script e fecha a sessão.

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest: x: 2002: 100 :: / home / hg_guest: /local/remote_only_scripts/foo/script.sh

2bc
fonte