Tidak ada cara yang sepenuhnya portabel untuk memeriksa kata sandi pengguna. Ini membutuhkan hak istimewa yang dapat dieksekusi, jadi ini bukan sesuatu yang dapat Anda buat dari awal. PAM, yang digunakan pada sebagian besar sistem Linux non-embedded serta banyak sistem embedded dan sebagian besar varian Unix lainnya, hadir dengan biner setuid tetapi tidak memiliki antarmuka shell langsung, Anda harus melalui tumpukan PAM.
Anda dapat menggunakan pengikatan PAM di Perl, Python, atau Ruby.
Anda dapat menginstal salah satu dari beberapa checkpassword
implementasi.
Jika pengguna diizinkan menjalankan sudo untuk apa saja, maka sudo -kv
akan meminta autentikasi (kecuali ini telah dinonaktifkan di konfigurasi sudo). Tapi itu tidak berhasil jika tidak ada aturan sudoers tentang pengguna.
Anda dapat menjalankan su
. Ini berfungsi pada sebagian besar implementasi. Ini mungkin pilihan terbaik untuk Anda.
if su -c true "$USER"; then
echo "Correct password"
fi
Anda dapat memvalidasi lokal yang diberikan kata sandi benar untuk nama pengguna yang diberikan menggunakan file bayangan.
Pada sebagian besar distribusi modern, kata sandi hash disimpan di file shadow /etc/shadow (yang hanya dapat dibaca oleh root). Sebagai root, tarik garis dari file bayangan untuk pengguna tertentu seperti ini:
cat /etc/shadow | grep username
Anda akan melihat sesuatu seperti ini:
username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::
Setelah nama pengguna ada $1. Ini menunjukkan bahwa itu adalah hash MD5. Setelah itu ada $ lagi, lalu (dalam hal ini) TroIigLp diikuti $ lainnya. TroIigLp adalah garamnya. Setelah itu adalah kata sandi yang di-hash, yang di-hash menggunakan garam - dalam hal ini PUHL00kS5UY3CMVaiC0/g0.
Sekarang, Anda dapat menggunakan openssl untuk mem-hash kata sandi yang diberikan menggunakan garam yang sama, seperti:
openssl passwd -1 -salt TrOIigLp
Masukkan kata sandi yang diberikan saat diminta, perintah openssl harus menghitung hash MD5 menggunakan garam yang disediakan, dan harus persis sama dengan yang di atas dari file shadow. -1
pada perintah di atas adalah untuk hashing MD5.
Berikut adalah solusi yang relatif kuat yang bekerja dengan pengguna lokal dan jarak jauh dan mencoba mengautentikasi terhadap tumpukan PAM lengkap sebagai pengguna yang bersangkutan, bukan hanya membandingkan hash kata sandi.
#!/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
Untuk menjalankannya:Simpan sebagai ./authenticate_as.rb
, chmod +x ./authenticate_as.rb
, dan ./authenticate_as.rb $username $password
. Memerlukan Ruby dan permata rpam, jika tidak jelas.