密碼原則
適用於:SQL Server
SQL Server 可以使用 Windows 密碼原則機制。 密碼原則適用於使用 SQL Server 驗證的登入,以及適用於具有密碼的自主資料庫使用者。
SQL Server 可以將 Windows 中使用的相同複雜性和到期原則套用於 SQL Server 內部使用的密碼。 這項功能取決於 NetValidatePasswordPolicy
API。
注意
Azure SQL Database 會強制執行密碼複雜性。 密碼到期和原則強制執行區段不會套用到 Azure SQL Database。
如需了解 Azure SQL 受控執行個體密碼原則的相關資訊,請參閱 SQL 受控執行個體常見問題。
密碼複雜性
密碼複雜性原則是為了阻止暴力攻擊而設計,方法是盡可能地增加密碼數目。 當強制執行密碼複雜性原則時,新的密碼必須符合下列指導方針:
密碼不包含使用者的帳戶名稱。
密碼長度至少為八個字元。
密碼包含下列四種類別的其中三種:
拉丁文大寫字母 (A 到 Z)。
拉丁文小寫字母 (a 到 z)。
以 10 為基底的數字 (0 到 9)。
非英數字元,例如:驚嘆號 (!)、錢幣符號 ($)、數字符號 (#) 或百分比符號 (%)。
密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。
密碼過期
密碼過期原則用於管理密碼的壽命。 當 SQL Server 強制執行密碼到期原則,系統會提醒使用者變更舊密碼,並停用密碼已過期的帳戶。
原則強制執行
可個別對每一個 SQL Server 登入設定密碼原則的強制執行。 使用 ALTER LOGIN (Transact-SQL) 來設定 SQL Server 登入的密碼原則選項。 下列規則會套用至密碼原則強制執行的組態:
當 CHECK_POLICY 改為 ON 時,會發生下列行為:
CHECK_EXPIRATION 也會設為 ON,除非它已明確設為 OFF。
密碼記錄會使用目前密碼雜湊的值來初始化。
[帳戶鎖定期間]、[帳戶鎖定閾值] 和 [重設帳戶鎖定計數器的時間] 也會啟用。
當 CHECK_POLICY 改為 OFF 時,會發生下列行為:
CHECK_EXPIRATION 也會設為 OFF。
會清除密碼記錄。
會重設
lockout_time
的值。
有些原則選項組合不受支援。
如果指定 MUST_CHANGE,則 CHECK_EXPIRATION 和 CHECK_POLICY 必須設為 ON。 否則,陳述式會失敗。
如果 CHECK_POLICY 設為 OFF,CHECK_EXPIRATION 就不可設為 ON。 具有這些選項組合的 ALTER LOGIN 陳述式會失敗。
設定 CHECK_POLICY = ON 可防止建立下列類型的密碼:
Null 或空白
與電腦或登入名稱相同
以下任何一項:
password
、admin
、administrator
、sa
、sysadmin
安全性原則可能是在 Windows 中設定的,也可能是從網域收到的。 若要檢視電腦上的密碼原則,請使用 [本機安全性原則] MMC 嵌入式管理單元 (secpol.msc)。
注意
對於已啟用 CHECK_POLICY 的 SQL Server 登入,如果您執行 ALTER LOGIN,且在命令中不包含 OLD_PASSWORD 來變更密碼,則會忽略強制執行密碼歷程記錄。 這是依據設計所為之行為,即使先前使用過任何密碼,仍允許重設密碼。 不論是否使用 OLD_PASSWORD,都會檢查與 CHECK_POLICY 相關聯的其他檢查,包括長度和複雜度。
檢查 SQL 使用者密碼原則資訊
您可以使用下列查詢來檢閱 SQL Server 中的 SQL 使用者密碼原則和到期日。 雖然下列查詢也適用於 Azure SQL 資料庫,但在 Azure SQL 資料庫 中只會強制執行密碼複雜度。
SELECT name,
is_policy_checked,
is_expiration_checked,
LOGINPROPERTY(name, 'IsMustChange') AS IsMustChange,
LOGINPROPERTY(name, 'IsLocked') AS IsLocked,
LOGINPROPERTY(name, 'LockoutTime') AS LockoutTime,
LOGINPROPERTY(name, 'PasswordLastSetTime') AS PasswordLastSetTime,
LOGINPROPERTY(name, 'IsExpired') AS IsExpired,
LOGINPROPERTY(name, 'BadPasswordCount') AS BadPasswordCount,
LOGINPROPERTY(name, 'BadPasswordTime') AS BadPasswordTime,
LOGINPROPERTY(name, 'HistoryLength') AS HistoryLength,
modify_date
FROM sys.sql_logins;