Gerar senha manualmente para / etc / shadow

109

Preciso editar manualmente /etc/shadowpara alterar a senha raiz dentro de uma imagem de máquina virtual.

Existe uma ferramenta de linha de comando que pega uma senha e gera um /etc/shadowhash de senha compatível na saída padrão?

Lorin Hochstein
fonte

Respostas:

126

Você pode usar os seguintes comandos para o mesmo:

Método 1 (md5, sha256, sha512)

openssl passwd -6 -salt xyz  yourpass

Nota: a passagem -1gerará uma senha MD5, -5um SHA256 e -6SHA512 (recomendado)

Método 2 (md5, sha256, sha512)

mkpasswd --method=SHA-512 --stdin

Métodos aceita md5, sha-256esha-512

Método 3 (des, md5, sha256, sha512)

Como o @tink sugeriu, podemos atualizar a senha chpasswdusando:

echo "username:password" | chpasswd 

Ou você pode usar a senha criptografada com chpasswd. Primeiro, gere-o usando o seguinte:

perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'

Depois, você pode usar a senha gerada para atualizar:

echo "username:encryptedPassWd"  | chpasswd -e

Essa senha criptografada que podemos usar para criar um novo usuário com senha, por exemplo:

useradd -p 'encryptedPassWd'  username
Rahul Patil
fonte
3
Ao usar chpasswd -e, certifique-se de usar aspas simples na string echoem que você está ; caso contrário, se houver $ou outros caracteres especiais, eles não serão tratados literalmente.
Zags 15/10
4
Observe que as marcas acabarão no seu histórico de shell. Eu usaria openssl passwd -1qual 1) não acaba lá e 2) gera um sal aleatório para você (o que também não acaba no histórico do shell).
Ztyx 22/09/2015
1
openssl passwddocumentação para quem tenta descobrir o que a -1opção faz.
CivFan
4
Para um hash SHA-512: python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'- da pergunta relacionada ao ServerFault
CivFan
9
Os métodos 1) e 2) acima usam MD5 para hash. O MD5 não é mais considerado uma prática recomendada, pois houve colisões de hash. Use o método 3) ou o descrito em unix.stackexchange.com/a/198906/10911 .
Ztyx
36

No Ubuntu 12.04, existe o mkpasswd (do pacote whois): Overfeatured front end to crypt (3)

mkpasswd  -m sha-512 -S saltsalt -s <<< YourPass

Onde:

  • -m= Calcule a senha usando o método TYPE. Se TYPE for help, os métodos disponíveis serão impressos.
  • -S = sal usado.

Por exemplo

$ mkpasswd -m help

-s = Read password from stdin
user3183018
fonte
8
Não há necessidade de especificar o sal, o mkpasswd se encarrega de gerar um aleatório.
Para 마 SE
1
Não importa o que, senhas geradas a partir do mkpasswd copiadas para o / etc / passwd sempre falham. Existe uma maneira de verificar se o hash criado pelo mkpasswd está correto?
CMCDragonkai
@CMCDragonkai: Pergunta errada. Você precisa perguntar o que seu sistema está esperando.
user3183018
1
@Para SE: Às vezes é útil controlar o sal. Eu o usei ao testar a geração de senhas de hash para aplicativos da web em que eu estava armazenando o sal em uma loja separada. Por exemplo, senha com hash no MySQL DB e por usuário salt no Redis.
User3183018 08/0318
15

Esta solução tem os seguintes benefícios:

  • Nada adicional para instalar
  • Não armazena a senha no seu histórico de shell
  • Gera um sal aleatório para você
  • Utiliza um algoritmo de hash moderno e forte, SHA-512
  • Solicita novamente a senha para evitar erros.

    $ python3 -c "from getpass import getpass; from crypt import *; \
        p=getpass(); print('\n'+crypt(p, METHOD_SHA512)) \
        if p==getpass('Please repeat: ') else print('\nFailed repeating.')"
    

Referências

u150825
fonte
3

Para aqueles sem sistemas baseados no Debian. Python3 funciona tão bem.

python3 -c 'import crypt; print(crypt.crypt("test"))'

NOTA: A string "test" é a senha que estamos gerando como uma string criptografada.

Greg
fonte
Por alguma razão, o uso crypt.mksaltnão funciona ao gerar senhas para /etc/shadow. Mas o método do @ Alex131089 funciona!
maulinglawns
Acabei de desperdiçar 1,5 h tentando esse método, antes de eu perceber o comentário. Alguém pode removê-lo? Eu não posso votar ainda.
Michał F
1
@ MichałF, parece que isso não estava funcionando porque a salga não foi feita corretamente. Obrigado por apontar isso. Eu removi o sal porque a salga depende do sistema operacional e não é prático contabilizar todos os intervalos de sistema operacional na minha resposta. Você deve usar o método 1 descrito por @RahulPatil, pois permite usar salga e opensslé uma ferramenta bastante universal.
Greg
Não é aconselhável, pois deixa sua senha no histórico do shell.
Mark Stosberg
Quero dizer, você sempre pode limpar o cmd do histórico do seu shell
Greg
3

