Verifique a senha do usuário com um script de shell

4

Eu tenho um script que pede a senha do usuário e quero verificar se a senha fornecida está errada ou não.

#A little fragment of my script

read -sp 'Your password: ' password;

if [[ $password -ne WHAT GOES HERE? ]]; then
    MORE CODE HERE
else
    MORE CODE HERE
fi
    
por Luis Veliz 12.12.2016 / 19:09

3 respostas

2

Não há uma maneira totalmente portátil de verificar a senha do usuário. Isso requer um executável privilegiado, então isso não é algo que você pode fazer do zero. O PAM , que é usado na maioria dos sistemas Linux não incorporados, bem como em muitos sistemas incorporados e na maioria das outras variantes Unix, vem com um binário setuid mas ele não tem uma interface shell direta, você precisa ir através da pilha PAM.

Você pode usar uma ligação PAM em Perl, Python ou Ruby .

Você pode instalar uma das várias implementações checkpassword .

Se o usuário tiver permissão para executar o sudo para qualquer coisa, então sudo -kv solicitará a autenticação (a menos que isso tenha sido desabilitado na configuração do sudo). Mas isso não funciona se não houver regra de sudoers em relação ao usuário.

Você pode executar su . Isso funciona na maioria das implementações. Esta é provavelmente a melhor aposta no seu caso.

if su -c true "$USER"; then
  echo "Correct password"
fi
    
por 13.12.2016 / 01:56
3

Você pode validar que uma determinada senha local está correta para um dado nome de usuário usando o arquivo shadow.

Na maioria das distribuições modernas, as senhas em hash são armazenadas no arquivo de sombra / etc / shadow (que só pode ser lido pelo root). Como root, puxe a linha do arquivo de sombra para o usuário especificado da seguinte forma:

cat /etc/shadow | grep username

Você verá algo assim:

username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::

Após o nome de usuário, há $ 1. Isso indica que é um hash MD5. Depois disso, há outro $, então (neste caso) TrOIigLp seguido por outro $. TrOIigLp é o sal. Depois disso, é a senha com hash, que foi dividida usando o sal - nesse caso, PUHL00kS5UY3CMVaiC0 / g0.

Agora, você pode usar o openssl para hash a senha dada usando o mesmo sal, assim:

openssl passwd -1 -salt TrOIigLp

Digite a senha dada quando solicitado, o comando openssl deve calcular o hash MD5 usando o salt fornecido, e deve ser exatamente o mesmo que o acima do arquivo shadow. O -1 no comando acima é para o hash MD5.

    
por 12.12.2016 / 19:14
2

Aqui está uma solução relativamente robusta que funciona com usuários locais e remotos e tenta autenticar contra a pilha PAM completa como o usuário em questão, em vez de simplesmente comparar os hashes de senha.

#!/usr/bin/env ruby

require 'rpam'

username = ARGV[0]
password = ARGV[1]

if Rpam.auth(username, password, service: 'system-auth')
  puts 'authentication successful'
  exit 0
else
  puts 'authentication failure'
  exit 1
end

Para executá-lo: salve-o como ./authenticate_as.rb , chmod +x ./authenticate_as.rb e ./authenticate_as.rb $username $password . Requer Ruby e a gem rpam, caso isso não seja óbvio.

    
por 12.12.2016 / 19:26