관리 테넌트에서 위임 변경 모니터링

서비스 공급자는 Azure Lighthouse를 통해 고객 구독 또는 리소스 그룹이 테넌트에 위임되거나 이전에 위임된 리소스가 제거될 때 주의해야 할 수 있습니다.

관리 테넌트에서 Azure 활동 로그테넌트 수준에서 위임 활동을 추적합니다. 이 기록된 활동에는 고객 테넌트에서 추가되거나 제거된 위임이 포함됩니다.

이 토픽에서는 모든 고객에 대한 테넌트로의 위임 활동을 모니터링하는 데 필요한 권한을 설명합니다. 또한 이 데이터를 쿼리하고 보고하는 한 가지 방법을 보여 주는 샘플 스크립트도 포함되어 있습니다.

Important

이러한 모든 단계는 고객 테넌트가 아닌 관리 테넌트에서 수행해야 합니다.

이 항목에서는 서비스 공급자 및 고객만 언급하지만 여러 테넌트를 관리하는 기업에서도 동일한 프로세스를 사용할 수 있습니다.

테넌트 수준 데이터에 대한 액세스 사용

테넌트 수준 활동 로그 데이터에 액세스하려면 루트 범위(/)에서 모니터링 판독기 Azure 기본 제공 역할을 계정에 할당해야 합니다. 이 할당은 상승된 추가 액세스가 있는 전역 관리자 역할을 가진 사용자가 수행해야 합니다.

전역 관리자 계정의 액세스 권한 상승

루트 범위(/)에서 역할을 할당하려면 상승된 액세스 권한이 있는 Global 관리istrator 역할이 있어야 합니다. 상승된 액세스는 역할을 할당하는 경우에만 추가하고 완료되면 제거해야 합니다.

권한 상승을 추가 및 제거하는 방법에 대한 자세한 내용은 모든 Azure 구독 및 관리 그룹을 관리하기 위한 액세스 권한 상승을 참조하세요.

액세스 권한이 상승되면 계정에는 루트 범위로 Azure에서 사용자 액세스 관리자 역할이 지정됩니다. 이 역할 할당을 사용하면 모든 리소스를 보고 디렉터리의 구독 또는 관리 그룹에서 액세스 권한을 할당하고 루트 범위에서 역할 할당을 수행할 수 있습니다.

루트 범위에서 모니터링 판독기 역할 할당

액세스 권한을 상승시킨 후에는 테넌트 수준 활동 로그 데이터를 쿼리할 수 있도록 계정에 적절한 권한을 할당할 수 있습니다. 이 계정에는 관리 테넌트 루트 범위에 모니터링 판독기 Azure 기본 제공 역할이 할당되어 있어야 합니다.

Important

루트 범위에서 역할 할당을 부여하면 테넌트 내의 모든 리소스에 동일한 권한이 적용됩니다. 이는 광범위한 수준의 액세스이기 때문에 서비스 주체 계정에 이 역할을 할당하고 해당 계정을 사용하여 데이터를 쿼리하는 것이 좋습니다.

Azure Portal에서 위임 정보를 직접 볼 수 있도록 루트 범위의 모니터링 판독기 역할을 개별 사용자 또는 사용자 그룹에 할당할 수도 있습니다. 이렇게 하면 가능한 가장 적은 수의 사용자로 제한해야 하는 광범위한 액세스 수준이라는 점에 유의하세요.

다음 방법 중 하나를 사용하여 루트 범위 할당을 만듭니다.

PowerShell

# Log in first with Connect-AzAccount if you're not using Cloud Shell

New-AzRoleAssignment -SignInName <yourLoginName> -Scope "/" -RoleDefinitionName "Monitoring Reader"  -ObjectId <objectId> 

Azure CLI

# Log in first with az login if you're not using Cloud Shell

az role assignment create --assignee 00000000-0000-0000-0000-000000000000 --role "Monitoring Reader" --scope "/"

Global 관리istrator 계정에 대한 상승된 액세스 제거

루트 범위의 모니터링 판독기 역할을 원하는 계정에 할당한 후에는 이 수준의 액세스가 더 이상 필요하지 않게 되므로 Global 관리istrator 계정에 대한 상승된 액세스를 제거해야 합니다.

Azure Portal에서 위임 변경 내용 보기

루트 범위에서 모니터링 리더 역할이 할당된 사용자는 Azure Portal에서 직접 위임 변경 내용을 볼 수 있습니다.

  1. 내 고객 페이지로 이동한 다음 왼쪽 탐색 메뉴에서 활동 로그를 선택합니다.
  2. 화면 위쪽의 필터에서 디렉터리 작업이 선택되어 있는지 확인합니다.

위임 변경 목록이 표시됩니다. 열 편집을 선택하여 상태, 이벤트 범주, 시간, 타임스탬프를 표시하거나 구독, 시작한 이벤트, 리소스 그룹, 리소스 종류리소스 값을 표시하거나 숨길 수 있습니다.

Screenshot of delegation changes in the Azure portal.

서비스 주체 계정을 사용하여 활동 로그 쿼리

루트 범위의 모니터링 판독기 역할은 매우 광범위한 액세스 수준이므로 서비스 주체 계정에 역할을 할당하고 해당 계정을 사용하여 아래 스크립트를 사용하여 데이터를 쿼리할 수 있습니다.

Important

현재 위임 작업이 많은 테넌트는 이 데이터를 쿼리할 때 오류가 발생할 수 있습니다.

서비스 주체 계정을 사용하여 활동 로그를 쿼리하는 경우 다음과 같은 모범 사례를 따르는 것이 좋습니다.

