タグとカスタム セキュリティ属性に基づいて BLOB への読み取りアクセスを許可する

この記事では、属性ベースのアクセス制御 (ABAC) 条件を使用して、BLOB インデックス タグとカスタム セキュリティ属性に基づいて BLOB への読み取りアクセスを許可する方法について説明します。 これにより、BLOB へのアクセスを管理しやすくなります。

前提条件

Microsoft Entra テナントにカスタム セキュリティ属性を割り当て、ロールの割り当て条件を追加するには、次のものが必要です。

重要

既定では、グローバル管理者とその他の管理者ロールには、カスタム セキュリティ属性の読み取り、定義、割り当てを行う権限がありません。 これらの前提条件を満たしていない場合は、条件エディターにプリンシパル/ユーザー属性が表示されません。

状態

この記事では、ユーザーが BLOB インデックス タグと一致するカスタム セキュリティ属性を持っている場合は、BLOB への読み取りアクセスを許可します。 これを行うには、ロールの割り当てに条件を追加します。

Diagram of role assignment with a condition.

たとえば、Brenda が属性 Project=Baker を持っている場合、Project=Baker BLOB インデックス タグを持つ BLOB のみを読み取ることができます。 同様に、Chandra は Project=Cascade を持つ BLOB のみを読み取ることができます。

Diagram showing read access to blobs based on tags and custom security attributes.

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

(
 (
  !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
 )
 OR 
 (
  @Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
 )
)

条件の詳細については、「Azure 属性ベースのアクセス制御 (Azure ABAC)とは」を参照してください

手順 1: 新しいカスタム セキュリティ属性を追加する

  1. Azure portal にサインインします。

  2. [Microsoft Entra ID Custom security attributes]\(Microsoft Entra ID>カスタム セキュリティ属性\) をクリックします。

  3. BakerCascade の値を指定して Project という名前の属性を追加します。 または既存の属性を使用します。 詳細については、「Microsoft Entra ID でカスタム セキュリティ属性を追加または非アクティブ化する」を参照してください。

    Screenshot of adding a custom security attribute.

手順 2: カスタム セキュリティ属性をユーザーに割り当てる

  1. Microsoft Entra ID で、セキュリティ グループを作成します。

  2. グループのメンバーとしてユーザーを追加します。

  3. Cascade の値を指定して Project 属性をユーザーに割り当てます。 詳細については、「ユーザーのカスタム セキュリティ属性を割り当て、更新、一覧表示、または削除」を参照してください。

    Screenshot of assigning a custom security attribute.

  4. 必ず [保存] をクリックして設定を保存してください。

手順 3: ストレージ タグと BLOB インデックス タグを設定する

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

  2. ストレージ アカウント内に新しいコンテナーを作成し、[公開] となっているアクセス レベル[プライベート (匿名アクセスなし)] に設定します。

  3. 認証の種類を [Azure AD ユーザー アカウント] に設定します。

  4. テキスト ファイルをコンテナーにアップロードし、次の BLOB インデックス タグを設定します。

    File Key
    Baker テキスト ファイル プロジェクト Baker
    Cascade テキスト ファイル プロジェクト Cascade

    ヒント

    BLOB インデックス タグに使用できる文字については、「BLOB インデックス タグの設定」をご覧ください。

手順 4: 条件を使用してストレージ BLOB データ閲覧者ロールを割り当てる

  1. 新しいタブを開き、Azure portal にサインインします。

  2. ストレージ アカウントがあるリソース グループを開きます。

  3. [アクセス制御 (IAM)] をクリックします。

  4. [ロールの割り当て] タブをクリックして、このスコープのロールの割り当てを表示します。

  5. [追加]>[ロールの割り当ての追加] をクリックします。

  6. [ロール] タブで [ストレージ BLOB データ閲覧者] ロールを選択します。

  7. [メンバー] タブで、先ほど作成したセキュリティ グループを選択します。

  8. (省略可能) [説明] ボックスに「ユーザーが BLOB インデックス タグと一致するカスタム セキュリティ属性を持っている場合、BLOB への読み取りアクセス」と入力します。

  9. [条件 (省略可能)] タブで [条件の追加] をクリックします。

    [ロールの割り当て条件を追加する] ページが表示されます。

  10. [アクションの追加] セクションで [アクションの追加] をクリックします。

    [アクションの選択] ペインが表示されます。 条件を設定するロール割り当てに合わせて絞り込まれたデータ アクションのリストが、このペインに表示されます。

  11. [Read a blob]\(BLOB の読み取り\) をクリックし、[選択] をクリックします。

  12. [式の作成] セクションで [追加] をクリックします。

  13. 次の情報を入力します :

    設定
    Attribute source (属性ソース) プリンシパル
    属性 <attributeset>_Project
    Operator StringEquals
    オプション 属性
    Attribute source (属性ソース) リソース
    属性 Blob index tags [Values in key] (BLOB インデックス タグ [キー内の値])
    キー プロジェクト

    Note

    プリンシパルが属性ソースのオプションとして一覧表示されていない場合は、「手順 1: 新しいカスタム セキュリティ属性を追加する」で前述したように、カスタム セキュリティ属性を定義していることを確認してください。

    Screenshot of condition using principal attribute displayed in visual editor.

  14. [エディターの種類] まで上方にスクロールし、 [コード] をクリックします。

    条件は次のようになります。

    (
     (
      !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
     )
     OR 
     (
      @Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
     )
    )
    
  15. [保存] をクリックして条件を保存します。

  16. [確認と割り当て] タブで [確認と割り当て] をクリックして、条件を使用してストレージ BLOB データ閲覧者ロールを割り当てます。

