Apakah sys.sql_logins.is_policy_checked berarti bahwa kebijakan telah diperiksa?

16

Ketika saya melihat sys.sql_logins , saya melihat sebuah kolom bernama is_policy_checked. Dapatkah saya percaya bahwa kebijakan kata sandi saya telah diperiksa untuk semua login di mana nilai kolom ini berada 1?

Aaron Bertrand
sumber

Jawaban:

21

Tidak.

Sedangkan dokumentasinya saat ini memiliki pernyataan ambigu yang dapat diperdebatkan tentang apa arti bendera ini:

Kebijakan kata sandi diperiksa.

Apa artinya sebenarnya, dan harus dikatakan, bahwa bendera memiliki dua tujuan:

  1. Kebijakan kata sandi mungkin telah diperiksa, tetapi hanya jika (a) kebijakan kata sandi diaktifkan pada saat kata sandi terakhir ditetapkan, dan (b) kata sandi tersebut ditentukan dalam teks biasa (bukan dengan hash).
  2. Kebijakan kata sandi akan diperiksa pada saat kebijakan itu ditetapkan, tetapi hanya jika (a) kebijakan kata sandi diaktifkan pada saat itu, dan (b) kata sandi ditentukan dalam teks biasa (bukan dengan hash).

(Dan perhatikan bahwa "kebijakan" juga merujuk pada penegakan kadaluwarsa dan fakta bahwa pengguna harus mengubah kata sandi pada login berikutnya, tetapi karena kerumitan biasanya fokus operasi audit, saya hanya akan fokus pada aspek itu. )

The is_policy_checkedbit diatur untuk 1jika CHECK_POLICY = ONselama CREATE LOGINatau ALTER LOGINacara, bahkan jika kebijakan tersebut tidak diperiksa pada saat itu. Karena Anda mungkin dapat mengumpulkan dari atas, pemeriksaan ini tidak terjadi dalam skenario ini:

  • Kata sandi ditentukan menggunakan HASHEDkata kunci (taktik yang sangat umum ketika memigrasi login antara server atau menyalin login untuk log sekunder yang dikirimkan / dicerminkan / AG). Jelas tidak mungkin untuk memeriksa kompleksitas kata sandi jika Anda tidak memiliki nilai pra-hash.
  • Kebijakan kompleksitas kata sandi lokal tidak diaktifkan pada saat acara terjadi.
  • Tidak tercakup dalam usulan penulisan ulang saya di atas, tetapi Anda dapat ALTER LOGINtanpa menetapkan kata sandi baru, dan masih mengubah benderanya ( terima kasih kepada @ AMtwo untuk mengilustrasikan ini ). Saya menduga ini mungkin dilakukan oleh orang pintar yang mencoba menipu auditor.

Semua masalah ini mudah ditunjukkan.

Karena kebanyakan orang yang saya ajak bicara tentang hal ini selalu berasumsi bahwa is_policy_checkedsebenarnya kata sandi saat ini memenuhi kebijakan kata sandi saat ini, saya pikir penting bahwa ada sesuatu yang berubah di sini sehingga pengguna memiliki harapan yang tepat dan memahami bahwa tanda ini tidak selalu berarti semua baik-baik saja. Paling tidak, dokumentasi harus diperbarui untuk mencerminkan kenyataan, agak seperti yang saya tunjukkan di atas. Tetapi ada hal lain yang bisa dilakukan juga.

  • Sebuah peringatan dapat dimunculkan jika CHECK_POLICY = ONditentukan tetapi kebijakan tidak dapat, pada kenyataannya, diperiksa (baik karena kata sandi ditentukan dengan hash, atau karena kebijakan kata sandi telah dinonaktifkan, atau karena perintah adalah upaya sederhana untuk memotong atau atur bendera, mis ALTER LOGIN blat WITH CHECK_POLICY = ON;.).
  • CHECK_POLICYdapat ditinggalkan, mendukung ACTIVELY_CHECK_POLICYdan mungkin CHECK_POLICY_ON_NEXT_CHANGE. Kolom di sys.sql_loginsharus policy_has_been_checkeddan policy_will_be_checked. Saya tidak menikah dengan nama-nama ini, tetapi mereka jauh lebih akurat daripada kata-kata saat ini.
  • Jika saya memilih ACTIVELY_CHECK_POLICY = ONdan kebijakan tidak dapat diperiksa selama pelaksanaan perintah, saya harus menerima pesan kesalahan dan bendera tidak boleh diatur ke 1(atau bahkan pembuatan login atau perubahan kata sandi tidak boleh berhasil).
  • Saya rasa tidak masuk akal dalam hal ini untuk melanjutkan dengan perilaku saat ini, di mana saya dapat menentukan bahwa saya ingin kebijakan diperiksa, tetapi meskipun tidak bisa, kata sandi dibolehkan dan login dibuat / diubah (Ini buruk, IMHO, terlepas dari keadaan bendera setelah fakta - tetapi setidaknya jika diatur ke 0, bypass tersebut dapat diidentifikasi).

Saat ini tidak ada cara yang dapat diandalkan - tanpa secara manual mengubah kata sandi mereka untuk sesuatu yang Anda tahu aman - untuk mengaudit login SQL Anda dan yakinlah bahwa semuanya memenuhi kebijakan kompleksitas Anda. Di hari ini dan usia data yang semakin meningkat, semakin banyak pelanggaran data, dan kebutuhan yang jelas untuk mengamankan sistem semakin ketat, ini adalah masalah yang perlu ditangani. Saya telah membuat blog tentang hal ini dan membuat item Connect tentangnya:

Saya mendorong Anda untuk memilih pada item Connect dan, yang lebih penting, pastikan Anda tidak mengaudit sistem Anda dengan persepsi salah tentang cara kerja opsi dan metadata DDL ini.

Tolong jangan mengesampingkan ini sebagai "bukan masalah" karena Anda sangat nyaman dengan cara kerjanya dan sudah tahu bahwa bendera tidak dapat dipercaya - Anda bukan pengguna yang saya khawatirkan; itu orang lain.

Aaron Bertrand
sumber