Nenhum dos métodos atuais é aceitável para mim - eles passam a senha na linha de comando (que termina no histórico do meu shell), exigem a instalação de utilitários adicionais ( python3, makepasswd), usam sais codificados ou usam técnicas antigas de hash.

Esse método geraria hashes SHA-512 após solicitar a senha e usaria um sal aleatório.

Um método que utiliza o Python 2 sem nenhuma biblioteca não padrão:

python2 -c 'import crypt, getpass,os,base64; print crypt.crypt(getpass.getpass(), "$6$"+base64.b64encode(os.urandom(16))+"$")'

Para fazer isso sem aviso: (Isso deixará sua senha no histórico de comandos)

python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'
Gert van den Berg
fonte
2
Para evitar deixar a senha no histórico de comandos, você pode definir (para bash, pelo menos) a variável de ambiente HISTCONTROL como 'ignorespace' e adicionar um espaço à frente do comando.
adam820
@ adam820: Essa é uma maneira ... Continua na pssaída na fração de segundo que o comando está executando. (O mais seguro continua a usar a versão que solicita a senha)
Gert van den Berg
2

O par openssle chpasswd -enão funcionou no meu caso no RHEL6. A combinação openssl passwde o usermod -pcomando fizeram o trabalho.

Gere o valor de hash da senha junto com o valor de salt:

$ openssl passwd -1  -salt 5RPVAd clear-text-passwd43

$1$5RPVAd$vgsoSANybLDepv2ETcUH7.

Em seguida, copie a sequência criptografada para usermod. Certifique-se de envolvê-lo com aspas simples.

$ usermod -p '$1$5RPVAd$vgsoSANybLDepv2ETcUH7.' root

Confira no arquivo de sombra.

$ grep root /etc/shadow

root:$1$5RPVAd$vgsoSANybLDepv2ETcUH7.:17774:0:99999:7:::
Joon Byun
fonte
1

Ainda outro método para gerar senhas, está usando a opensslferramenta.

Gere senhas MD5

openssl passwd -1 -salt SaltSalt SecretPassword
# output: $1$SaltSalt$FSYmvnuDuSP883uWgYBXW/

Gere senhas DES

openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2
Evgeny
fonte
3
Como isso difere do método 1 na resposta de Rahul Patil ? Observe que o antigo algoritmo de hash de senha baseado em DES definitivamente não deve ser usado! Por um lado, ele suporta apenas senhas de até oito bytes, o que é lamentavelmente inadequado atualmente.
um CVn
3
Citando Snowden: "Suponha que seu adversário seja capaz de um trilhão de palpites por segundo". Com um conjunto de caracteres de 70 caracteres não totalmente irracional e uma senha totalmente aleatória, são 576 segundos - menos de dez minutos. Mesmo contra um adversário menos capaz, mas determinado, é lamentavelmente inadequado .
um CVn
Esta não é muito seguro, porque MD5 e DES ...
AdamKalisz
Obrigado por ser a única resposta que mostra como criptografar senhas DES! Muito útil para tentar substituir a senha root de um firmware de câmera IP.
Malvineous
1

Expandindo um pouco as críticas de u150825 e Gert van den Berg, me vi precisando de algo relativamente flexível para diferentes situações com diferentes sistemas de automação. Decidi adicionar à minha pequena biblioteca de scripts úteis e escrever isso. Ele usa apenas bibliotecas nativas do python 2.7+ e funciona no python3 também.

Você pode buscá-lo aqui, se quiser. É fácil deixar isso para o seu ambiente se você precisar usá-lo muito, hospedado em http ou qualquer outra coisa, e você pode executá-lo em qualquer plataforma usando qualquer interpretador python padrão que você tenha disponível. confiando de forma confiável.

O padrão é solicitar o uso do getpass com prompts no stderr (permitindo a captura fácil do stdout), mas se você colocar uma string nele, ela simplesmente colherá do stdin. Dependendo de como você está lidando com isso, também pode não estar aparecendo no histórico de comandos; portanto, esteja ciente do que você está trabalhando. Eu gosto de ter uma ferramenta flexível que se comporte da maneira esperada, em vez de ter que confiar em pacotes ou em python, alinhando meu caminho para a vitória de 10 maneiras diferentes.

James Harmison
fonte
Se o python em qualquer versão já está instalada ou não depende do sistema. Qual é exatamente o problema chpasswd?
RalfFriedl 03/09/19