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?
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?
Respostas:
Você pode usar os seguintes comandos para o mesmo:
openssl passwd -6 -salt xyz yourpass
Nota: a passagem -1gerará uma senha MD5, -5um SHA256 e -6SHA512 (recomendado)
mkpasswd --method=SHA-512 --stdin
Métodos aceita md5, sha-256esha-512
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
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).
openssl passwddocumentação para quem tenta descobrir o que a -1opção faz.
python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'- da pergunta relacionada ao ServerFault
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
Esta solução tem os seguintes benefícios:
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.')"
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.
crypt.mksaltnão funciona ao gerar senhas para /etc/shadow. Mas o método do @ Alex131089 funciona!
opensslé uma ferramenta bastante universal.
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))+"$")'
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)
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:::
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
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.
chpasswd?
chpasswd -e, certifique-se de usar aspas simples na stringechoem que você está ; caso contrário, se houver$ou outros caracteres especiais, eles não serão tratados literalmente.