관리 테넌트의 루트 범위에 대한 모니터링 읽기 권한자 액세스 권한이 있는 새 서비스 주체 계정을 만든 후에는 이를 사용하여 테넌트의 위임 활동을 쿼리하고 보고할 수 있습니다.

이 Azure PowerShell 스크립트 를 사용하여 활동의 지난 날을 쿼리하고 추가되거나 제거된 위임(또는 성공하지 못한 시도)을 보고할 수 있습니다. 테넌트 활동 로그 데이터를 쿼리한 다음 다음 값을 생성하여 추가되거나 제거된 위임에 대해 보고합니다.

  • DelegatedResourceId: 위임된 구독 또는 리소스 그룹의 ID
  • CustomerTenantId: 고객 테넌트 ID
  • CustomerSubscriptionId: 위임되었거나 위임된 리소스 그룹이 포함된 구독 ID입니다.
  • CustomerDelegationStatus: 위임된 리소스에 대한 상태 변경(성공 또는 실패)
  • EventTimeStamp: 위임 변경이 로그된 날짜 및 시간

이 데이터를 쿼리할 때는 다음 사항을 염두에 두어야 합니다.

  • 단일 배포에서 여러 리소스 그룹을 위임하는 경우 각 리소스 그룹에 대해 별도의 항목이 반환됩니다.
  • 이전 위임에 대한 변경 내용(예: 권한 구조 업데이트)은 추가된 위임으로 로그됩니다.
  • 위에서 설명한 것처럼 이 테넌트 수준 데이터에 액세스하려면 계정에 루트 범위(/)에서 모니터링 판독기 Azure 기본 제공 역할이 있어야 합니다.
  • 이 데이터는 사용자 고유의 워크플로 및 보고에서 사용할 수 있습니다. 예를 들어 HTTP 데이터 수집기 API(미리 보기)를 사용하여 REST API 클라이언트에서 Azure Monitor에 데이터를 기록한 다음 작업 그룹을 사용하여 알림 또는 경고를 만들 수 있습니다.
# Log in first with Connect-AzAccount if you're not using Cloud Shell

# Azure Lighthouse: Query Tenant Activity Log for registered/unregistered delegations for the last 1 day

$GetDate = (Get-Date).AddDays((-1))

$dateFormatForQuery = $GetDate.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")

# Getting Azure context for the API call
$currentContext = Get-AzContext

# Fetching new token
$azureRmProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
$profileClient = [Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient]::new($azureRmProfile)
$token = $profileClient.AcquireAccessToken($currentContext.Tenant.Id)

$listOperations = @{
    Uri     = "https://management.azure.com/providers/microsoft.insights/eventtypes/management/values?api-version=2015-04-01&`$filter=eventTimestamp ge '$($dateFormatForQuery)'"
    Headers = @{
        Authorization  = "Bearer $($token.AccessToken)"
        'Content-Type' = 'application/json'
    }
    Method  = 'GET'
}
$list = Invoke-RestMethod @listOperations

# First link can be empty - and point to a next link (or potentially multiple pages)
# While you get more data - continue fetching and add result
while($list.nextLink){
    $list2 = Invoke-RestMethod $list.nextLink -Headers $listOperations.Headers -Method Get
    $data+=$list2.value;
    $list.nextLink = $list2.nextlink;
}

$showOperations = $data;

if ($showOperations.operationName.value -eq "Microsoft.Resources/tenants/register/action") {
    $registerOutputs = $showOperations | Where-Object -FilterScript { $_.eventName.value -eq "EndRequest" -and $_.resourceType.value -and $_.operationName.value -eq "Microsoft.Resources/tenants/register/action" }
    foreach ($registerOutput in $registerOutputs) {
        $eventDescription = $registerOutput.description | ConvertFrom-Json;
    $registerOutputdata = [pscustomobject]@{
        Event                    = "An Azure customer has registered delegated resources to your Azure tenant";
        DelegatedResourceId      = $eventDescription.delegationResourceId; 
        CustomerTenantId         = $eventDescription.subscriptionTenantId;
        CustomerSubscriptionId   = $eventDescription.subscriptionId;
        CustomerDelegationStatus = $registerOutput.status.value;
        EventTimeStamp           = $registerOutput.eventTimestamp;
        }
        $registerOutputdata | Format-List
    }
}
if ($showOperations.operationName.value -eq "Microsoft.Resources/tenants/unregister/action") {
    $unregisterOutputs = $showOperations | Where-Object -FilterScript { $_.eventName.value -eq "EndRequest" -and $_.resourceType.value -and $_.operationName.value -eq "Microsoft.Resources/tenants/unregister/action" }
    foreach ($unregisterOutput in $unregisterOutputs) {
        $eventDescription = $registerOutput.description | ConvertFrom-Json;
    $unregisterOutputdata = [pscustomobject]@{
        Event                    = "An Azure customer has unregistered delegated resources from your Azure tenant";
        DelegatedResourceId      = $eventDescription.delegationResourceId;
        CustomerTenantId         = $eventDescription.subscriptionTenantId;
        CustomerSubscriptionId   = $eventDescription.subscriptionId;
        CustomerDelegationStatus = $unregisterOutput.status.value;
        EventTimeStamp           = $unregisterOutput.eventTimestamp;
        }
        $unregisterOutputdata | Format-List
    }
}
else {
    Write-Output "No new delegation events for tenant: $($currentContext.Tenant.TenantId)"
}

다음 단계

  • Azure Lighthouse에 고객을 온보딩하는 방법을 알아봅니다.
  • Azure Monitor 및 Azure 활동 로그대해 알아봅니다.
  • Do기본 샘플 통합 문서를 검토하여 구독 간에 Azure 활동 로그를 표시하고 do기본 이름으로 필터링하는 옵션을 사용하는 방법을 알아봅니다.