Saya baru-baru ini datang ke lingkungan di mana banyak login database tidak memiliki enforce_password_policy
bendera diaktifkan.
Audit yang akan datang mengharuskan verifikasi kata sandi login ini.
Saya menggunakan kueri berikut untuk mendapatkan daftar login dan apakah bendera aktif atau tidak.
select
@@SERVERNAME as servername,
name,
IS_SRVROLEMEMBER('sysadmin', name) as SYSADMIN,
type_desc,
create_date,
is_policy_checked,
is_disabled,
password_hash,
PWDCOMPARE(name, password_hash) as UsernameAsPassword
FROM sys.sql_logins
Namun, ini tidak memberi tahu saya jika kata sandi benar-benar mematuhi kebijakan kata sandi, karena bendera hanya relevan saat membuat pengguna.
Apakah ada cara yang diketahui untuk menguji pengguna yang ada untuk kepatuhan kebijakan kata sandi?
Saya tidak memiliki akses ke kata sandi lama, dan saya lebih suka metode yang tidak memerlukannya.
PWDCOMPARE()
saya belum benar-benar menemukan banyak, terlepas dari terima kasih atas usahanya!Jawaban:
Ini mungkin tidak populer di kalangan pengguna Anda, tetapi saya percaya satu-satunya cara yang Anda tahu pasti adalah dengan memaksa perubahan kata sandi untuk setiap login dengan SQL
CHECK_POLICY = ON
. Ini akan menghasilkan seperangkatALTER LOGIN
perintah dengan kata sandi kosong, Anda dapat memperbarui kueri yang memberi mereka semua kata sandi umum atau secara manual memperbarui masing-masing dengan kata sandi individual - pastikan mereka memenuhi kebijakan Anda. Tentu saja Anda perlu memastikan bahwa kebijakan kata sandi sama rumitnya dengan yang Anda harapkan, dan kebijakan itu diaktifkan (Panel Kontrol> Alat Administrasi> Kebijakan Keamanan Lokal> Kebijakan Akun> Kebijakan Kata Sandi> Kata sandi harus memenuhi persyaratan kompleksitas).Steve Jones menulis tentang ini beberapa waktu lalu. Perhatikan bahwa - karena apa yang saya temukan di bawah ini - Anda tidak dapat mengandalkan
is_policy_checked = 1
untuk berarti bahwa kata sandi tersebut benar-benar memenuhi kebijakan Anda saat ini, karena login dapat dibuat dengan kata sandi hash (dalam hal ini kata sandi teks biasa tidak dapat dicentang) atau sementara kebijakan kompleksitas lokal dinonaktifkan (yang masih mengarah keis_policy_checked = 1
).Pendekatan lain yang saya pikir akan berhasil adalah mencoba membuat salinan dari setiap login dengan arus mereka
password_hash
dan denganCHECK_POLICY = ON
, dan membuat catatan setiap orang yang gagal. Namun, ini tidak dapat berfungsi - bahkan denganCHECK_POLICY = ON
, itu tidak melakukan validasi kata sandi yang sudah di-hash. Saya akan memasukkan kode untuk keturunan - tetapi, menurut desain, kebijakan itu tidak dapat diperiksa.Secara pribadi, saya pikir ini adalah bug. Jika sintaks memungkinkan saya untuk membuat login menggunakan kata sandi hash, dan saya dapat menetapkan bahwa kata sandi tersebut harus memenuhi kebijakan kompleksitas saya, itu akan menghasilkan kesalahan atau peringatan bahwa kebijakan itu sebenarnya tidak diperiksa.
UPDATE : Saya mengajukan bug terhadap perilaku ini.
sumber
select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;
memberikan beberapa hasil positif. Jadi saya harus melakukan ini untuk semua login, bukan hanya mereka yangis_policy_checked
dimatikan.Tidak ada cara Anda akan mendapatkan ini 100% akurat. Meskipun Anda dapat menggunakan
PWDCOMPARE
untuk memeriksa daftar kata sandi yang lemah (Anda dapat menambah daftar kata sandi yang lemah dan melakukan perbandingan).Saya telah menulis skrip serupa yang melakukan perbandingan dan memberi Anda hasilnya. Saya telah mempostingnya di github .
EDIT:
Sekarang Anda dapat memiliki daftar kata sandi yang lemah di csv dan kemudian menggunakan dbatools
Test-DbaLoginPassword
dengan-Dictionary
sakelar (Menentukan daftar kata sandi yang akan disertakan dalam pengujian untuk kata sandi yang lemah.)sumber
Kebijakan Kata Sandi per SQL Login hanya merupakan tanda untuk hidup atau mati. Jika bendera Kebijakan Kata Sandi dicentang, maka Kebijakan Kata Sandi Windows dari sistem operasi diberlakukan.
Periksa dokumentasi CREATE LOGIN untuk detail tentang apa yang terjadi ketika CHECK_POLICY dan CHECK_EXPIRATION diatur.
Anda dapat melihat pengaturan per pengguna SQL dengan memeriksa kolom is_policy_checked dan is_expiration_checked di sys.sql_logins
sesuatu seperti di bawah ini:
Untuk Login Otentikasi SQL Server:
select * from sys.server_principals where type in ('U','G')
- akan menunjukkan kepada Anda login dan grup yang dapat mengakses SQL Server melalui Windows Authentication.sumber