مراقبة تغييرات التفويض في المستأجر الإداري

بصفتك مزود خدمة، قد ترغب في أن تكون على دراية عند تفويض اشتراكات العملاء أو مجموعات الموارد إلى المستأجر من خلال Azure Lighthouse، أو عند إزالة الموارد المفوضة مسبقا.

في إدارة المستأجر، يتتبع سجل نشاط Azure نشاط التفويض على مستوى المستأجر. يتضمن هذا النشاط المسجل أي تفويضات مضافة أو تمت إزالتها من مستأجري العملاء.

يشرح هذا الموضوع الأذونات اللازمة لمراقبة نشاط التفويض إلى المستأجر (عبر جميع عملائك). كما يتضمن نموذجا للبرنامج النصي يعرض طريقة واحدة للاستعلام عن هذه البيانات وإعداد التقارير عنها.

هام

يجب تنفيذ كل هذه الخطوات في المستأجر الإداري، وليس في أي مستأجر عميل.

على الرغم من أننا نشير إلى مزودي الخدمات والعملاء في هذا الموضوع ، إلا أن الشركات التي تدير مستأجرين متعددين يمكنها استخدام نفس العمليات.

تمكين الوصول إلى البيانات على مستوى المستأجر

للوصول إلى بيانات سجل النشاط على مستوى المستأجر، يجب تعيين حساب الدور المضمن في Azure "قارئ المراقبة" في نطاق الجذر (/). يجب تنفيذ هذا التعيين بواسطة مستخدم لديه دور المسؤول العمومي مع وصول مرتفع إضافي.

رفع مستوى الوصول لحساب مسؤول عمومي

لتعيين دور في نطاق الجذر (/)، ستحتاج إلى الحصول على دور المسؤول العمومي مع وصول مرتفع. يجب إضافة هذا الوصول المرتفع فقط عندما تحتاج إلى إجراء تعيين الدور، ثم إزالته عند الانتهاء.

للحصول على إرشادات مفصلة حول إضافة الارتفاع وإزالته، راجع ترقية الوصول لإدارة جميع اشتراكات Azure ومجموعات الإدارة.

بعد رفع مستوى وصولك، سيكون لحسابك دور مسؤول وصول المستخدم في Azure في نطاق الجذر. يسمح لك تعيين الدور هذا بعرض جميع الموارد وتعيين الوصول في أي اشتراك أو مجموعة إدارة في الدليل، بالإضافة إلى إجراء تعيينات الدور في نطاق الجذر.

تعيين دور "قارئ المراقبة" في نطاق الجذر

بمجرد رفع مستوى وصولك، يمكنك تعيين الأذونات المناسبة لحساب حتى يتمكن من الاستعلام عن بيانات سجل النشاط على مستوى المستأجر. سيحتاج هذا الحساب إلى تعيين دور Azure المضمن في Monitoring Reader في النطاق الجذري للمستأجر الإداري.

هام

يعني منح تعيين دور في نطاق الجذر أن نفس الأذونات ستنطبق على كل مورد في المستأجر. نظرا لأن هذا مستوى واسع من الوصول، نوصي بتعيين هذا الدور إلى حساب أساسي للخدمة واستخدام هذا الحساب للاستعلام عن البيانات.

يمكنك أيضا تعيين دور "قارئ المراقبة" في النطاق الجذري للمستخدمين الفرديين أو لمجموعات المستخدمين حتى يتمكنوا من عرض معلومات التفويض مباشرة في مدخل Azure. إذا قمت بذلك ، فاعلم أن هذا مستوى واسع من الوصول يجب أن يقتصر على أقل عدد ممكن من المستخدمين.

استخدم إحدى الطرق التالية لإجراء تعيين نطاق الجذر.

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 "/"

إزالة الوصول المرتفع لحساب المسؤول العمومي

بعد تعيين دور "قارئ المراقبة" في نطاق الجذر إلى الحساب المطلوب، تأكد من إزالة الوصول المرتفع لحساب "المسؤول العمومي"، حيث لن تكون هناك حاجة إلى هذا المستوى من الوصول.

