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

14

Eu gostaria de criar um usuário que só pode 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 fins desta questão, vamos chamá-lo de /local/remote_only_scripts/foo ) e ter esse script 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 na conta localmente. O aplicativo de login é /bin/login . Não é um script na pasta /local/remote_only_scripts/foo , portanto, não deve ser chamado pelo usuário.
  • Fazer login remotamente na conta. Novamente, o login (é chamado de ssh?) Não é um script na pasta relevante.
  • Listar o conteúdo do diretório. ls está em /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 nessa direção.
  • 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.

Note que estes são exemplos , existem muitas outras ações que eu não quero que o usuário seja capaz de fazer. 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á fazer isso. Se a resposta for sim, então o usuário deve ser capaz de fazê-lo.

PS: Deixe-me esclarecer o que quero dizer com "adicionar um usuário". Não quero dizer adicionar um usuário a algum subsistema ssh. Em vez disso, quero dizer adicionar um usuário ao sistema de computador. Então, por exemplo, eu tenho um sistema rodando debian stable, chame pelo endereço, www.hg.bar.com. Eu quero adicionar um usuário (via kuser, users-admin ou useradd ou de alguma forma similar) chamá-lo de hg_guest. hg_guest não pode entrar localmente ou fazer qualquer uma das coisas na lista acima. Tudo o que 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 faça login localmente, então algum outro mecanismo pode ser necessário.

    
por HandyGandy 19.03.2012 / 06:54

3 respostas

12

Existe uma opção comando no arquivo authorized_keys. Esta opção parece fazer exatamente o que você quer.

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

ssh somehost /local/remote_only_scripts/foo

Para este arquivo authorized_keys:

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

Há muitas formas de se você não quiser que seu usuário possa fazer login localmente. Você pode:

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

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

    
por 19.03.2012 / 09:09
0

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

    
por 19.03.2012 / 12:55
0

Na chance de que eles só precisem acessar 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á sua 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

    
por 19.03.2012 / 20:44