컴플라이언스 준수를 위해 미사용 계정 정리
- Last sign-in 기준 90일 미사용자 계정 disable 처리 (interactive, non-interactive)
- 서비스 계정은 제외 (그룹을 설정하여 제외 처리)
PowerShell에서 Az 모듈 명령어 사용을 위해 Connect-AzAccount 실행 후 진행
- PowerShell 버전: 7.4.7
- Microsoft.Graph 모듈 버전: 2.25.0
사전 세팅
Automation Account 생성
- Azure portal 접속 - Automation Accounts 검색 후 Create 클릭
- Automation account name 설정 후 나머지는 기본 값으로 진행.
이 후 과정은 PowerShell CLI 창에서 진행
Microsoft.Graph 모듈 설치
PS C:\> Install-Module Microsoft.Graph
Microsoft Graph에 로그인 (OAuth 인증 + 권한 위임)
PS C:\> Connect-MgGraph -Scopes "AppRoleAssignment.ReadWrite.All", "Application.Read.All"
- Microsoft Graph API에 로그인
- 이 스크립트는 다른 앱에 역할(AppRole)을 할당하기 위해 AppRoleAssignment.ReadWrite.All 권한이 필요
- Application.Read.All은 SPN(Service Principal) 정보 조회용
변수 설정
PS C:\> $automationAccountName = "<Automation Account의 이름>"
PS C:\> $tenantId = "<Tenant ID>"
Automation Account의 Managed Identity 정보 조회
PS C:\> $managedIdentity = Get-AzADServicePrincipal -Filter "displayName eq '$automationAccountName'"
Microsoft Graph 자체의 Service Principal 정보 가져오기
PS C:\> $graphSp = Get-MgServicePrincipal -Filter "appId eq '00000003-0000-0000-c000-000000000000'"
Microsoft Graph AppRole 중 원하는 권한 골라내기
PS C:\> $role1 = $graphSp.AppRoles | Where-Object { $_.Value -eq "User.ReadWrite.All"}
PS C:\> $role2 = $graphSp.AppRoles | Where-Object { $_.Value -eq "AuditLog.Read.All" }
PS C:\> $role3 = $graphSp.AppRoles | Where-Object { $_.Value -eq "Directory.Read.All" }
PS C:\> $role4 = $graphSp.AppRoles | Where-Object { $_.Value -eq "GroupMember.Read.All" }
Microsoft Graph AppRole 권한 부여하기
PS C:\> New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentity.Id -PrincipalId $managedIdentity.Id -ResourceId $graphSp.Id -AppRoleId $role1.Id
PS C:\> New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentity.Id -PrincipalId $managedIdentity.Id -ResourceId $graphSp.Id -AppRoleId $role2.Id
PS C:\> New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentity.Id -PrincipalId $managedIdentity.Id -ResourceId $graphSp.Id -AppRoleId $role3.Id
PS C:\> New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentity.Id -PrincipalId $managedIdentity.Id -ResourceId $graphSp.Id -AppRoleId $role4.Id
- User.ReadWrite.All: 모든 사용자 읽기 및 수정 (매우 강력한 권한)
- AuditLog.Read.All: 감사 로그 전체 읽기
- Directory.Read.All: 디렉터리 전체 읽기
- GroupMember.Read: All 그룹 구성원 정보 읽기
Automation Account에 Graph Module 추가하기
Azure Automation 계정에서 PowerShell Runbook을 실행할 때, 필요한 Microsoft Graph 관련 모듈들을 미리 설치
변수 정의
PS C:\> $moduleName1 = "Microsoft.Graph.Authentication"
PS C:\> $moduleName2 = "Microsoft.Graph.Users"
PS C:\> $moduleName3 = "Microsoft.Graph.Groups"
PS C:\> $moduleVersion = "2.25.0"
PS C:\> $runtimeVersion = "7.2"
PS C:\> $resourceGroupName = "<Resource Group 이름>"
PS C:\> $automationAccountName = "<Automation Account 이름>"
- Authentication: 인증 처리용
- Users: 사용자 관리용
- Groups: 그룹 관리용
Azure Automation에 모듈 등록
- Az.Automation 모듈이 설치되어 있어야 함 (PS C:\> Install-Module Az.Automation)
PS C:\> New-AzAutomationModule -AutomationAccountName $automationAccountName -ResourceGroupName $resourceGroupName -Name $moduleName1 -RuntimeVersion $runtimeVersion -ContentLinkUri "https://www.powershellgallery.com/api/v2/package/$moduleName1/$moduleVersion"
PS C:\> New-AzAutomationModule -AutomationAccountName $automationAccountName -ResourceGroupName $resourceGroupName -Name $moduleName2 -RuntimeVersion $runtimeVersion -ContentLinkUri "https://www.powershellgallery.com/api/v2/package/$moduleName2/$moduleVersion"
PS C:\> New-AzAutomationModule -AutomationAccountName $automationAccountName -ResourceGroupName $resourceGroupName -Name $moduleName3 -RuntimeVersion $runtimeVersion -ContentLinkUri "https://www.powershellgallery.com/api/v2/package/$moduleName3/$moduleVersion"
이 후 과정은 Azure portal Automation Runbook 에서 진행
Automation Accounts 설정
생성 해 놓은 Automation Accounts 접속 후 Runbook 접속
Create a runbook 클릭
- Name: 임의로 생성
- PowerShell 7.2 선택 후 나머지는 기본값으로 생성.
PowerShell 스크립트 등록 -> Save -> Publish 진행
신규로 생성 된 runbook 확인
- 시간이 자니면 Authoring status 가 New 에서 Published 로 변경
Runbook 테스트
신규로 생성 된 runbook 클륵 -> Edit -> Edit in portal 선택
상단에 Test pane 클릭
DRYRUN 부분에 True 입력 후 Start 클릭
- True
- 실제 리소스 변경 없이 Runbook의 동작을 테스트
- Runbook이 작성한 코드대로 실행되지만, 실제 Azure 리소스에는 영향을 주지 않음
- False
- 코드 실행에 따른 결과값 적용(리소스 변경)
대상 계정 정보 출력
스케줄 설정
Runbook 하면으로 돌아가서 Schedules 선택 -> Add a schedule 클릭
- AccDisable90DayInactive 계정 아래 schedules 가 아닌 runbook 하위에 있는 schedules
Schedule 클릭
Add a schedule 클릭 -> 스케줄 설정 후 Create
Parameters and run settings 클릭
false 입력 후 OK
스케줄 생성 확인
- DryRun 값을 false 로 설정했기 때문에 스케줄에 따라 진행 시 90일 초과 계정은 disable 설정 됨.