PowerShell로 Active Directory 로그온 보고서 생성하는 방법

PowerShell를 사용하여 Active Directory 로그온 보고서를 작성합니다. 우리가 알다시피, 보안에 있어서는 Active Directory (AD) 환경에서 감사가 중요합니다. 사용자가 무엇을 했는지와 어느 시스템에 로그인했는지를 파악하는 것이 중요합니다. 따라서 현재 대부분의 관리자가 다루고 있는 중요한 작업 중 하나는 사용자가 어디에 로그인했는지 찾는 것입니다. 이 기사에서는 도메인 컨트롤러 (DC)의 내장 이벤트 뷰어를 활용하여 사용자가 로그인한 위치를 찾고 PowerShell을 사용하여 포괄적인 로그온 보고서를 생성하는 단계별 안내서를 제공합니다.

그러므로, PowerShell을 사용하여 Active Directory 로그온 보고서를 작성하는 기사를 계속해 봅시다. 

Active Directory 로그온 보고서 작성

전제 조건

이벤트 뷰어모니터를 사용하여 이벤트를 여러 날 동안 모니터링할 예정이므로 이벤트 로그의 크기가 충분한지 확인해야 합니다. 이 설정을 이미 활성화했을 수 있지만, 다른 사람들이 이벤트 로그 크기를 늘리도록 하려면 이를 다시 확인할 것입니다.

이전에 구성을 변경하지 않았다면, 이벤트 로그의 기본 크기 설정은 약 64MB일 것입니다. 그러나 환경에서 여러 개의 DC를 다루는 경우 크기를 늘려야 할 수 있습니다. 예를 들어, 여러 날 동안 감사 로그온을 추적하려는 경우, 이벤트 뷰어에 훨씬 더 많은 공간이 필요할 것입니다.

GPO 생성

1. 환경을 준비하는 첫 번째 단계로, 이벤트 로그 크기 설정을 포함하는 그룹 정책 개체 (GPO)를 만들겠습니다. 그룹 정책 관리 콘솔 (GPMC)을 열고 GPO를 만듭니다. 콘솔을 열려면 실행 (Ctrl+R) 창에서 그룹 정책을 검색하거나 gpmc.msc를 입력하십시오.

2. 탐색 패널에서 Forest:ForestName을 확장, 도메인을 확장도메인 이름을 확장하고, 그룹 정책 개체를 클릭. 그다음, 작업을 클릭하고, 새로 만들기를 클릭합니다.

3. 새로 생성된 GPO 내에서 아래 경로를 찾으십시오:

4. 환경 및 요구 사항에 따라 보안 이벤트 크기를 변경하십시오. 또한, 디스크 공간 및 성능에 대한 우려가 없는 경우 최대 4GB 수준의 설정을 구성할 수 있습니다.

5. 도메인 컨트롤러에 방화벽 설정이 없는 경우 다음 단계는 선택 사항입니다. 그러나 여러 도메인 컨트롤러 및 가능한 경우 여러 사이트에서 이벤트 로그를 쿼리할 수 있어야 합니다. 따라서 방화벽을 통해 원격 이벤트 로그 모니터링이 활성화되어 있는지 확인하는 것이 현명합니다.

안타깝게도 방화벽 설정 구성에 대한 일부 세부 정보만 다룰 수 있습니다. 그러나 아래 이미지는 원격 이벤트 로그 모니터링을 활성화하기 위해 필요한 모든 설정을 표시합니다. 

6. 이제 방금 만든 GPO를 도메인 컨트롤러 OU에 연결하고 일부 이벤트가 생성될 때까지 기다리십시오. 이벤트는 환경에 따라 다르며, 우리는 즉시 감사를 쿼리하거나 며칠을 기다릴 수 있습니다. 로깅을 올바르게 설정했으므로, 이제 해당 문서의 다음 섹션에서 논의될 PowerShell 스크립트를 실행할 수 있습니다.

다음에는 PowerShell로 Active Directory 로그온 보고서를 생성하는 것이 기사 제목의 주요 부분입니다. 계속 읽어보세요.

PowerShell로 AD 로그온 보고서 생성

시작하기 위해, 스크립트를 다운로드하고 디렉터리 또는 폴더에 복사하십시오. 또는, 만약 설치된 경우 git, 다음 명령을 실행할 수 있습니다.

