Computer >> 컴퓨터 >  >> 체계 >> Windows Server

Active Directory의 취약한 암호 감사

Active Directory 도메인에서 사용자 암호의 복잡성은 사용자 데이터와 전체 도메인 인프라 모두에 대한 주요 보안 요소 중 하나입니다. 개인정보, 사전, 간단한 조합을 비밀번호로 사용하지 말라는 권고에도 불구하고 많은 사용자들이 간편하고 기억하기 쉬운 비밀번호를 선호하고 있습니다. 이 기사에서는 PowerShell을 사용하여 Active Directory 사용자 암호를 감사하고 취약하고 간단한 암호를 찾는 방법을 보여줍니다.

복잡한 도메인 비밀번호 정책을 사용하더라도 사용자는 기술적으로 Pa$$w0rd와 같은 취약하거나 기본 비밀번호를 설정할 수 있습니다. 또는 P@ssw0rd .

DSInternals(디렉터리 서비스 내부) PowerShell 모듈을 설치하는 방법

Active Directory 데이터베이스(ntds.dit 파일)에 저장된 사용자 비밀번호의 해시를 단순 및 일반 비밀번호 사전과 비교하기 위해 타사 PowerShell 모듈인 DSInternals.를 사용할 수 있습니다. 이 모듈에는 온라인 또는 오프라인 모드(ntds.dit을 사용하여 직접)에서 AD 데이터베이스에 대해 다양한 작업을 수행할 수 있는 여러 cmdlet이 포함되어 있습니다. 특히 Test-PasswordQuality에 관심이 있습니다. 취약하거나 유사한 표준 빈 비밀번호(비밀번호 필요 없음)를 갖고 있거나 비밀번호가 만료되지 않는 사용자를 감지할 수 있는 cmdlet입니다.

참고. 당연히 사용자 암호는 AD 데이터베이스에서 일반 텍스트로 얻을 수 없습니다. Active Directory에 저장된 암호는 해시됩니다. 그러나 AD 사용자의 비밀번호 해시를 사전 파일의 단어 해시와 비교하여 취약한 비밀번호를 찾을 수 있습니다.

PowerShell 버전 5(이상)에서는 다음과 같이 공식 PowerShell 스크립트 갤러리에서 DSInternals 모듈을 온라인으로 설치할 수 있습니다.

Install-Module DSInternals

