タグとカスタム セキュリティ属性に基づいて BLOB への読み取りアクセスを許可する
この記事では、属性ベースのアクセス制御 (ABAC) 条件を使用して、BLOB インデックス タグとカスタム セキュリティ属性に基づいて BLOB への読み取りアクセスを許可する方法について説明します。 これにより、BLOB へのアクセスを管理しやすくなります。
前提条件
Microsoft Entra テナントにカスタム セキュリティ属性を割り当て、ロールの割り当て条件を追加するには、次のものが必要です。
重要
既定では、グローバル管理者とその他の管理者ロールには、カスタム セキュリティ属性の読み取り、定義、割り当てを行う権限がありません。 これらの前提条件を満たしていない場合は、条件エディターにプリンシパル/ユーザー属性が表示されません。
状態
この記事では、ユーザーが BLOB インデックス タグと一致するカスタム セキュリティ属性を持っている場合は、BLOB への読み取りアクセスを許可します。 これを行うには、ロールの割り当てに条件を追加します。
たとえば、Brenda が属性 Project=Baker
を持っている場合、Project=Baker
BLOB インデックス タグを持つ BLOB のみを読み取ることができます。 同様に、Chandra は Project=Cascade
を持つ BLOB のみを読み取ることができます。
条件をコードで示すと、次のようになります。
(
(
!(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: 新しいカスタム セキュリティ属性を追加する
Azure portal にサインインします。
[Microsoft Entra ID Custom security attributes]\(Microsoft Entra ID>カスタム セキュリティ属性\) をクリックします。
Baker
とCascade
の値を指定してProject
という名前の属性を追加します。 または既存の属性を使用します。 詳細については、「Microsoft Entra ID でカスタム セキュリティ属性を追加または非アクティブ化する」を参照してください。
手順 2: カスタム セキュリティ属性をユーザーに割り当てる
Microsoft Entra ID で、セキュリティ グループを作成します。
グループのメンバーとしてユーザーを追加します。
Cascade
の値を指定してProject
属性をユーザーに割り当てます。 詳細については、「ユーザーのカスタム セキュリティ属性を割り当て、更新、一覧表示、または削除」を参照してください。必ず [保存] をクリックして設定を保存してください。
手順 3: ストレージ タグと BLOB インデックス タグを設定する
BLOB インデックス タグ機能に対応したストレージ アカウントを作成します。 詳細については、「BLOB インデックス タグを使用して Azure BLOB データを管理および検索する」を参照してください。
ストレージ アカウント内に新しいコンテナーを作成し、[公開] となっているアクセス レベルを [プライベート (匿名アクセスなし)] に設定します。
認証の種類を [Azure AD ユーザー アカウント] に設定します。
テキスト ファイルをコンテナーにアップロードし、次の BLOB インデックス タグを設定します。
File Key 値 Baker テキスト ファイル プロジェクト Baker Cascade テキスト ファイル プロジェクト Cascade ヒント
BLOB インデックス タグに使用できる文字については、「BLOB インデックス タグの設定」をご覧ください。
手順 4: 条件を使用してストレージ BLOB データ閲覧者ロールを割り当てる
新しいタブを開き、Azure portal にサインインします。
ストレージ アカウントがあるリソース グループを開きます。
[アクセス制御 (IAM)] をクリックします。
[ロールの割り当て] タブをクリックして、このスコープのロールの割り当てを表示します。
[追加]>[ロールの割り当ての追加] をクリックします。
[ロール] タブで [ストレージ BLOB データ閲覧者] ロールを選択します。
[メンバー] タブで、先ほど作成したセキュリティ グループを選択します。
(省略可能) [説明] ボックスに「ユーザーが BLOB インデックス タグと一致するカスタム セキュリティ属性を持っている場合、BLOB への読み取りアクセス」と入力します。
[条件 (省略可能)] タブで [条件の追加] をクリックします。
[ロールの割り当て条件を追加する] ページが表示されます。
[アクションの追加] セクションで [アクションの追加] をクリックします。
[アクションの選択] ペインが表示されます。 条件を設定するロール割り当てに合わせて絞り込まれたデータ アクションのリストが、このペインに表示されます。
[Read a blob]\(BLOB の読み取り\) をクリックし、[選択] をクリックします。
[式の作成] セクションで [追加] をクリックします。
次の情報を入力します :
設定 値 Attribute source (属性ソース) プリンシパル 属性 <attributeset>_Project Operator StringEquals オプション 属性 Attribute source (属性ソース) リソース 属性 Blob index tags [Values in key] (BLOB インデックス タグ [キー内の値]) キー プロジェクト Note
プリンシパルが属性ソースのオプションとして一覧表示されていない場合は、「手順 1: 新しいカスタム セキュリティ属性を追加する」で前述したように、カスタム セキュリティ属性を定義していることを確認してください。
[エディターの種類] まで上方にスクロールし、 [コード] をクリックします。
条件は次のようになります。
( ( !(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$>] ) )
[保存] をクリックして条件を保存します。
[確認と割り当て] タブで [確認と割り当て] をクリックして、条件を使用してストレージ BLOB データ閲覧者ロールを割り当てます。
手順 5: 閲覧者ロールを割り当てる
前の手順を繰り返して、リソース グループのスコープでセキュリティ グループに閲覧者ロールを割り当てます。
Note
通常、閲覧者ロールを割り当てる必要はありません。 ここでは、Azure portal を使用して条件をテストできるようにするために行います。
手順 6: 条件をテストする
新しいウィンドウで、Azure Portal を開きます。
Project=Cascade
カスタム セキュリティ属性を使用して作成したユーザーとしてサインインします。作成したストレージ アカウントとコンテナーを開きます。
認証方法がアクセス キーではなく Azure AD ユーザー アカウントに設定されていることを確認します。
[Baker] テキスト ファイルをクリックします。
BLOB の表示やダウンロードはできず、認証に失敗したことを示すメッセージが表示されます。
Cascade テキスト ファイルをクリックします。
BLOB を表示してダウンロードできるようになります。
Azure PowerShell
Azure PowerShell を使用して、ロールの割り当て条件を追加することもできます。 次のコマンドは、条件を追加する方法を示しています。 詳細については、「 チュートリアル: Azure PowerShell を使用して BLOB へのアクセスを制限するロールの割り当て条件を追加する」を参照してください。
条件の追加
Connect-AzAccount コマンドを使用し、ディレクトリにロール ベースのアクセス制御 管理istrator としてサインインするように表示される指示に従います。
Connect-AzAccount
Get-AzRoleAssignment を使用して、セキュリティ グループに割り当てたロールの割り当てを取得します。
$groupRoleAssignment = Get-AzRoleAssignment -ObjectId <groupObjectId> -Scope <scope>
ロールの割り当てオブジェクトの
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`$>]))"
ロールの割り当てオブジェクトの
ConditionVersion
プロパティを設定します。$groupRoleAssignment.ConditionVersion = "2.0"
Set-AzRoleAssignment を使用して、ロールの割り当てを更新します。
Set-AzRoleAssignment -InputObject $groupRoleAssignment
条件をテストする
新しい PowerShell ウィンドウで、Connect-AzAccount コマンドを使用して、セキュリティ グループのメンバーとしてサインインします。
Connect-AzAccount
New-AzStorageContext を使用して、ストレージ アカウントのコンテキストを設定します。
$bearerCtx = New-AzStorageContext -StorageAccountName <accountName>
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. ...
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 へのアクセスを制限するロールの割り当て条件を追加する」を参照してください。
条件の追加
az login コマンドを使用し、ディレクトリにロール ベースのアクセス制御 管理istrator としてサインインするように表示される指示に従います。
az login
az role assignment list を使用して、セキュリティ グループに割り当てたロールの割り当てを取得します。
az role assignment list --assignee <groupObjectId> --scope <scope>
次の形式の 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" }
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$>]))",
conditionVersion
プロパティを更新します。"conditionVersion": "2.0",
az role assignment update を使用して、ロールの割り当てに条件を追加します。
az role assignment update --role-assignment "./path/roleassignment.json"
条件をテストする
新しいコマンド ウィンドウで、az login コマンドを使用して、セキュリティ グループのメンバーとしてサインインします。
az login
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. ...
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, ... }