チュートリアル: Azure PowerShell を使用してロールの割り当て条件を追加し、BLOB へのアクセスを制限する

ほとんどの場合、ロールの割り当てを使えば Azure リソースに必要なアクセス許可が付与されます。 しかし、さらにきめ細かなアクセス制御をしたい局面が出てくることもあるでしょう。そのような場合には、ロールの割り当て条件を追加します。

このチュートリアルでは、以下の内容を学習します。

  • ロールの割り当てに条件を追加する
  • BLOB インデックス タグに基づいて BLOB に対するアクセスを制限する

重要

Azure 属性ベースのアクセス制御 (Azure ABAC) は、ストレージ アカウントの Standard と Premium 両方のパフォーマンス レベルで、requestresourceenvironmentprincipal を使用して Azure Blob Storage、Azure Data Lake Storage Gen2、Azure キューへのアクセスを制御するために一般提供 (GA) されています。 現在、コンテナー メタデータ リソース属性とリスト BLOB インクルード要求属性はプレビュー段階です。 Azure Storage の ABAC の完全な機能状態情報については、「Azure Storage の条件機能の状態」を参照してください。

ベータ版、プレビュー版、または一般提供としてまだリリースされていない Azure の機能に適用される法律条項については、「Microsoft Azure プレビューの追加使用条件」を参照してください。

前提条件

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

条件

このチュートリアルでは、特定のタグが設定されている BLOB に対するアクセスを制限します。 たとえば、Chandra が読み取ることができるファイルを Project=Cascade というタグが設定されているものだけにするような条件を、ロールの割り当てに追加します。

条件を設定したロールの割り当ての図。

Project=Cascade タグの設定されていない BLOB を Chandra で読み取ろうとしても、アクセスが許可されません。

Project=Cascade タグが設定されている BLOB に対する読み取りアクセスを示した図。

条件をコードで示すと、次のようになります。