手順 5: 閲覧者ロールを割り当てる

  • 前の手順を繰り返して、リソース グループのスコープでセキュリティ グループに閲覧者ロールを割り当てます。

    Note

    通常、閲覧者ロールを割り当てる必要はありません。 ここでは、Azure portal を使用して条件をテストできるようにするために行います。

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

  1. 新しいウィンドウで、Azure Portal を開きます。

  2. Project=Cascade カスタム セキュリティ属性を使用して作成したユーザーとしてサインインします。

  3. 作成したストレージ アカウントとコンテナーを開きます。

  4. 認証方法がアクセス キーではなく Azure AD ユーザー アカウントに設定されていることを確認します。

    Screenshot of storage container with test files.

  5. [Baker] テキスト ファイルをクリックします。

    BLOB の表示やダウンロードはできず、認証に失敗したことを示すメッセージが表示されます。

  6. Cascade テキスト ファイルをクリックします。

    BLOB を表示してダウンロードできるようになります。

Azure PowerShell

Azure PowerShell を使用して、ロールの割り当て条件を追加することもできます。 次のコマンドは、条件を追加する方法を示しています。 詳細については、「 チュートリアル: Azure PowerShell を使用して BLOB へのアクセスを制限するロールの割り当て条件を追加する」を参照してください。

条件の追加

  1. Connect-AzAccount コマンドを使用し、ディレクトリにロール ベースのアクセス制御 管理istrator としてサインインするように表示される指示に従います。

    Connect-AzAccount
    
  2. Get-AzRoleAssignment を使用して、セキュリティ グループに割り当てたロールの割り当てを取得します。

    $groupRoleAssignment = Get-AzRoleAssignment -ObjectId <groupObjectId> -Scope <scope>
    
  3. ロールの割り当てオブジェクトの Condition プロパティを設定します。 必ず属性セット名を使用してください。

    $groupRoleAssignment.Condition="((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>]))"
    
  4. ロールの割り当てオブジェクトの ConditionVersion プロパティを設定します。

    $groupRoleAssignment.ConditionVersion = "2.0"
    
  5. Set-AzRoleAssignment を使用して、ロールの割り当てを更新します。

    Set-AzRoleAssignment -InputObject $groupRoleAssignment
    

条件をテストする

  1. 新しい PowerShell ウィンドウで、Connect-AzAccount コマンドを使用して、セキュリティ グループのメンバーとしてサインインします。

    Connect-AzAccount
    
  2. New-AzStorageContext を使用して、ストレージ アカウントのコンテキストを設定します。

    $bearerCtx = New-AzStorageContext -StorageAccountName <accountName>
    
  3. Get-AzStorageBlob を使用して、Baker ファイルの読み取りを試します。

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

    BLOB を読み取ることはできず、認証に失敗したというメッセージが表示されるはずです。

    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.
    ...
    
  4. Get-AzStorageBlob を使用して、Cascade ファイルの読み取りを試します。

    Get-AzStorageBlob -Container <containerName> -Blob <blobNameCascade> -Context $bearerCtx
    You should be able to read the blob.
    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
    

Azure CLI

Azure CLI を使用して、ロールの割り当て条件を追加することもできます。 次のコマンドは、条件を追加する方法を示しています。 詳細については、「 チュートリアル: Azure CLI を使用して BLOB へのアクセスを制限するロールの割り当て条件を追加する」を参照してください。

条件の追加

  1. az login コマンドを使用し、ディレクトリにロール ベースのアクセス制御 管理istrator としてサインインするように表示される指示に従います。

    az login
    
  2. az role assignment list を使用して、セキュリティ グループに割り当てたロールの割り当てを取得します。

    az role assignment list --assignee <groupObjectId> --scope <scope>
    
  3. 次の形式の JSON ファイルを作成します。

    {
        "canDelegate": null,
        "condition": "",
        "conditionVersion": "",
        "description": "",
        "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
        "name": "{roleAssignmentId}",
        "principalId": "{groupObjectId}",
        "principalName": "{principalName}",
        "principalType": "Group",
        "resourceGroup": "{resourceGroup}",
        "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
        "roleDefinitionName": "Storage Blob Data Reader",
        "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
        "type": "Microsoft.Authorization/roleAssignments"
    }
    
  4. condition プロパティを更新します。 必ず属性セット名を使用してください。

    "condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]))",
    
  5. conditionVersion プロパティを更新します。

    "conditionVersion": "2.0",
    
  6. az role assignment update を使用して、ロールの割り当てに条件を追加します。

    az role assignment update --role-assignment "./path/roleassignment.json"
    

条件をテストする

  1. 新しいコマンド ウィンドウで、az login コマンドを使用して、セキュリティ グループのメンバーとしてサインインします。

    az login
    
  2. az storage blob show を使用して、Bake ファイルのプロパティの読み取りを試します。

    az storage blob show --account-name <storageAccountName> --container-name <containerName> --name <blobNameBaker> --auth-mode login
    

    BLOB を読み取ることはできず、認証に失敗したというメッセージが表示されるはずです。

    You do not have the required permissions needed to perform this operation.
    ...
    
  3. az storage blob show を使用して、Cascade ファイルのプロパティの読み取りを試します。

    az storage blob show --account-name <storageAccountName> --container-name <containerName> --name <blobNameCascade> --auth-mode login
    You should be able to read the blob.
    {
      "container": "<containerName>",
      "content": "",
      "deleted": false,
      "encryptedMetadata": null,
      "encryptionKeySha256": null,
      "encryptionScope": null,
    ...
    }
    

次のステップ