이전 PowerShell 버전 또는 연결이 끊긴 환경에서는 GitHub(https://github.com/MichaelGrafnitter/DSInternals/releases)에서 최신 모듈 버전이 포함된 .zip 아카이브를 다운로드해야 합니다. 이 기사가 작성되었을 때 최신 릴리스는 DSInternals v4.4.1이었습니다. 이 아카이브를 PowerShell 모듈이 포함된 디렉토리 중 하나로 압축을 풉니다.

  • C:\Windows\system32\WindowsPowerShell\v1.0\Modules\DSInternals
  • C:\Users\%username%\Documents\WindowsPowerShell\Modules\DSInternals

또는 다음 명령을 사용하여 DSInternals 모듈을 현재 PowerShell 세션으로 가져옵니다.

Import-Module C:\distr\PS\DSInternals\DSInternals.psd1

"cannot be loaded because running scripts is disabled on this system 오류가 발생한 경우 " 모듈을 가져올 때 표시되면 현재 PowerShell 실행 정책을 변경하고 외부 PS 스크립트가 최소한 현재 세션에서 실행되도록 허용해야 합니다.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force

사용 가능한 모듈 cmdlet 목록은 다음과 같이 얻을 수 있습니다.

Get-Command -Module DSInternals

Active Directory의 취약한 암호 감사

Test-PasswordQuality Cmdlet으로 취약한 Active Directory 비밀번호 찾기

다음으로 비밀번호 사전을 생성해야 합니다. 일반적으로 사용되는 암호, 취약한 암호 및 기타 잘못된 암호 목록이 있는 간단한 텍스트 파일입니다. 인터넷에서 암호 사전 파일을 다운로드하거나 직접 만들 수 있습니다. DSInternal 모듈을 사용하면 Active Directory에 있는 사용자 암호의 해시를 이 파일의 단어 해시와 비교할 수 있습니다. 텍스트 파일 PasswordDict.txt에 비밀번호 저장 .

Active Directory의 취약한 암호 감사

이제 작은 PowerShell 스크립트를 만듭니다. 다음 변수에서 비밀번호 파일의 경로, 도메인 이름 및 도메인 컨트롤러 이름을 지정하십시오.

$DictFile = "C:\distr\PS\DSInternals\PasswordDict.txt"
$DC = "lon-dc01"
$Domain = "DC=woshub,DC=loc"

그런 다음 Get-ADReplAccount를 사용하여 cmdlet을 사용하여 AD의 사용자 목록을 가져옵니다(예:Get-ADUser). 또한 이 cmdlet은 NT 및 LM 해시와 해시 기록을 반환합니다. 그런 다음 각 사용자에 대해 암호 해시를 사전 파일의 해시와 비교합니다(비활성화된 사용자 계정에 대해서도 검사가 수행됨).

Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -WeakPasswordsFile $DictFile -IncludeDisabledAccounts

스크립트 실행 결과는 다음과 같습니다.

Active Directory Password Quality Report
----------------------------------------
Passwords of these accounts are stored using reversible encryption:
LM hashes of passwords of these accounts are present:
These accounts have no password set:
TEST\DefaultAccount
TEST\Guest
Passwords of these accounts have been found in the dictionary:
TEST\a.adams
TEST\jbrion
TEST\jsanti
These groups of accounts have the same passwords:
Group 1:
TEST\a.novak
TEST\Administrator
TEST\amuller
TEST\k.brown
Group 2:
TEST\a.adams
TEST\jbrion
TEST\jsanti
These computer accounts have default passwords:
Kerberos AES keys are missing from these accounts:
Kerberos pre-authentication is not required for these accounts:
Only DES encryption is allowed to be used with these accounts:
These administrative accounts are allowed to be delegated to a service:
TEST\a.adams
TEST\a.novak
TEST\Administrator
TEST\jbrion
TEST\jsanti
TEST\k.brown
TEST\krbtgt
Passwords of these accounts will never expire:
TEST\a.adams
TEST\Administrator
TEST\DefaultAccount
TEST\Guest
TEST\k.brown
TEST\krbtgt
TEST\web
These accounts are not required to have a password:
TEST\ADFS1$
TEST\DefaultAccount
TEST\Guest
These accounts that require smart card authentication have a password:

Active Directory의 취약한 암호 감사

DSInternal 모듈의 이전 버전에서 ShowPlainText 해시가 사전에서 발견된 경우 매개변수를 사용하여 사용자 암호를 일반 텍스트로 표시할 수 있었습니다. Test-PasswordQuality의 현재 릴리스에는 없습니다. DSInternals 모듈의 이전 버전을 사용하려면 다음 명령을 사용하여 설치하십시오.

Install-Module -Name DSInternals -RequiredVersion 2.23

AD에 저장된 사용자 비밀번호 이력을 포함하여 해시 검색을 수행합니다. 보시다시피, 간단한 비밀번호를 가진 AD 사용자를 성공적으로 찾았습니다(비밀번호가 사전과 일치함). 동일한 암호를 가진 여러 사용자도 발견되었습니다. 이 스크립트는 사용자 정의 세분화된 암호 정책이 적용되는 간단한 암호가 있는 계정을 찾는 데 도움이 됩니다.

암호가 약한 사용자의 경우 강력한 임의 암호를 생성하고 PowerShell을 통해 AD에서 강제로 변경할 수 있습니다.

Active Directory 데이터베이스 파일(ntds.dit)의 오프라인 검색을 수행할 수도 있습니다. 섀도 복사본이나 도메인 컨트롤러 백업에서 ntds.dit 파일의 복사본을 얻을 수 있습니다.

ntds.dit 파일에서 사용자 해시를 오프라인으로 확인하려면 다음 명령을 사용하십시오.

$keyboot= Get-BootKey -SystemHiveFilePath 'C:\ADBackup\registry\SYSTEM'
Get-ADDBAccount -All -DatabasePath 'C:\ADBackup\ntds.dit -BootKey $keyboot | Test-PasswordQuality -WeakPasswordsFile $DictFile

모든 해시 목록을 텍스트 파일로 내보낼 수도 있습니다.

Get-ADDBAccount -All -DBPath 'C:\ADBackup\ntds.dit' -Bootkey $keyboot | Format-Custom -View HashcatNT | Out-File c:\ps\ad_hashes.txt -Encoding ASCII

Active Directory 도메인 서비스에 대해 잘못된 암호 목록을 설정하는 기본 제공 도구는 없습니다. 그러나 Azure AD 암호 보호를 사용하면 , 온-프레미스 Active Directory에서도 특정 암호(블랙리스트)를 차단할 수 있습니다.

따라서 이 시나리오를 사용하면 AD 사용자 암호의 품질, 무차별 대입 공격에 대한 저항, 현재 도메인 암호 정책 복잡성 결론을 쉽게 분석하고 필요한 결론을 내릴 수 있습니다. Active Directory 관리자는 이 감사를 정기적으로 수행할 수 있습니다.