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

13

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

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

Ao fazer isso, consegui criar uma conta chamada com êxito newuser, mas não consegui entrar 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 queria saber se posso gerar uma senha com hash e salvá-la como uma variável localmente, mas ainda sem sorte.

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

Há algo que eu sinto falta? Desde já, obrigado!

amigcamel
fonte
Passar senhas na linha de comando é uma má ideia, porque outros usuários podem ver os argumentos da linha de comando. Veja a resposta de heemayl para isso. Além disso, isso soa como um problema XY . O que você está realmente tentando alcançar? Qual é o sentido de uma senha de conta que ninguém sabe (ou deveria saber)? Se o objetivo é criar uma conta que não aceite logins via senha, apenas defina nenhuma senha, o que deixará o logon baseado em senha desativado como política padrão do Ubuntu.
David Foerster

Respostas:

22

Este é um problema clássico de cotação.

Problema: sem nenhuma citação ou citação dupla, a substituição de comando ( $()) e a expansão de variáveis ​​(os $s na senha de hash retornada por opensslestão sendo tratados como indicador de variável) estão sendo feitos no ambiente local, não no shell remoto.

Solução: use aspas simples em torno do useraddcomando usado sshno shell local para impedir a substituição de comando e a expansão variável no ambiente local, permita que as expansões ocorram no shell remoto, sem logon e não interativo:

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

Observe as citações.

Problemas de segurança:

  • O rootlogin SSH 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ê é submetido a um simples ataque à tabela Rainbow (nem sequer precisa de um ataque forçado / de dicionário); openssl passwdgera um sal aleatório embora. De qualquer forma, você realmente deve considerar o uso de SHA-2 com sal.

  • As senhas passadas como argumentos para comandos podem ser visíveis para outros processos no sistema (remoto); isso depende de como o seu procfsé montado (veja hidepid) e se o comando está se reescrevendo (neste caso, presumivelmente, não)

heemail
fonte
1
Funciona como um encanto e obrigado pelas informações adicionais!
Amigcamel
1
o hash de senha md5crypt tem um sal ...
ilkkachu
@ilkkachu MD5 não é um hash seguro. Se você estiver interessado, faça uma pesquisa em Segurança da informação . Realmente, você deve usar um algoritmo composto ou uma biblioteca criptográfica, mas o SHA-2 é significativamente melhor que o MD5.
wizzwizz4
1
@ wizzwizz4 sim, isso é bem conhecido, não altera o fato de que as informações nesta resposta estão incorretas. :)
hobbs
2
@ wizzwizz4, o hash da senha ( md5crypt ) suportado crypt(3)no Linux e marcado com o $1$identificador não é o mesmo que o algoritmo de hash MD5 comum, da mesma maneira que os hashes$5$ e da $6$ senha não são simples como SHA-256 e SHA-512 . O método baseado no MD5 possui um número fixo de iterações, que é o maior problema com ele.
Ilkkachu 30/03/19
7

Como observou @heemayl, o algoritmo de hash da senha MD5 está envelhecido e os sistemas atuais atualizam os hashes de senha mais recentes baseados em SHA-2, que possuem um fator de trabalho personalizável. Mas a ferramenta de linha de comando OpenSSL não parece suportá-las.

O chpasswdutilitário , 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 lado remoto.

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

chpasswdpega o nome de usuário e a senha de stdin, não a linha de comando. Isso é realmente uma vantagem, pois os argumentos da linha de comando são visíveis para todos os outros processos no sistema; portanto, se executados openssl passwdno controle remoto, a senha ficará 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 crypt(3)função do sistema . Perl tem a cryptfunção embutida , mas um sal adequado ainda precisa ser gerado.

ilkkachu
fonte