기존 사용자의 비밀번호 정책 확인


11

최근에 많은 데이터베이스 로그인에서 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

그러나 플래그가 사용자를 만들 때만 관련이 있기 때문에 암호가 실제로 암호 정책을 준수하는지 여부는 알 수 없습니다.

비밀번호 정책 준수를 위해 기존 사용자 를 테스트하는 알려진 방법이 있습니까?
이전 비밀번호에 액세스 할 수 없으므로 비밀번호가 필요하지 않은 방법을 선호합니다.


1
무슨 회의? SQL Server 일? BICC? 빠른 검색을했는데 결과를 신속하게 제공하는 기본 기능이없는 것 같습니다. 타사 도구를 사용하는 것이 가능할 수 있습니다.
Stijn Wynants

SQL Server 일 나는 빠른 검색을 수행했으며 사전을 사용하여 사전 공격을하는 일부 도구 이외 PWDCOMPARE()의 노력에 감사드립니다.
Reaces

다음에 로그인 할 때 정책의 유효성을 검사하고 감사 전에 로그인하지 않은 모든 사용자에 대해 강제로 재설정 할 수 있습니다. 모든 비밀번호를 재설정 할 때보 다 사용자의 불편 함이 줄어 듭니다.
코드 인 카오스

@CodesInChaos 로그인 이벤트 중에 정책을 어떻게 확인합니까?
Aaron Bertrand

1
이 문제에 대해 블로그에 올렸 습니다. 여러분 모두 는 Connect 항목대해 투표하고 의견을 제시 할 것을 권장합니다 .
Aaron Bertrand

답변:


15

이것은 사용자들에게 인기가되지 않을 수도 있습니다,하지만 난 당신이 확실히 알 수있는 유일한 방법입니다 믿고 강제 로 모든 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_hashCHECK_POLICY = ONCHECK_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;

개인적으로 이것은 버그라고 생각합니다. 구문을 통해 해시 된 암호를 사용하여 로그인을 만들 수 있고 해당 암호가 내 복잡성 정책을 충족해야한다고 규정 할 수 있으면 정책이 실제로 확인되지 않았다는 오류 또는 경고가 발생해야합니다.

업데이트 :이 동작에 대해 버그를 신고했습니다.


또 다른 문제는 이전 관리자가 암호를 쉽게 기억 한 후에이 정책을 확인했다는 것입니다. select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;몇 가지 긍정적 인 결과를 주었다. 따라서 모든 로그인에 대해이 작업을 수행해야 is_policy_checked합니다.
Reaces

@Reaces 가능합니다. 또는 Windows의 비밀번호 정책이 약하거나 비활성화되어있을 수 있으므로 정책을 적용해도 도움이되지 않습니다.
Aaron Bertrand

방금 두 번째 서버에서 동일한 사용자를 만들려고했는데 비밀번호 확인에 실패했습니다. 복잡성 검사가 작동한다고 생각합니다. 그래도 사용자의 사본을 재현한다는 아이디어가 마음에 듭니다! 그 작업을 수행하는 스크립트를 작성하도록 설정하겠습니다! 편집 : 실제로 나는 sp_help_revlogin 을 사용 하여 무거운 물건을들 수 있습니다.
Reaces

"이미 해시 된 암호의 유효성 검사를 수행하지 않습니다"어떻게 그렇게합니까? 일반 비밀번호가 아닌 해시 만 알고 있으면 비밀번호의 복잡성을 확인할 수 없습니다. 암호를 추측 할 수는 있지만 암호 해시의 요점은 평문 암호의 복구를 방해하기 때문에 적절한 암호 해시에 매우 비쌉니다.
코드 인 카오스

@CodesInChaos 내가 아는, 그것은 내 요점입니다 ... 나는 "하지 않았다"라고 말했지만 "아마도 가능하지 않았다"라고 쓰여있을 수도 있습니다 ...
Aaron Bertrand

4

이 100 % 정확도를 얻는 방법은 없습니다. PWDCOMPARE취약한 암호 목록을 확인 하는 데 사용할 수 있지만 취약한 암호 목록에 추가하고 비교할 수 있습니다.

비교를 수행하고 결과를 제공하는 비슷한 스크립트를 작성했습니다. 나는 그것을 github에 게시했다 .

편집하다:

이제 csv에 취약한 비밀번호 목록을 보유한 다음 스위치 Test-DbaLoginPassword와 함께 dbatools를 사용할 수 -Dictionary있습니다 (약한 비밀번호 테스트에 포함 할 비밀번호 목록을 지정합니다).


특정 사용자의 비밀번호를 직접 감사해야하는 경우 스크립트를 사용하고 싶습니다. 그러나 감사자가 무엇을할지 알지 못하고 모든 것이 정책을 준수하는지 확인하고 정책을 만드는 데 의존해야합니다. 그래도 고마워! +1
Reaces

0

SQL 로그인 당 암호 정책은 on 또는 off에 대한 플래그 일뿐입니다. 비밀번호 정책 플래그를 선택하면 운영 체제의 Windows 비밀번호 정책이 적용됩니다.

CHECK_POLICY 및 CHECK_EXPIRATION이 설정 될 때 발생하는 작업에 대한 자세한 내용은 CREATE LOGIN 설명서를 확인하십시오.

sys.sql_logins에서 is_policy_checked 및 is_expiration_checked 열을 확인하여 SQL 사용자 별 설정을 볼 수 있습니다.

아래와 같은 것 :

SELECT name,
create_date,
modify_date,
LOGINPROPERTY(name, 'DaysUntilExpiration') DaysUntilExpiration,
LOGINPROPERTY(name, 'PasswordLastSetTime') PasswordLastSetTime,
LOGINPROPERTY(name, 'IsExpired') IsExpired,
LOGINPROPERTY(name, 'IsMustChange') IsMustChange
From sys.sql_logins ;

SQL Server 인증 로그인의 경우 :

select * from sys.server_principals where type in ('U','G') -Windows 인증을 통해 SQL Server에 액세스 할 수있는 로그인 및 그룹이 표시됩니다.


이미 비슷한 쿼리를 사용하고 있으므로 내 질문이 약간 업데이트되었습니다. 내 주요 문제는 암호가 정책을 준수하지만 상사에게 암호를 모르는 방법을 알 수 있어야한다는 것입니다.
Reaces
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.