Memverifikasi kebijakan kata sandi pada pengguna yang ada


11

Saya baru-baru ini datang ke lingkungan di mana banyak login database tidak memiliki enforce_password_policybendera 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.


1
Konferensi apa? Hari SQL Server? BICC? Melakukan pencarian cepat, tampaknya tidak ada fungsi asli yang akan segera memberi Anda hasil. Dimungkinkan untuk menggunakan alat pihak ketiga.
Stijn Wynants

Hari SQL Server. Saya telah melakukan beberapa pencarian cepat juga, dan selain beberapa alat yang hanya menggunakan serangan kamus PWDCOMPARE()saya belum benar-benar menemukan banyak, terlepas dari terima kasih atas usahanya!
Reaces

Anda dapat memvalidasi kebijakan pada login berikutnya dan memaksa reset untuk semua pengguna yang tidak masuk sebelum audit. Lebih sedikit gangguan pengguna dibandingkan dengan mengatur ulang semua kata sandi.
CodesInChaos

@CodesInChaos Bagaimana Anda memvalidasi kebijakan selama acara masuk?
Aaron Bertrand

1
Saya telah membuat blog tentang masalah ini - dan saya mendorong Anda semua untuk memberikan suara dan komentar pada item Connect .
Aaron Bertrand

Jawaban:


15

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 LOGINperintah 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 = 1untuk 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_hashdan 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.


Komplikasi lain adalah saya sebenarnya cukup yakin admin sebelumnya hanya memeriksa kebijakan ini setelah memasukkan kata sandi yang mudah diingat. 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 yang is_policy_checkeddimatikan.
Reaces

@Membaca Mungkin. Atau kebijakan kata sandi Anda di Windows bisa lemah atau dinonaktifkan, jadi mencoba menerapkannya dengan kebijakan itu tidak membantu.
Aaron Bertrand

Saya baru saja mencoba membuat pengguna yang sama di server kedua, dan gagal validasi kata sandi. Jadi saya kira pemeriksaan kompleksitas berfungsi. Saya menyukai gagasan untuk membuat ulang salinan pengguna! Saya akan mulai bekerja membuat skrip yang melakukan hal itu! EDIT: sebenarnya saya hanya bisa menggunakan sp_help_revlogin untuk melakukan angkat berat.
Reaces

"Itu tidak melakukan validasi kata sandi yang sudah di-hash" Bagaimana caranya? Jika Anda hanya tahu hash dan bukan kata sandi biasa, Anda tidak dapat memeriksa kompleksitas kata sandi. Anda bisa menebak kata sandi, tetapi itu akan sangat mahal untuk hash kata sandi yang layak karena seluruh inti kata sandi mencegah pemulihan kata sandi plaintext.
CodesInChaos

@CodesInChaos Saya tahu, itu maksud saya ... Saya berkata "tidak" tetapi bisa juga menulis "tidak mungkin" ...
Aaron Bertrand

4

Tidak ada cara Anda akan mendapatkan ini 100% akurat. Meskipun Anda dapat menggunakan PWDCOMPAREuntuk 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-DbaLoginPassworddengan -Dictionarysakelar (Menentukan daftar kata sandi yang akan disertakan dalam pengujian untuk kata sandi yang lemah.)


Saya sangat ingin menggunakan skrip Anda jika saya harus melakukan audit sendiri terhadap kata sandi pengguna tertentu. Namun tidak mengetahui apa yang akan dilakukan auditor, saya lebih baik memastikan bahwa semuanya sesuai kebijakan dan bergantung pada mereka yang membuat kebijakan. Terimakasih Meskipun! +1
Reaces

0

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:

SELECT name,
create_date,
modify_date,
LOGINPROPERTY(name, 'DaysUntilExpiration') DaysUntilExpiration,
LOGINPROPERTY(name, 'PasswordLastSetTime') PasswordLastSetTime,
LOGINPROPERTY(name, 'IsExpired') IsExpired,
LOGINPROPERTY(name, 'IsMustChange') IsMustChange
From sys.sql_logins ;

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.


Diperbarui pertanyaan saya sedikit, karena saya sudah menggunakan permintaan yang sama. Masalah utama saya adalah saya harus meyakinkan bos saya bahwa kata sandi itu sesuai dengan kebijakan, namun tidak mengetahui kata sandi yang saya tidak tahu bagaimana saya bisa.
Reaces
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.