Meu shell remoto padrão é um criador de problemas?

6

Por finger tim no servidor, aprendi que meu shell padrão é um script /usr/local/bin/bash-wrapper cujo conteúdo é:

#!/bin/bash

USERNAME='whoami'

if ! grep ^$USERNAME$ /etc/domain-users > /dev/null; then
   echo -e "You are not authorized to log into this server\n\n"
elif test -z "$2"; then
   echo -e "User authorized"
   /bin/bash
else #in case users are trying to send a command via ssh or use scp
   $2
fi

Agora entendo que o script é a causa de mim anteriormente sendo expulso após o login usando ssh . O problema desapareceu, porque recentemente eu adicionei a esse arquivo /etc/domain-users que grep está pesquisando.

Agora minhas perguntas são:

  1. O que o script faz se eu enviar um comando para o shell do servidor para executado na mesma linha que ssh , como as duas perguntas a seguir Parte 2 e Parte 3?

  2. É a causa de o fracasso da minha cópia da chave pública :

    $ cat /home/tim/.ssh/id_rsa.pub | ssh tim@server 'cat >> .ssh/authorized_keys'
    Password: 
    cat: >>: No such file or directory
    cat: .ssh/authorized_keys: No such file or directory
    

    Eu também tentei ssh-copy-id , mas também não funciona:

    $ ssh-copy-id tim@server
    Password: 
    /usr/local/bin/bash-wrapper: line 11: umask: 077;: octal number out of range
    
  3. O seguinte comando ssh-tunneling não funciona bem com o meu local ou:

    ssh -f -D 9999 tim@server "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done"
    

    Aqui está o erro que recebo

    /usr/local/bin/bash-wrapper: line 11: if: command not found
    

    Eu me pergunto por quê?

  4. Meu login é sempre muito lento. É porque o grep leva Tempo? Observe que o arquivo /etc/domain-users no qual grep pesquisas tem 199 linhas e cada linha é um nome de usuário. É esperado que o grep faça o seu trabalho?

  5. Como posso alterar meu shell padrão?

Obrigado e cumprimentos!

    
por Tim 18.01.2012 / 22:18

1 resposta

6

Percorrer um arquivo de 200 linhas deve levar milissegundos, então duvido que seja isso.

Teste ssh -vvv tim@server para ver o que está reduzindo a velocidade.

Seu shell padrão é salvo em /etc/passwd no final da sua linha:

drjimbob:x:1000:1000:jim bob,,,:/home/drjimbob:/bin/bash

e pode ser alterado por chsh tim -s /bin/bash (mudança de shell) embora você normalmente tenha que ter privilégios de root para alterar seu shell padrão , o que você pode fazer se tiver a senha de seu usuário precisa de permissão de root).

Note que /usr/bin/ssh-copy-id é apenas um script e a linha que está causando problemas é:

{ eval "$GET_ID" ; } | ssh ${1%:} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1

Se você testar isso; com um script como test_script.sh

#!/bin/bash

umask 077; echo "Works fine"
$2

e execute-o como bash -v -x test_script.sh "ignored_first_parameter" "umask 077; echo 'no'"

Você verá que a tokenização bash (com base na variável de ambiente $IFS ) da variável "umask 077; echo no" no segundo parâmetro e, em seguida, a expansão do shell disse bash para executar o comando umask '077;' que fornece o erro.

É basicamente devido ao fato de que digitar bash command1; command2 é fundamentalmente diferente de definir uma variável some_var='command1; command2" e, em seguida, executar $some_var .

Veja: link

EDIT: Para resolver suas dúvidas específicas;

(1) Eu ainda acho que esse método de controle de acesso é suspeito e possivelmente contornado por um dos truques padrão se um usuário tiver algum outro tipo de acesso. Digamos que eles tenham acesso ftp ao seu diretório de usuários; eles poderiam potencialmente fazer upload de um arquivo .login (contendo um falso $ PATH e um falso whoami) que permite que eles efetuem login.

No mínimo, o script deve especificar o caminho completo de whoami (na minha máquina ubuntu seu /usr/bin/whoami ; pode variar em sistemas diferentes). Veja: Programação Segura para Linux Ch 5.2 .

Parece mais fácil desativar o shell para usuários que não conseguem fazer login (por exemplo, defina o shell como /bin/false in /etc/passwd para usuários que não estão na sua lista). Alternativamente (ou adicionalmente), se você estiver preocupado apenas com logins remotos, use uma configuração em /etc/ssh/sshd_config para usar uma combinação de AllowUsers/AllowGroups para whitelist users / groups ou DenyUsers/DenyGroups para colocar usuários / grupos na lista negra em ssh (embora anotando que esses usuários poderiam fazer login se tivessem acesso físico à máquina).

No entanto, se o seu supervisor modificou seu script para usar eval $2 , ele deve corrigir os problemas imediatos com o ssh-copy-id. Veja Bash: por que usar eval com expansão de variáveis .

#!/bin/bash

USERNAME='whoami'

if ! grep ^$USERNAME$ /etc/domain-users > /dev/null; then
 echo -e "You are not authorized to log into this server\n\n"
elif test -z "$2"; then
 echo -e "User authorized"
 /bin/bash
else #in case users are trying to send a command via ssh or use scp
 eval $2
fi

Para as perguntas 2-5; as respostas, (2) sim, (3) sim, (4) não, (5) chsh tim -s /bin/bash .

    
por 19.01.2012 / 00:12

Tags