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 seperangkat ALTER 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).
SELECT N'ALTER LOGIN ' + QUOTENAME(name)
+ N' WITH PASSWORD = N'''' MUST_CHANGE, CHECK_POLICY = ON;'
FROM sys.sql_logins
--WHERE is_policy_checked = 0;
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 ke is_policy_checked = 1
).
Pendekatan lain yang saya pikir akan berhasil adalah mencoba membuat salinan dari setiap login dengan arus mereka password_hash
dan dengan CHECK_POLICY = ON
, dan membuat catatan setiap orang yang gagal. Namun, ini tidak dapat berfungsi - bahkan dengan CHECK_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.
SELECT N'BEGIN TRY
CREATE LOGIN ' + QUOTENAME(N'copy_of_' + name)
+ N' WITH PASSWORD = '
+ CONVERT(NVARCHAR(255), password_hash, 1)
+ ' HASHED, CHECK_POLICY = ON;
DROP LOGIN ' + QUOTENAME(N'copy_of_' + name) + ';
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 15118
PRINT N''' + REPLACE(name, '''', '''''')
+ N' was not complex enough.'';
END CATCH'
FROM sys.sql_logins;
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.