Não é possível criar um usuário com senha via ssh [closed]

13

Eu tentei criar um usuário com senha via ssh (com permissão de root) assim:

ssh [email protected] useradd -p $(openssl passwd -1 1234) newuser

Ao fazer isso, consegui criar uma conta com o nome newuser , mas não consegui fazer o login com a senha esperada (que é 1234 )

Não faz diferença se eu adicionar aspas duplas:

ssh [email protected] "useradd -p $(openssl passwd -1 1234) newuser"

E então eu estava me perguntando se eu posso gerar senha com hash e salvá-lo como uma variável localmente, mas ainda sem sorte.

password=$(openssl passwd -1 1234)
ssh [email protected] "useradd -p $password newuser"

Existe algo que eu sinto falta? Agradecemos antecipadamente!

    
por amigcamel 30.03.2017 / 07:09

2 respostas

22

Esta é uma questão clássica de citação.

Problema: Sem citar ou dobrar a substituição do comando ( $() ) e a expansão da variável (o $ s na senha hashed retornada por openssl está sendo tratado como indicador variável ) estão sendo feitos no ambiente local, não no shell remoto.

Solução: use aspas simples ao redor do comando useradd usado com ssh no shell local para evitar a substituição de comandos e a expansão de variáveis no ambiente local, permita que as expansões ocorram no remoto shell não-login, não interativo:

ssh [email protected] 'useradd -p "$(openssl passwd -1 1234)" newuser'

Observe as citações.

Problemas de segurança:

  • O login do SSH root deve ser desativado; se você precisar ativá-lo, somente a autenticação baseada em chave deve ser permitida

  • O MD5 já está quebrado e, sem sal, você está sujeito a um simples ataque de mesa do tipo Arco-Íris (não precisa nem de força bruta / ataque de dicionário); openssl passwd gera um sal aleatório. De qualquer forma, você deve realmente considerar o uso de SHA-2 com salt-ing

  • Senhas passadas como argumentos para comandos podem estar visíveis para outros processos no sistema (remoto); isso depende de como o procfs está montado (veja em hidepid ) e se o comando está sendo reescrito (neste caso, presumivelmente não)

por heemayl 30.03.2017 / 07:30
7

Como @heemayl observou, o algoritmo de hash de senha MD5 é envelhecido e os sistemas atuais, os novos hashes de senha baseados em SHA-2, que possuem um fator de trabalho personalizável. Mas a ferramenta de linha de comando OpenSSL não parece suportar isso.

O utilitário chpasswd , no entanto, permitirá que você altere a senha de um usuário de acordo com as configurações do sistema.

Isso deve permitir que você crie o novo usuário e altere sua senha no terminal remoto.

echo "newuser:newpass" | ssh [email protected] 'useradd newuser; chpasswd' 

chpasswd recebe o nome de usuário e a senha do stdin, não da linha de comando. Isso é realmente uma vantagem, já que os argumentos da linha de comando são visíveis para todos os outros processos no sistema, portanto, se executar openssl passwd no controle remoto, a senha ficaria momentaneamente visível para todos os processos no sistema.

Não tenho certeza se existe um utilitário de linha de comando pronto para gerar hashes de senha conhecidos pela função crypt(3) do sistema. O Perl tem a % funçãocrypt embutida, mas um sal adequado ainda precisa ser gerado.

    
por ilkkachu 30.03.2017 / 11:44