チュートリアル: Azure PowerShell を使用してロールの割り当て条件を追加し、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: 前提条件をインストールする
PowerShell ウィンドウを開きます。
Get-InstalledModule を使用して、インストール済みのモジュールのバージョンを確認します。
Get-InstalledModule -Name Az Get-InstalledModule -Name Az.Resources Get-InstalledModule -Name Az.Storage
必要であれば、Install-Module を使用して、必要なバージョンのモジュール (Az、Az.Resources、Az.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
PowerShell をいったん閉じてから開き直し、セッションを更新します。
手順 2 - Azure にサインインする
Connect-AzAccount コマンドを実行し、表示された手順に従ってユーザー アクセス管理者または所有者としてディレクトリにサインインします。
Connect-AzAccount
Get-AzSubscription を使用して、サブスクリプションの一覧を表示します。
Get-AzSubscription
サブスクリプション ID を決め、変数を初期化します。
$subscriptionId = "<subscriptionId>"
そのサブスクリプションを、アクティブなサブスクリプションとして設定します。
$context = Get-AzSubscription -SubscriptionId $subscriptionId Set-AzContext $context
手順 3 - ユーザーを作成する
New-MgUser を使用してユーザーを作成するか、既存のユーザーを探します。 このチュートリアルでは、例として Chandra を使用しています。
ユーザーのオブジェクト ID の変数を初期化します。
$userObjectId = "<userObjectId>"
手順 4: ストレージを設定する
New-AzStorageAccount を使用して、BLOB インデックス機能に対応したストレージ アカウントを作成します。 詳細については、「BLOB インデックス タグを使用して Azure BLOB データを管理および検索する」を参照してください。
New-AzStorageContainer を使用してストレージ アカウント内に新しい BLOB コンテナーを作成し、匿名アクセス レベルを [プライベート (匿名アクセスなし)] に設定します。
Set-AzStorageBlobContent を使用してコンテナーにテキスト ファイルをアップロードします。
そのテキストファイルに、次の 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>"
手順 5: 条件を設定したロールを割り当てる
ストレージ 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'))"
PowerShell では、条件にドル記号 ($) が含まれている場合は、その前にバッククォート (`) を付ける必要があります。 たとえば、この条件ではタグ キー名を示すためにドル記号を使用しています。
条件のバージョンと説明を初期化します。
$conditionVersion = "2.0" $description = "Read access to blobs with the tag Project=Cascade"
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 で条件を表示する
Azure portal で、リソース グループを開きます。
[アクセス制御 (IAM)] を選択します。
[ロールの割り当て] タブで、ロールの割り当てを探します。
[条件] 列で [表示または編集] を選択すると、条件が表示されます。
手順 7: 条件をテストする
新しい PowerShell ウィンドウを開きます。
Connect-AzAccount を使用して、Chandra としてサインインします。
Connect-AzAccount
次の変数を、使用した名前で初期化します。
$storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameBaker = "<blobNameBaker>" $blobNameCascade = "<blobNameCascade>"
New-AzStorageContext を使用して、ストレージ アカウントにもっと簡単にアクセスするための特殊なコンテキストを作成します。
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
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
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: (省略可能) 条件を編集する
もう一方の PowerShell ウィンドウで Get-AzRoleAssignment を使用して、追加したロールの割り当てを取得します。
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
条件を編集します。
$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'))"
条件と説明を初期化します。
$testRa.Condition = $condition $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
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: リソースをクリーンアップする
Remove-AzRoleAssignment を使用して、追加したロールの割り当てと条件を削除します。
Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
作成したストレージ アカウントを削除します。
作成したユーザーを削除します。