عرض تغييرات التفويض في مدخل Azure

يمكن للمستخدمين الذين تم تعيينهم لدور "قارئ المراقبة" في نطاق الجذر عرض تغييرات التفويض مباشرة في مدخل Azure.

  1. انتقل إلى صفحة عملائي ، ثم حدد سجل النشاط من قائمة التنقل اليمنى.
  2. تأكد من تحديد نشاط الدليل في عامل التصفية بالقرب من أعلى الشاشة.

ستظهر قائمة بتغييرات التفويض. يمكنك تحديد تحرير الأعمدة لإظهار أو إخفاء قيم الحالةوفئة الحدثوالوقتوالطابع الزمنيوالاشتراكوالحدث الذي بدأتهمجموعة المواردونوع الموردوالمورد .

Screenshot of delegation changes in the Azure portal.

استخدام حساب أساسي للخدمة للاستعلام عن سجل الأنشطة

نظرا لأن دور "قارئ المراقبة" في نطاق الجذر يمثل مستوى واسعا من الوصول، فقد ترغب في تعيين الدور إلى حساب أساسي للخدمة واستخدام هذا الحساب للاستعلام عن البيانات باستخدام البرنامج النصي أدناه.

هام

في الوقت الحالي، قد يواجه المستأجرون الذين لديهم قدر كبير من نشاط التفويض أخطاء عند الاستعلام عن هذه البيانات.

عند استخدام حساب أساسي للخدمة للاستعلام عن سجل الأنشطة، نوصي باتباع أفضل الممارسات التالية:

بمجرد إنشاء حساب أساسي جديد للخدمة مع وصول "قارئ المراقبة" إلى النطاق الجذر للمستأجر الإداري، يمكنك استخدامه للاستعلام عن نشاط التفويض في المستأجر والإبلاغ عنه.

يمكن استخدام هذا البرنامج النصي Azure PowerShell للاستعلام عن آخر 1 يوم من النشاط وإعداد التقارير عن أي تفويضات تمت إضافتها أو إزالتها (أو المحاولات التي لم تنجح). يقوم بالاستعلام عن بيانات سجل نشاط المستأجر ، ثم يقوم بإنشاء القيم التالية للإبلاغ عن التفويضات التي تمت إضافتها أو إزالتها:

  • معرف الموارد المفوض: معرف الاشتراك المفوض أو مجموعة الموارد المفوضة
  • CustomerTenantId: معرف المستأجر العميل
  • CustomerSubscriptionId: معرف الاشتراك الذي تم تفويضه أو الذي يحتوي على مجموعة الموارد التي تم تفويضها
  • CustomerDelegationStatus: تغيير حالة المورد المفوض (ناجح أو فاشل)
  • EventTimeStamp: التاريخ والوقت الذي تم فيه تسجيل تغيير التفويض

عند الاستعلام عن هذه البيانات، ضع في اعتبارك ما يلي:

  • إذا تم تفويض مجموعات موارد متعددة في عملية نشر واحدة، إرجاع إدخالات منفصلة لكل مجموعة موارد.
  • سيتم تسجيل التغييرات التي تم إجراؤها على تفويض سابق (مثل تحديث بنية الأذونات) كتفويض مضاف.
  • كما هو مذكور أعلاه، يجب أن يكون للحساب دور Azure المضمن في Monitoring Reader Azure في نطاق الجذر (/) للوصول إلى هذه البيانات على مستوى المستأجر.
  • يمكنك استخدام هذه البيانات في مهام سير العمل وإعداد التقارير الخاصة بك. على سبيل المثال، يمكنك استخدام واجهة برمجة تطبيقات HTTP Data Collector (المعاينة العامة) لتسجيل البيانات إلى Azure Monitor من عميل واجهة برمجة تطبيقات REST، ثم استخدام مجموعات الإجراءات لإنشاء إعلامات أو تنبيهات.
# 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)"
}

الخطوات التالية