git clone https://github.com/InfraSOS/Get-UserLastLogon.git

스크립트는 ActiveDirectory 모듈을 사용하지만, 시스템에서 모듈을 수동으로 설치할 필요는 없습니다. 스크립트가 시스템에서 모듈을 확인합니다. 다운로드한 후에 PowerShell을 시작하고 다운로드한 스크립트의 폴더나 드라이브로 이동하십시오.

다운로드한 파일을 편집하면 네 가지 주요 기능이 나타납니다. 이 네 가지 주요 기능은 Param, Begin, Process, 그리고 End입니다.

PowerShell 스크립트 설명

Param 섹션에는 스크립트를 실행하는 데 필요한 매개변수가 포함되어 있습니다. 아래 코드 블록에 표시된 대로, 스크립트를 실행하기 위해 세 가지 매개변수가 필요합니다. 이러한 매개변수를 나중에 설명하겠습니다.

param (
    [Parameter(Mandatory = $true)]
    [String]$User,

    [Parameter(Mandatory = $false)]
    [Array]$Server = @((Get-ADDomainController -Filter *).Name) ,

    [Parameter(Mandatory = $false)]
    [Array]$Days = 90
)

최상의 관례로, 변수와 일반적인 정보는 스크립트의 주요 부분을 혼잡하게 만들지 않도록 Begin 섹션에 배치됩니다.

[Array]$Table         = $null
$DomainControllers    = $Server
$AllDomainControllers = @((Get-ADDomainController -Filter *).Name)
[Array]$ExclusionList = @($User,'krbtgt')
$DCCount              = $DomainControllers.Count
$UPN                  = ((get-addomain).DNSRoot).toUpper()
$DateFilter           = "-"+$days
$DateThen             = (((Get-Date).AddDays($DateFilter)).ToString("yyyy-MM-dd"))+"T20:30:00.000Z"
$DateNow              = (Get-Date -Format yyyy-MM-dd)+"T20:30:00.999Z"
$ForestRoot           = ((Get-ADForest).rootDomain).toUpper()
$Counter              = 0

Begin 스크립트는 이벤트 로그를 쿼리하기 위한 기본 필터를 구성합니다. 그런 다음, 스크립트는 각 DC로 이 필터를 보내 정보를 수집합니다. 이 라인들에서 볼 수 있듯이, $UPN$User와 같은 이전에 논의된 변수들이 있습니다.

[xml]$FilterXML = @"


    *[System[(EventID=4769)
	and TimeCreated[@SystemTime>='$DateThen'
	and @SystemTime<='$DateNow']]]
	and*[EventData[Data[@Name='TargetUserName'] and (Data='$User@$UPN')]]


"@

프로세스 섹션은 핵심 기능으로, 스크립트가 보고서를 생성할 데이터를 쿼리하는 곳입니다. 아래 코드 블록은 매번 다른 DC에 로그인할 때마다 실행되는 foreach 명령입니다.

Foreach($DCName in $DomainControllers){...}

먼저 첫 번째 DC에서 이벤트를 수집합니다. 그런 다음 각 이벤트에서 가치 있는 정보를 추출하여 다음 이벤트로 넘어가기 전에 개체에 저장합니다. 첫 번째 DC 작업을 마치면 스크립트는 다른 DC로 이동하여 프로세스를 반복합니다.

마지막으로, 최종 생성된 보고서를 표시하는 End 섹션이 있습니다.

end{
    $Table = $Table | Where-Object {($_.Location -notin $AllDomainControllers) -and ($_.Location -ne $ForestRoot) -and ($_.Location -notin $ExclusionList)}
    $Table | Sort Time | FT Time,User,Location,Domain,DC -AutoSize
}

PowerShell 스크립트 실행

시작하려면, PowerShell을 열고 다음 명령을 입력하여 cmdlet을 메모리에 로드합니다.Enter 키를 누르면 PowerShell 실행 정책으로 인해 스크립트 실행이 비활성화되었음을 나타내는 오류가 발생할 수도 있고 오류가 없을 수도 있습니다. 오류가 발생하는 경우 관리 권한으로 PowerShell 콘솔을 열고, 아래 다음 명령을 입력하여 스크립트 실행을 허용한 다음 이전 명령을 반복합니다.

