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

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

Eu gostaria de criar um usuário que só possa fazer uma coisa: via ssh especificar um script (e argumentos de linha de comando para o script) que resida em uma pasta específica (para os propósitos desta questão, vamos chamá-lo /local/remote_only_scripts/foo) e executar esse script e retorne sua saída.

Para deixar claro 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 (é isso que é chamado pelo ssh?) não é um script na pasta relevante.
  • Liste o conteúdo do diretório. ls está dentro /bin/ls. Não é um script no diretório apropriado.
  • Edite um arquivo nesse diretório. emacs, vi, gedit a maioria dos outros editores não são scripts nesse diretório.
  • Visualize 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ãoexemploshá muitas outras ações que não quero que o usuário possa realizar. Ao considerar uma ação, pergunte "isso está sendo feito por um script em /local/remote_only_scripts/foo?" se a resposta for não, o usuário não poderá fazê-lo. Se a resposta for sim, o usuário deverá ser capaz de fazê-lo.

PS: Deixe-me esclarecer o que quero dizer com "adicionar um usuário". Não me refiro a 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 rodando debian stable, chame-o pelo endereço www.hg.bar.com. Quero adicionar um usuário (via kuser, users-admin ou useradd ou alguma forma semelhante) e chamá-lo de hg_guest. hg_guest não pode fazer login localmente ou fazer qualquer uma das coisas da lista acima. Tudo o que hg_guest pode fazer é executar scripts "remotamente". Eu disse que ele deveria ser capaz de fazer isso via ssh, mas pensando nisso agora, talvez permitir que ele use ssh possa permitir que ele faça login localmente, então algum outro mecanismo pode ser necessário.

Responder1

Há umcomandoopção no arquivo autorizado_keys. Esta opção parece fazer exatamente o que você deseja.

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

ssh somehost /local/remote_only_scripts/foo

Para este arquivo autorizado_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 consiga fazer login localmente. Você também pode :

  • basta definir seu shell para/bin/falso(talvez você precise/bin/verdadeirojá que o ssh precisa de um login válido)
  • bloquear sua senha, vejapasswd -l

EDITAR: adicionou mais opções de restrição e esclarece como você remove o acesso local.

Responder2

Tente isto como shell de login 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á ter isso explicitamente no authorized_keysarquivo, como na resposta de Coren; mas substitua o '.../foo; com o programa aqui. Isso impedirá comandos de SSH como sftp, scpe ssh hostname command.

Responder3

Caso eles precisem 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 conectarem via ssh, ele executará o script e fechará 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

informação relacionada