Non esiste un modo completamente portatile per controllare la password dell'utente. Ciò richiede un eseguibile privilegiato, quindi non è qualcosa che puoi creare da zero. PAM, che viene utilizzato sulla maggior parte dei sistemi Linux non incorporati, nonché su molti sistemi embedded e sulla maggior parte delle altre varianti Unix, viene fornito con un binario setuid ma non ha un'interfaccia shell diretta, è necessario passare attraverso lo stack PAM.
Puoi usare un'associazione PAM in Perl, Python o Ruby.
Puoi installare uno dei diversi checkpassword
implementazioni.
Se l'utente è autorizzato a eseguire sudo per qualsiasi cosa, allora sudo -kv
richiederà l'autenticazione (a meno che questa non sia stata disabilitata nella configurazione sudo). Ma ciò non funziona se non esiste una regola sudoers riguardante l'utente.
Puoi eseguire su
. Funziona sulla maggior parte delle implementazioni. Questa è probabilmente la soluzione migliore nel tuo caso.
if su -c true "$USER"; then
echo "Correct password"
fi
Puoi convalidare che un dato local la password è corretta per un determinato nome utente utilizzando il file shadow.
Nella maggior parte delle distribuzioni moderne, le password con hash sono memorizzate nel file shadow /etc/shadow (che è leggibile solo da root). Come root, estrai la riga dal file shadow per l'utente specificato in questo modo:
cat /etc/shadow | grep username
Vedrai qualcosa di simile a questo:
username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::
Dopo il nome utente c'è $1. Ciò indica che si tratta di un hash MD5. Dopodiché c'è un altro $, quindi (in questo caso) TrOIigLp seguito da un altro $. TrOIigLp è il sale. Dopo c'è la password con hash, che è stata sottoposta ad hashing usando il salt - in questo caso PUHL00kS5UY3CMVaiC0/g0.
Ora puoi utilizzare openssl per eseguire l'hashing della password fornita utilizzando lo stesso salt, in questo modo:
openssl passwd -1 -salt TrOIigLp
Immettere la password specificata quando richiesto, il comando openssl dovrebbe calcolare l'hash MD5 utilizzando il salt fornito e dovrebbe essere esattamente lo stesso di quanto sopra dal file shadow. Il -1
nel comando precedente è per l'hashing MD5.
Ecco una soluzione relativamente robusta che funziona sia con utenti locali che remoti e tenta di autenticarsi rispetto all'intero stack PAM come utente in questione, piuttosto che confrontare semplicemente gli hash delle password.
#!/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
Per eseguirlo:salvalo come ./authenticate_as.rb
, chmod +x ./authenticate_as.rb
e ./authenticate_as.rb $username $password
. Richiede Ruby e la gemma rpam, nel caso non fosse ovvio.