Azure PowerShell を使用して Azure ロールの割り当て条件を追加または編集する

Azure ロール割り当ての条件は、必要に応じてロール割り当てに追加し、細かなアクセス制御を行うことで、安全確認を強化するための仕組みです。 たとえば、特定のタグが設定されたオブジェクトしか読み取れない、という条件を設定できます。 この記事では、Azure PowerShell を使用して、ロールの割り当ての条件を追加、編集、一覧表示、または削除する方法について説明します。

前提条件

ロールの割り当て条件を追加または編集するための前提条件の詳細については、条件の前提条件に関するページを参照してください。

条件の追加

ロールの割り当て条件を追加するには、New-AzRoleAssignment を使用します。 New-AzRoleAssignment コマンドには、条件に関連する次のパラメーターが含まれています。

パラメーター 説明
Condition String ユーザーにアクセス許可を付与できる条件。
ConditionVersion String 条件構文のバージョン。 2.0 に設定されている必要があります。 Condition を指定した場合は、ConditionVersion も指定する必要があります。

次の例は、変数を初期化して、条件付きのストレージ BLOB データ 閲覧者ロールを割り当てる方法を示しています。 この条件は、コンテナー名が 'blob-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 を使用します。 編集できるのは、ConditionConditionVersionDescription のプロパティのみです。 -PassThru パラメーターを指定すると、Set-AzRoleAssignment により更新されたロールの割り当てが返されます。これにより、視覚化やさらに使用するための変数内への格納が可能になります。

条件を編集するには、2 つの方法があります。 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 ファイルを入力として指定することもできます。 ConditionDescription が更新される JSON ファイルの例を次に示します。 条件を更新するには、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 PowerShell を使用して Azure でのロールの割り当てを一覧表示する」を参照してください。

条件の削除

ロールの割り当て条件を削除するには、ロールの割り当て条件を編集し、ConditionConditionVersion の両方のプロパティを空の文字列 ("") または $null に設定します。

また、ロールの割り当てとその条件の両方を削除する場合は、Remove-AzRoleAssignment コマンドを使用できます。 詳細については、「Azure ロールの割り当ての削除」を参照してください。

次のステップ