이것은 사용자들에게 인기가되지 않을 수도 있습니다,하지만 난 당신이 확실히 알 수있는 유일한 방법입니다 믿고 강제 로 모든 SQL 로그인에 대한 암호 변경을 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;
Steve Jones는 이것에 대해 얼마 전에 썼습니다 . 아래에서 밝혀낸 내용으로 인해 is_policy_checked = 1
해시 된 비밀번호로 로그인을 만들 수 있기 때문에 비밀번호가 실제로 현재 정책을 충족한다는 것을 의지 할 수는 없습니다 (이 경우 일반 텍스트 비밀번호는 확인) 또는 로컬 복잡성 정책이 사용 중지 된 경우 (여전히으로 이어짐 is_policy_checked = 1
)
내가 생각한 또 다른 접근법 은 현재 와 함께 모든 로그인 사본 을 작성하고 실패한 모든 것을 기록하는 것입니다. 그러나이 작업 할 수없는 - 심지어와 함께 , 그것은 이미 해시 암호의 유효성 검사를 수행하지 않습니다. 후손을위한 코드를 포함시킬 것입니다. 그러나 의도적으로 정책을 확인할 수는 없습니다.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;
개인적으로 이것은 버그라고 생각합니다. 구문을 통해 해시 된 암호를 사용하여 로그인을 만들 수 있고 해당 암호가 내 복잡성 정책을 충족해야한다고 규정 할 수 있으면 정책이 실제로 확인되지 않았다는 오류 또는 경고가 발생해야합니다.
업데이트 :이 동작에 대해 버그를 신고했습니다.