إضافة شروط تعيين دور Azure أو تحريرها باستخدام Azure PowerShell

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

المتطلبات الأساسية

للحصول على معلومات حول المتطلبات الأساسية لإضافة شروط تعيين الدور أو تحريرها، انظر الشروط المطلوبة.

إضافة شرط

لإضافة شرط تعيين دور، استخدم New-AzRoleAssignment. يتضمن الأمر New-AzRoleAssignment المعلمات التالية المتعلقة بالشروط.

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

يوضح المثال التالي كيفية تهيئة المتغيرات لتعيين دور Storage Blob Data Reader بشرط. يتحقق الشرط ما إذا كان اسم الحاوية يساوي "blobs-example-container".

$subscriptionId = "<subscriptionId>"
$resourceGroup = "<resourceGroup>"
$roleDefinitionName = "Storage Blob Data Reader"
$roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
$userObjectId = "<userObjectId>"
$scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
$description = "Read access if container name equals blobs-example-container"
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'))"
$conditionVersion = "2.0"

استخدم New-AzRoleAssignment لتعيين الدور بشرط.

New-AzRoleAssignment -ObjectId $userObjectId -Scope $scope -RoleDefinitionId $roleDefinitionId -Description $description -Condition $condition -ConditionVersion $conditionVersion

فيما يلي مثال على الإخراج:

RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
DisplayName        : User1
SignInName         : user1@contoso.com
RoleDefinitionName : Storage Blob Data Reader
RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
ObjectId           : <userObjectId>
ObjectType         : User
CanDelegate        : False
Description        : Read access if container name equals blobs-example-container
ConditionVersion   : 2.0
Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'))

في PowerShell، إذا كانت حالتك تتضمن علامة الدولار ($)، يجب أن تسبقها بعلامة خلفية (`). على سبيل المثال، يستخدم الشرط التالي علامات الدولار لتحديد اسم مفتاح العلامة. لمزيد من المعلومات حول قواعد علامات الاقتباس في PowerShell، راجع حول قواعد الاقتباس.

$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Cascade'))"

تحرير شرط

لتحرير شرط تعيين دور موجود، استخدم Set-AzRoleAssignment. يمكن تحرير الخصائص ConditionConditionVersionو و Description فقط. -PassThru تتسبب المعلمة Set-AzRoleAssignment في إرجاع تعيين الدور المحدث، والذي يسمح بالتصور أو التخزين في متغير لمزيد من الاستخدام.

هناك طريقتان لتحرير شرط. يمكنك استخدام PSRoleAssignment الكائن أو ملف JSON.

تحرير شرط باستخدام كائن PSRoleAssignment

  1. استخدم Get-AzRoleAssignment للحصول على تعيين الدور الموجود بشرط ككائن PSRoleAssignment .

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. تعديل الشرط.

    $condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))"
    
  3. تهيئة الشرط والوصف.

    $testRa.Condition = $condition
    $testRa.Description = "Read access if container name equals blobs-example-container or blobs-example-container2"
    
  4. استخدم Set-AzRoleAssignment لتحديث شرط تعيين الدور.

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    فيما يلي مثال على الإخراج:

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : User1
    SignInName         : user1@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access if container name equals blobs-example-container or blobs-example-container2
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))
    

تحرير شرط باستخدام ملف JSON

لتحرير شرط، يمكنك أيضا توفير ملف JSON كمدخل. يظهر التالي مثالا لملف JSON حيث Condition يتم تحديثه.Description يجب تحديد كافة الخصائص في ملف JSON لتحديث شرط.

{
    "RoleDefinitionId": "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
    "ObjectId": "<userObjectId>",
    "ObjectType": "User",
    "Scope": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>",
    "Condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))",
    "ConditionVersion": "2.0",
    "CanDelegate": false,
    "Description": "Read access if container name equals blobs-example-container or blobs-example-container2",
    "RoleAssignmentId": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>"
}

استخدم Set-AzRoleAssignment لتحديث شرط تعيين الدور.

Set-AzRoleAssignment -InputFile "C:\path\roleassignment.json" -PassThru

فيما يلي مثال على الإخراج:

RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
DisplayName        : User1
SignInName         : user1@contoso.com
RoleDefinitionName : Storage Blob Data Reader
RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
ObjectId           : <userObjectId>
ObjectType         : User
CanDelegate        : False
Description        : Read access if container name equals blobs-example-container or blobs-example-container2
ConditionVersion   : 2.0
Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))

تحرير الشروط في تعيينات أدوار متعددة

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

  • البحث عن تعيينات الأدوار في اشتراك مع <find-condition-string-1> أو <find-condition-string-2> سلاسل في الشرط.

    $tenantId = "<your-tenant-id>"
    $subscriptionId = "<your-subscription-id>";
    $scope = "/subscriptions/$subscriptionId"
    $findConditionString1 = "<find-condition-string-1>"
    $findConditionString2 = "<find-condition-string-2>"
    Connect-AzAccount -TenantId $tenantId -SubscriptionId $subscriptionId
    $roleAssignments = Get-AzRoleAssignment -Scope $scope
    $foundRoleAssignments = $roleAssignments | Where-Object { ($_.Condition -Match $findConditionString1) -Or ($_.Condition -Match $findConditionString2) }
    

تنفذ الأوامر التالية المهام التالية:

  • في حالة تعيينات الدور التي تم العثور عليها، يستبدل <condition-string> ب <replace-condition-string>.

  • التحديثات تعيينات الدور مع التغييرات.

    $conditionString = "<condition-string>"
    $conditionStringReplacement = "<condition-string-replacement>"
    $updatedRoleAssignments = $foundRoleAssignments | ForEach-Object { $_.Condition = $_.Condition -replace $conditionString, $conditionStringReplacement; $_ }
    $updatedRoleAssignments | ForEach-Object { Set-AzRoleAssignment -InputObject $_ -PassThru }
    

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

سرد شرط

لسرد شرط تعيين دور، استخدم Get-AzRoleAssignment. لمزيد من المعلومات، راجع سرد تعيينات دور Azure باستخدام Azure PowerShell.

حذف شرط

لحذف شرط تعيين دور، قم بتحرير شرط تعيين الدور وتعيين الخاصيتين Condition و ConditionVersion إما إلى سلسلة فارغة ("") أو $null.

بدلا من ذلك، إذا كنت تريد حذف كل من تعيين الدور والشرط، يمكنك استخدام الأمر Remove-AzRoleAssignment . لمزيد من المعلومات، راجع إزالة تعيينات دور Azure.

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