Sql-Server
sys.sql_logins.is_policy_checked 是否表示該策略已被檢查?
當我查看時
sys.sql_logins
,我看到一個名為is_policy_checked
. 我可以相信我的密碼策略已經檢查了該列值所在的所有登錄名1
嗎?
##不。雖然文件目前對該標誌的含義有以下可以說是模棱兩可的陳述:
檢查密碼策略。
它真正的意思是,應該說,國旗有兩個目的:
- 密碼策略可能已被檢查,但前提是 (a) 在上次設置密碼時啟用了密碼策略,並且 (b) 密碼以純文字(不使用雜湊)指定。2.下次設置策略時將檢查密碼策略,但前提是 (a) 當時啟用了密碼策略,並且 (b) 密碼以純文字(不使用雜湊)指定。
(請注意,“策略”還指強製到期以及使用者必須在下次登錄時更改密碼這一事實,但由於復雜性通常是審計操作的重點,我將只關注這一方面。 )
即使當時未檢查策略,該
is_policy_checked
位也會在事件或事件期間設置為1
if 。正如您可能從上面收集到的那樣,在這些情況下不會發生此檢查:CHECK_POLICY = ON``CREATE LOGIN``ALTER LOGIN
- 使用
HASHED
關鍵字指定密碼(在伺服器之間遷移登錄名或將登錄名複製到日誌傳送/鏡像/AG 輔助伺服器時非常常見的策略)。如果您沒有預先散列的值,顯然不可能檢查密碼的複雜性。- 事件發生時未啟用本地密碼複雜性策略。
- 上面我建議的改寫沒有涵蓋,但是您可以
ALTER LOGIN
不設置新密碼,並且仍然可以更改標誌(感謝@AMtwo 說明這一點)。我懷疑這可能是聰明人試圖愚弄審計師所做的。這些問題都很容易證明。
由於與我交談過的大多數人一直認為這
is_policy_checked
實際上意味著目前密碼符合目前密碼策略,因此我認為在這裡進行一些更改很重要,這樣使用者才能有正確的期望並理解這個標誌並不一定意味著一切都很好。至少,應該更新文件以反映現實,就像我上面指出的那樣。但也有其他事情可以做。
- 如果
CHECK_POLICY = ON
已指定但實際上無法檢查策略,則可能會引發警告(因為密碼是用雜湊指定的,或者因為密碼策略已被禁用,或者因為該命令是一個簡單的繞過嘗試或設置標誌,例如ALTER LOGIN blat WITH CHECK_POLICY = ON;
)。CHECK_POLICY
可能會被棄用,贊成,ACTIVELY_CHECK_POLICY
也許CHECK_POLICY_ON_NEXT_CHANGE
. 中的列sys.sql_logins
應該是policy_has_been_checked
和policy_will_be_checked
。我沒有嫁給這些名字,但它們比目前的措辭準確得多。- 如果我選擇
ACTIVELY_CHECK_POLICY = ON
並且在命令執行期間無法檢查策略,我應該會收到一條錯誤消息並且標誌不應該設置為1
(甚至登錄創建或密碼更改都不應該成功)。- 我認為在這種情況下繼續目前行為沒有意義,我可以在其中指定我希望檢查策略,但即使不能,也允許密碼並創建/更改登錄(這很糟糕,恕我直言,不管事後標誌的狀態如何 - 但至少如果它被設置為
0
,則可以辨識這種繞過)。如今,沒有可靠的方法(無需手動將密碼更改為您知道安全的密碼)來審核您的 SQL 登錄並確信它們都符合您的複雜性策略。在這個數據不斷增長的時代,越來越多的數據洩露,顯然需要越來越嚴格地保護系統,這是一個需要解決的問題。我已經寫了一篇關於這個的部落格並創建了一個關於它的 Connect 項目:
我鼓勵您對 Connect 項目進行投票,更重要的是,請確保您不會在審核您的系統時對 DDL 選項和元數據的工作方式有錯誤的認識。
**請不要將此視為“非問題”,因為您對它的工作方式非常滿意,**並且已經知道該標誌是不可信的——您不是我擔心的使用者;是其他人。