(
    (
        !(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'
    )
)

手順 1: 前提条件をインストールする

  1. PowerShell ウィンドウを開きます。

  2. Get-InstalledModule を使用して、インストール済みのモジュールのバージョンを確認します。

    Get-InstalledModule -Name Az
    Get-InstalledModule -Name Az.Resources
    Get-InstalledModule -Name Az.Storage
    
  3. 必要であれば、Install-Module を使用して、必要なバージョンのモジュール (AzAz.ResourcesAz.Storage の 3 つ) をインストールします。

    Install-Module -Name Az -RequiredVersion 5.5.0
    Install-Module -Name Az.Resources -RequiredVersion 3.2.1
    Install-Module -Name Az.Storage -RequiredVersion 2.5.2-preview -AllowPrerelease
    
  4. PowerShell をいったん閉じてから開き直し、セッションを更新します。

手順 2 - Azure にサインインする

  1. Connect-AzAccount コマンドを実行し、表示された手順に従ってユーザー アクセス管理者または所有者としてディレクトリにサインインします。

    Connect-AzAccount
    
  2. Get-AzSubscription を使用して、サブスクリプションの一覧を表示します。

    Get-AzSubscription
    
  3. サブスクリプション ID を決め、変数を初期化します。

    $subscriptionId = "<subscriptionId>"
    
  4. そのサブスクリプションを、アクティブなサブスクリプションとして設定します。

    $context = Get-AzSubscription -SubscriptionId $subscriptionId
    Set-AzContext $context
    

手順 3 - ユーザーを作成する

  1. New-MgUser を使用してユーザーを作成するか、既存のユーザーを探します。 このチュートリアルでは、例として Chandra を使用しています。

  2. ユーザーのオブジェクト ID の変数を初期化します。

    $userObjectId = "<userObjectId>"
    

手順 4: ストレージを設定する

  1. New-AzStorageAccount を使用して、BLOB インデックス機能に対応したストレージ アカウントを作成します。 詳細については、「BLOB インデックス タグを使用して Azure BLOB データを管理および検索する」を参照してください。

  2. New-AzStorageContainer を使用してストレージ アカウント内に新しい BLOB コンテナーを作成し、匿名アクセス レベルを [プライベート (匿名アクセスなし)] に設定します。

  3. Set-AzStorageBlobContent を使用してコンテナーにテキスト ファイルをアップロードします。

  4. そのテキストファイルに、次の BLOB インデックス タグを追加します。 詳細については、「BLOB インデックス タグを使用して Azure Blob Storage でデータを管理および検索する」を参照してください。

    Note

    BLOB ではほかにも、ユーザー定義による任意のキー値メタデータを格納する機能がサポートされています。 メタデータと BLOB インデックス タグはよく似ていますが、条件では BLOB インデックス タグを使用する必要があります。

    キー
    Project Cascade
  5. コンテナーに 2 つめのテキスト ファイルをアップロードします。

  6. 2 つめのテキストファイルには、次の BLOB インデックス タグを追加します。

    キー
    Project Baker
  7. 次の変数を、使用した名前で初期化します。

    $resourceGroup = "<resourceGroup>"
    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameCascade = "<blobNameCascade>"
    $blobNameBaker = "<blobNameBaker>"
    

手順 5: 条件を設定したロールを割り当てる

  1. ストレージ BLOB データ閲覧者ロールの変数を初期化します。

    $roleDefinitionName = "Storage Blob Data Reader"
    $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. リソース グループのスコープを初期化します。

    $scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. 条件を初期化します。

    $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'))"
    

    PowerShell では、条件にドル記号 ($) が含まれている場合は、その前にバッククォート (`) を付ける必要があります。 たとえば、この条件ではタグ キー名を示すためにドル記号を使用しています。

  4. 条件のバージョンと説明を初期化します。

    $conditionVersion = "2.0"
    $description = "Read access to blobs with the tag Project=Cascade"
    
  5. New-AzRoleAssignment を使用して、条件を設定したストレージ BLOB データ閲覧者ロールを、リソース グループのスコープ内のユーザーに割り当てます。

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

    出力の例を次に示します。

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'))
    

手順 6: (省略可能) Azure portal で条件を表示する

  1. Azure portal で、リソース グループを開きます。

  2. [アクセス制御 (IAM)] を選択します。

  3. [ロールの割り当て] タブで、ロールの割り当てを探します。

  4. [条件] 列で [表示または編集] を選択すると、条件が表示されます。

Azure portal 内の [ロールの割り当て条件を追加する] のスクリーンショット。

手順 7: 条件をテストする

  1. 新しい PowerShell ウィンドウを開きます。

  2. Connect-AzAccount を使用して、Chandra としてサインインします。

    Connect-AzAccount
    
  3. 次の変数を、使用した名前で初期化します。

    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameBaker = "<blobNameBaker>"
    $blobNameCascade = "<blobNameCascade>"
    
  4. New-AzStorageContext を使用して、ストレージ アカウントにもっと簡単にアクセスするための特殊なコンテキストを作成します。

    $bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
    
  5. Get-AzStorageBlob を使用して、Baker プロジェクトに関連するファイルの読み取りを試します。

    Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Context $bearerCtx 
    

    出力の例を次に示します。 追加した条件が原因となってファイルを読み取ることができないことがわかります。

    Get-AzStorageBlob : This request is not authorized to perform this operation using this permission. HTTP Status Code:
    403 - HTTP Error Message: This request is not authorized to perform this operation using this permission.
    ErrorCode: AuthorizationPermissionMismatch
    ErrorMessage: This request is not authorized to perform this operation using this permission.
    RequestId: <requestId>
    Time: Sat, 24 Apr 2021 13:26:25 GMT
    At line:1 char:1
    + Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Con ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : CloseError: (:) [Get-AzStorageBlob], StorageException
        + FullyQualifiedErrorId : StorageException,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.GetAzureStorageBlob
       Command
    
  6. Cascade プロジェクトに関連するファイルを読み取ります。

    Get-AzStorageBlob -Container $containerName -Blob $blobNameCascade -Context $bearerCtx 
    

    出力の例を次に示します。 ファイルに Project=Cascade タグが設定されているため、読み取ることができます。

       AccountName: <storageAccountName>, ContainerName: <containerName>
    
    Name                 BlobType  Length          ContentType                    LastModified         AccessTier SnapshotT
                                                                                                                  ime
    ----                 --------  ------          -----------                    ------------         ---------- ---------
    CascadeFile.txt      BlockBlob 7               text/plain                     2021-04-24 05:35:24Z Hot
    

手順 8: (省略可能) 条件を編集する

  1. もう一方の PowerShell ウィンドウで Get-AzRoleAssignment を使用して、追加したロールの割り当てを取得します。

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. 条件を編集します。

    $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' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Baker'))"
    
  3. 条件と説明を初期化します。

    $testRa.Condition = $condition
    $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
    
  4. Set-AzRoleAssignment を使用して、ロールの割り当ての条件を更新します。

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    出力の例を次に示します。

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade or Project=Baker
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' OR @Resource[Microsoft.S
                         torage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
                         StringEquals 'Baker'))
    

手順 9: リソースをクリーンアップする

  1. Remove-AzRoleAssignment を使用して、追加したロールの割り当てと条件を削除します。

    Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
    
  2. 作成したストレージ アカウントを削除します。

  3. 作成したユーザーを削除します。

次の手順