Sql-Server

驗證現有使用者的密碼策略

  • October 28, 2021

我最近遇到了很多數據庫登錄沒有enforce_password_policy啟用標誌的環境。

即將進行的審核需要驗證這些登錄名的密碼。

我使用以下查詢來獲取登錄列表以及標誌是打開還是關閉。

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

但是,這並不能告訴我密碼是否真的遵守密碼策略,因為該標誌僅在創建使用者時才相關。

是否有已知的方法來測試現有使用者的密碼策略合規性?

我無法訪問舊密碼,我更喜歡不需要它們的方法。

這可能在您的使用者中不受歡迎,但我相信您可以確定的唯一方法是強制使用CHECK_POLICY = ON. 這將生成一組ALTER LOGIN帶有空白密碼的命令,您可以更新查詢,為它們提供一個通用密碼,或者使用單獨的密碼手動更新每個命令 - 只需確保它們符合您的策略。當然,您需要確保密碼策略與您期望的一樣複雜,並且已啟用(控制面板 > 管理工具 > 本地安全策略 > 帳戶策略 > 密碼策略 > 密碼必須滿足複雜性要求)。

SELECT N'ALTER LOGIN ' + QUOTENAME(name) 
 + N' WITH PASSWORD = N'''' MUST_CHANGE, CHECK_POLICY = ON;' 
 FROM sys.sql_logins 
 --WHERE is_policy_checked = 0;

史蒂夫瓊斯不久前寫過這個。請注意 - 由於我在下面發現的內容 - 您不能依賴於is_policy_checked = 1表示密碼實際上符合您目前的策略,因為登錄可能是使用散列密碼創建的(在這種情況下,純文字密碼不能是檢查)或本地複雜性策略被禁用(仍然導致is_policy_checked = 1)。

我認為可行的另一種方法是嘗試使用目前和 with創建每個登錄的副本,並記下每個失敗的登錄。但是,這不起作用- 即使使用,它也不會對已經散列的密碼執行任何驗證。我將包含後代的程式碼 - 但是,根據設計,該策略根本無法檢查。password_hash``CHECK_POLICY = ON``CHECK_POLICY = ON

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;

就個人而言,我認為這是一個錯誤。如果語法允許我使用散列密碼創建登錄,並且我可以規定該密碼必須符合我的複雜性策略,它應該會生成錯誤或警告,表明該策略實際上未被檢查。

更新:我針對這種行為提出了一個錯誤。

引用自:https://dba.stackexchange.com/questions/97898