🗃️

Azure AD 認可の Azure Blob を REST API で取得する

2022/06/08に公開

はじめに

Azure Blob などのストレージサービスでは、アクセス制御に Azure AD での RBAC や ABAC が可能になっています。こちらを検証したいのですが、Azure ポータルだと不十分と思い、 REST API で取得する方法を調べました。

Azure AD 認可の Azure Blob を準備

ストレージアカウントやコンテナーの設定はこちらをご確認ください。
https://docs.microsoft.com/ja-jp/azure/storage/blobs/authorize-data-operations-portal
https://docs.microsoft.com/ja-jp/azure/storage/blobs/assign-azure-role-data-access?tabs=portal

Azure AD からトークンを取得

Azure AD 認可の Blob を取得する場合、ヘッダーに Bearer トークンを付与する必要があります。トークン取得方法はいくつかありますが、今回は Azure PowerShell で取得します。

  1. Azure PowerShell に接続します。
Connect-AzAccount

  1. Storage アクセス用のトークンを取得します。
$accesstoken = Get-AzAccessToken -ResourceTypeName Storage

ストレージアカウント個別の URI で指定する場合は以下になります。

$accesstoken = Get-AzAccessToken -ResourceUrl "https://<storageAccountName>.blob.core.windows.net/"

トークンの中身を見ると Audiance (aud) の項目がストレージになっています。

ちなみに「-ResourceTypeName Storage」をつけないとこちらです。

<?xml version="1.0" encoding="utf-8"?>
<Error>
    <Code>InvalidAuthenticationInfo</Code>
    <Message>Server failed to authenticate the request. Please refer to the information in the www-authenticate header.
RequestId:XXXXXX
Time:XXXXXXX</Message>
    <AuthenticationErrorDetail>Audience validation failed. Audience did not match.</AuthenticationErrorDetail>
</Error>

REST API リクエスト

今回はシンプルに GET Blob を行います。

  1. リクエストに必要な要素を作成します。
$token = "Bearer " + $accesstoken.Token

$header = @{
    "Authorization" = $token;
    "x-ms-version" = "2020-04-08"
}

$uri = "https://<storageAccountName>.blob.core.windows.net/<containerName>/<blobName>"

"x-ms-version" についてはこちらをご確認ください。
https://docs.microsoft.com/ja-jp/rest/api/storageservices/versioning-for-the-azure-storage-services


  1. リクエストを作成します。
$getRequest = @{
    Uri         = $uri
    Headers     = $header
    Method      = 'GET'
}

  1. REST API を実行します。
$response = Invoke-WebRequest @getRequest

  1. レスポンスを出力します。
Write-Output $response.content

アクセス権限があれば、以上で取得できるかと思います。

Discussion