. .\Get-UserLastLogon.ps1

누구든지 Enter 키를 누를 때, PowerShell 실행 정책 때문에 스크립트 실행이 차단되어 오류가 발생할 수도 있고, 그렇지 않을 수도 있습니다. 오류가 발생하면, 관리자 권한으로 PowerShell 콘솔을 열고, 다음 명령어를 입력하여 스크립트 실행을 허용한 후, 이전 명령을 다시 실행하십시오.

Set-ExecutionPolicy RemoteSigned
. .\Get-UserLastLogon.ps1

이제 스크립트가 완전히 로드되었으므로, 사용자가 지난 15일 동안 로그온한 작업 스테이션을 찾는 예제로 사용해 보겠습니다. 먼저, 사용자 이름을  –User 매개변수와 기간을 –Days 매개변수와 함께 입력한 후 Enter 키를 누릅니다. 

Get-UserLastLogon -User marion -Days 15

기억하실지 모르겠지만, 저희에게는 -Server 매개변수라는 또 다른 매개변수가 있습니다.. 만약 저희가 -Server 매개변수에 값을 제공하지 않는다면, 이 매개변수를 채울 모든 도메인 컨트롤러를 고려할 것입니다. 이제, 우리가 검색 쿼리에 대상으로 하고자 하는 특정 DC가 있다면, -Server 매개변수의 값으로 지정할 수 있습니다.

스크립트를 실행한 후에는 진행 상황과 완료하는 데 걸릴 시간을 알려주는 진행 바를 표시합니다. 이제 스크립트를 실행한 후 생성된 보고서를 볼 수 있습니다. 이 보고서는 사용자가 지난 15일 동안 로그인한 작업 스테이션을 알려줍니다.

Time                  User   Location      Domain  DC
----                  ----   --------      ------  --
11/19/2022 7:31:11 AM marion DESKTOP-IGK57 abc.com MARION-DC01

PowerShell 스크립트 이해

우리가 스크립트를 실행할 때, 처음에는 사용자 계정이 존재하는지 여부를 확인합니다. 따라서 입력된 사용자 이름이나 ID가 존재하지 않는 경우, 나머지 스크립트를 실행할 필요가 없다는 것이 분명합니다.

다음 단계에서 우리는 필요한 변수를 계산하고 이를 DC에 보내며 선택한 사용자의 이벤트를 쿼리하는 데 필요한 필터를 함께 보냅니다. 마지막으로, 스크립트는 목록의 첫 번째 도메인 컨트롤러에 요청을 보내고 선택한 사용자와 관련된 쿼리된 이벤트를 변수에 저장합니다.

스크립트가 시작할 저장된 이벤트 목록과 이어지는 단계에서는 이벤트에서 유용한 데이터를 수집하는 작업을 수행합니다. 마지막으로, 스크립트는 추출된 데이터를 도메인, DC 이름, 로그인 시간, 로그인 작업 스테이션과 같은 변수에 할당합니다.

마지막으로, 스크립트는 다음 DC를 실행하고 이 과정을 반복합니다.

스크립트가 마지막 DC와 연락하고 정보를 수집하면 컴퓨터 목록을 표시합니다.

Time                  User   Location      Domain  DC
----                  ----   --------      ------  --
11/19/2022 7:31:11 AM marion DESKTOP-IGK57 abc.com MARION-DC01

PowerShell로 Active Directory 로그온 보고서를 생성하는 것을 읽어 주셔서 감사합니다. 결론을 맺겠습니다.

Active Directory 로그온 보고서 결론

이 가이드에서는 필수 이벤트 뷰어를 사용하는 방법과 PowerShell 스크립트를 결합하여 사용자가 로그인한 워크스테이션 목록을 찾는 방법에 대해 배웠습니다. 스크립트는 도메인의 모든 DC를 쿼리하고 결과를 찾아서 읽을 수 있는 형식으로 구문 분석하여 보고서로 내보낼 수 있습니다. 제공된 스크립트를 실행하기 전에 전제 조건을 확인하도록 기억하세요.

Source:
https://infrasos.com/create-active-directory-logon-reports-with-powershell/