チュートリアル: Azure CLI を使用してロールの割り当て条件を追加し、BLOB へのアクセスを制限する
ほとんどの場合、ロールの割り当てを使えば Azure リソースに必要なアクセス許可が付与されます。 しかし、さらにきめ細かなアクセス制御をしたい局面が出てくることもあるでしょう。そのような場合には、ロールの割り当て条件を追加します。
このチュートリアルでは、以下の内容を学習します。
- ロールの割り当てに条件を追加する
- BLOB インデックス タグに基づいて BLOB に対するアクセスを制限する
重要
Azure 属性ベースのアクセス制御 (Azure ABAC) は、ストレージ アカウントの Standard と Premium 両方のパフォーマンス レベルで、request
、resource
、environment
、principal
を使用して 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 で読み取ろうとしても、アクセスが許可されません。
条件をコードで示すと、次のようになります。
(
(
!(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 - Azure にサインインする
az login コマンドを実行し、表示された手順に従ってユーザー アクセス管理者または所有者としてディレクトリにサインインします。
az login
az account show を使用して、サブスクリプションの ID を取得します。
az account show
サブスクリプション ID を決め、変数を初期化します。
subscriptionId="<subscriptionId>"
手順 2 - ユーザーを作成する
Az ad user create を使用してユーザーを作成するか、既存のユーザーを探します。 このチュートリアルでは、例として Chandra を使用しています。
ユーザーのオブジェクト ID の変数を初期化します。
userObjectId="<userObjectId>"
手順 3: ストレージを設定する
Blob Storage へのアクセスは、Azure CLI から Microsoft Entra ID の資格情報を使用するか、またはストレージ アカウントのアクセス キーを使用して承認することができます。 この記事では、Microsoft Entra ID を使用して、Blob Storage の操作を承認する方法について説明します。 詳細については、「クイックスタート:Azure CLI を使用して BLOB を作成、ダウンロード、一覧表示する」を参照してください。
az storage account を使用して、BLOB インデックス機能に対応したストレージ アカウントを作成します。 詳細については、「BLOB インデックス タグを使用して Azure BLOB データを管理および検索する」を参照してください。
az storage container を使用してストレージ アカウント内に新しい BLOB コンテナーを作成し、[匿名] となっているアクセス レベルを [プライベート (匿名アクセスなし)] に設定します。
az storage blob upload を使用して、コンテナーにテキスト ファイルをアップロードします。
そのテキストファイルに、次の BLOB インデックス タグを追加します。 詳細については、「BLOB インデックス タグを使用して Azure Blob Storage でデータを管理および検索する」を参照してください。
Note
BLOB ではほかにも、ユーザー定義による任意のキー値メタデータを格納する機能がサポートされています。 メタデータと BLOB インデックス タグはよく似ていますが、条件では BLOB インデックス タグを使用する必要があります。
キー 値 Project Cascade コンテナーに 2 つめのテキスト ファイルをアップロードします。
2 つめのテキストファイルには、次の BLOB インデックス タグを追加します。
キー 値 Project Baker 次の変数を、使用した名前で初期化します。
resourceGroup="<resourceGroup>" storageAccountName="<storageAccountName>" containerName="<containerName>" blobNameCascade="<blobNameCascade>" blobNameBaker="<blobNameBaker>"
手順 4: 条件を設定したロールを割り当てる
ストレージ BLOB データ閲覧者ロールの変数を初期化します。
roleDefinitionName="Storage Blob Data Reader" roleDefinitionId="2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
リソース グループのスコープを初期化します。
scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
条件を初期化します。
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'))"
Bash では、履歴展開が有効になっている場合、感嘆符 (!) が原因で "
bash: !: event not found
" というメッセージが表示されることがあります。 この場合、set +H
コマンドを使用すると履歴展開を無効にできます。 履歴展開を再び有効にするには、set -H
を使用します。Bash では、ドル記号 ($) が展開に関して特別な意味を持っています。 条件にドル記号 ($) が含まれている場合は、直前にバックスラッシュ (\) が必要になることがあります。 たとえば、この条件ではタグ キー名を示すためにドル記号を使用しています。 Bash の引用符に関する規則の詳細については、「二重引用符」を参照してください。
条件のバージョンと説明を初期化します。
conditionVersion="2.0" description="Read access to blobs with the tag Project=Cascade"
az role assignment create を使用して、条件を設定したストレージ BLOB データ閲覧者ロールを、リソース グループのスコープ内のユーザーに割り当てます。
az role assignment create --assignee-object-id $userObjectId --scope $scope --role $roleDefinitionId --description "$description" --condition "$condition" --condition-version $conditionVersion
出力の例を次に示します。
{ "canDelegate": null, "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'))", "conditionVersion": "2.0", "description": "Read access to blobs with the tag Project=Cascade", "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}", "name": "{roleAssignmentId}", "principalId": "{userObjectId}", "principalType": "User", "resourceGroup": "{resourceGroup}", "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1", "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}", "type": "Microsoft.Authorization/roleAssignments" }
手順 5: (省略可能) Azure portal で条件を表示する
Azure portal で、リソース グループを開きます。
[アクセス制御 (IAM)] を選択します。
[ロールの割り当て] タブで、ロールの割り当てを探します。
[条件] 列で [表示または編集] を選択すると、条件が表示されます。
手順 6: 条件をテストする
新しいコマンド ウィンドウを開きます。
az login を使用して、Chandra としてサインインします。
az login
次の変数を、使用した名前で初期化します。
storageAccountName="<storageAccountName>" containerName="<containerName>" blobNameBaker="<blobNameBaker>" blobNameCascade="<blobNameCascade>"
az storage blob show を使用して、Baker プロジェクトに関連するファイルのプロパティの読み取りを試します。
az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameBaker --auth-mode login
出力の例を次に示します。 追加した条件が原因となってファイルを読み取ることができないことがわかります。
You do not have the required permissions needed to perform this operation. Depending on your operation, you may need to be assigned one of the following roles: "Storage Blob Data Contributor" "Storage Blob Data Reader" "Storage Queue Data Contributor" "Storage Queue Data Reader" If you want to use the old authentication method and allow querying for the right account key, please use the "--auth-mode" parameter and "key" value.
Cascade プロジェクトに関連するファイルのプロパティを読み取ります。
az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameCascade --auth-mode login
出力の例を次に示します。 ファイルに Project=Cascade タグが設定されているため、ファイルのプロパティを読み取ることができます。
{ "container": "<containerName>", "content": "", "deleted": false, "encryptedMetadata": null, "encryptionKeySha256": null, "encryptionScope": null, "isAppendBlobSealed": null, "isCurrentVersion": null, "lastAccessedOn": null, "metadata": {}, "name": "<blobNameCascade>", "objectReplicationDestinationPolicy": null, "objectReplicationSourceProperties": [], "properties": { "appendBlobCommittedBlockCount": null, "blobTier": "Hot", "blobTierChangeTime": null, "blobTierInferred": true, "blobType": "BlockBlob", "contentLength": 7, "contentRange": null, ... }
手順 7: (省略可能) 条件を編集する
もう一方のコマンド ウィンドウで az role assignment list を使用して、追加したロールの割り当てを取得します。
az role assignment list --assignee $userObjectId --resource-group $resourceGroup
次のように出力されます。
[ { "canDelegate": null, "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'))", "conditionVersion": "2.0", "description": "Read access to blobs with the tag Project=Cascade", "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}", "name": "{roleAssignmentId}", "principalId": "{userObjectId}", "principalName": "chandra@contoso.com", "principalType": "User", "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" } ]
次の形式の JSON ファイルを作成し、
condition
とdescription
の 2 つのプロパティを更新します。{ "canDelegate": null, "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'))", "conditionVersion": "2.0", "description": "Read access to blobs with the tag Project=Cascade or Project=Baker", "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}", "name": "{roleAssignmentId}", "principalId": "{userObjectId}", "principalName": "chandra@contoso.com", "principalType": "User", "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" }
az role assignment update を使用して、ロールの割り当ての条件を更新します。
az role assignment update --role-assignment "./path/roleassignment.json"
手順 8: リソースをクリーンアップする
az role assignment delete を使用して、追加したロールの割り当てと条件を削除します。
az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
作成したストレージ アカウントを削除します。
作成したユーザーを削除します。