Python を使用してコンテナーまたは BLOB 用のユーザー委任 SAS を作成する

Shared Access Signature (SAS) を使用すると、ストレージ アカウント内のコンテナーと BLOB への制限付きアクセスを許可できます。 SAS を作成するときに、クライアントがアクセスできる Azure Storage リソース、それらのリソースに対するアクセス許可、SAS の有効期間などの制約を指定します。

すべての SAS はキーによって署名されます。 次の 2 つの方法のいずれかで SAS に署名できます。

  • Microsoft Entra 資格情報を使用して作成されたキーを使用します。 Microsoft Entra の資格情報を使用して署名された SAS は、"ユーザー委任" SAS です。 ユーザー委任 SAS を作成するクライアントには、Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey アクションを含む Azure RBAC ロールを割り当てる必要があります。 詳細については、「ユーザー委任 SAS の作成」を参照してください。
  • ストレージ アカウント キーを使用する。 サービス SASアカウント SAS は、どちらもストレージ アカウント キーを使用して署名されます。 サービス SAS を作成するクライアントには、アカウント キーへの直接アクセス権を付与するか、Microsoft.Storage/storageAccounts/listkeys/action アクセス許可を割り当てる必要があります。 詳細については、「サービス SAS の作成」または「アカウント SAS の作成」を参照してください。

注意

ユーザー委任 SAS により、ストレージ アカウント キーで署名された SAS のセキュリティが向上します。 Microsoft では、ユーザー委任 SAS を可能な限り使用することを推奨しています。 詳細については、「Shared Access Signatures (SAS) でデータの制限付きアクセスを付与する」を参照してください。

この記事では、Microsoft Entra の資格情報を使い、Python 用の Azure Storage クライアント ライブラリを使ってコンテナーまたは BLOB 用のユーザー委任 SAS を作成する方法について説明します。

ユーザー委任 SAS について

コンテナーまたは BLOB にアクセスするための SAS トークンは、Microsoft Entra 資格情報またはアカウント キーのいずれかを使用してセキュリティ保護することができます。 Microsoft Entra 資格情報でセキュリティ保護された SAS は、ユーザーの代わりに、SAS に署名するために使用される OAuth 2.0 トークンが要求されるため、ユーザー委任 SAS と呼ばれます。

セキュリティのベスト プラクティスとして、より侵害されやすいアカウント キーを使用するのではなく、可能な限り Microsoft Entra 資格情報を使用することをお勧めします。 アプリケーション設計で Shared Access Signature が必要な場合は、セキュリティを強化するために、Microsoft Entra 資格情報を使用してユーザー委任 SAS を作成してください。 ユーザー委任 SAS の詳細については、「ユーザー委任 SAS を作成する」を参照してください。

注意

有効な SAS を所有するすべてのクライアントは、その SAS で許可されているストレージ アカウントのデータにアクセスできます。 SAS を悪意のある、または意図しない用途から保護することが重要です。 SAS の配布は慎重に行い、侵害された SAS を失効させるための計画を用意しておいてください。

Shared Access Signature の詳細については、「Shared Access Signatures (SAS) を使用して Azure Storage リソースへの制限付きアクセスを許可する」を参照してください。

データにアクセスするための Azure ロールを割り当る

Microsoft Entra セキュリティ プリンシパルがデータにアクセスしようとする場合、そのセキュリティ プリンシパルはリソースへのアクセス許可を保持している必要があります。 セキュリティ プリンシパルが Azure 内のマネージド ID であるか、開発環境でコードを実行している Microsoft Entra ユーザー アカウントであるかにかかわらず、データへのアクセスを許可する Azure ロールをセキュリティ プリンシパルに割り当てる必要があります。 Azure RBAC によるアクセス許可の割り当てについては、「BLOB データにアクセスするために Azure ロールを割り当てる」を参照してください。

プロジェクトの設定

この記事のコード例を使用するには、次の手順に従ってプロジェクトを設定します。

パッケージをインストールする

pip install を使用して次のパッケージをインストールしてください。

pip install azure-storage-blob azure-identity

アプリ コードを設定する

次の import ディレクティブを追加します。

from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
    BlobServiceClient,
    ContainerClient,
    BlobClient,
    BlobSasPermissions,
    ContainerSasPermissions,
    UserDelegationKey,
    generate_container_sas,
    generate_blob_sas
)

認証済みのトークン資格情報を取得する

Blob Storage への要求を承認するためにコード上で使用できるトークン資格情報を取得するには、DefaultAzureCredential クラスのインスタンスを作成します。 DefaultAzureCredential クラスを使用して、Blob Storage にアクセスするためのマネージド ID を承認する方法の詳細については、「Python 用 Azure ID クライアント ライブラリ」を参照してください。

次のコード スニペットでは、認証されたトークン資格情報を取得し、それを使用して Blob ストレージ用のサービス クライアントを作成する方法が示されています。

# Construct the blob endpoint from the account name
account_url = "https://<storage-account-name>.blob.core.windows.net"

#Create a BlobServiceClient object using DefaultAzureCredential
blob_service_client = BlobServiceClient(account_url, credential=DefaultAzureCredential())

Python SDK を使用してアプリケーションから Blob Storage へのアクセスを承認する方法の詳細については、「Azure サービスに対して Python アプリを認証する」を参照してください。

ユーザー委任キーを取得する

すべての SAS はキーによって署名されます。 ユーザー委任 SAS を作成するには、まず、SAS に署名するために使用されるユーザー委任キーを要求する必要があります。 ユーザー委任キーは、サービス SAS またはアカウント SAS に署名するために使用されるアカウント キーに似ていますが、Microsoft Entra の資格情報に依存している点が異なります。 クライアントで OAuth 2.0 トークンを使用してユーザー委任キーが要求されると、ユーザーに代わって Blob Storage によってユーザー委任キーが返されます。

ユーザー委任キーを取得したら、そのキーを使用して、キーの有効期間にわたって、任意の数のユーザー委任共有アクセス署名を作成できます。 ユーザー委任キーは、それを取得するために使用された OAuth 2.0 トークンに依存しないため、キーが有効である限り、トークンを更新する必要はありません。 キーが有効である時間の長さを、最大 7 日間まで指定できます。

ユーザー委任キーを要求するには、次のいずれかの方法を使用します。

次のコード例は、ユーザー委任キーを要求する方法を示しています。

def request_user_delegation_key(self, blob_service_client: BlobServiceClient) -> UserDelegationKey:
    # Get a user delegation key that's valid for 1 day
    delegation_key_start_time = datetime.datetime.now(datetime.timezone.utc)
    delegation_key_expiry_time = delegation_key_start_time + datetime.timedelta(days=1)

    user_delegation_key = blob_service_client.get_user_delegation_key(
        key_start_time=delegation_key_start_time,
        key_expiry_time=delegation_key_expiry_time
    )

    return user_delegation_key

ユーザーの委任 SAS の作成

アプリのニーズに基づいて、コンテナーまたは BLOB 用のユーザー委任 SAS を作成できます。

ユーザー委任キーを取得したら、ユーザー委任 SAS を作成できます。 次のメソッドを使用して、コンテナー リソースへの制限付きアクセスを委任するためのユーザー委任 SAS を作成できます。

SAS に署名するためのユーザー委任キーは、user_delegation_key 引数としてメソッドに渡されます。 許可されるアクセス許可は、メソッドに permission 引数として渡され、ContainerSasPermissions クラス内で定義されます。

次のコード例は、コンテナー用のユーザー委任 SAS を作成する方法を示しています。

def create_user_delegation_sas_container(self, container_client: ContainerClient, user_delegation_key: UserDelegationKey):
    # Create a SAS token that's valid for one day, as an example
    start_time = datetime.datetime.now(datetime.timezone.utc)
    expiry_time = start_time + datetime.timedelta(days=1)

    sas_token = generate_container_sas(
        account_name=container_client.account_name,
        container_name=container_client.container_name,
        user_delegation_key=user_delegation_key,
        permission=ContainerSasPermissions(read=True),
        expiry=expiry_time,
        start=start_time
    )

    return sas_token

ユーザー委任 SAS を使用してクライアント オブジェクトを認可する

ユーザー委任 SAS を使用することで、SAS で付与された権限に基づき、コンテナーや BLOB に対する操作を行うクライアント オブジェクトを認可できます。

次のコード例は、前の例で作成したユーザー委任 SAS を使用して ContainerClient オブジェクトを承認する方法を示しています。 このクライアント オブジェクトを使用すると、SAS によって付与されたアクセス許可に基づいてコンテナー リソースに対する操作を実行できます。

# The SAS token string can be appended to the resource URL with a ? delimiter
# or passed as the credential argument to the client constructor
sas_url = f"{container_client.url}?{sas_token}"

# Create a ContainerClient object with SAS authorization
container_client_sas = ContainerClient.from_container_url(container_url=sas_url)

リソース

Python 用の Azure Blob Storage クライアント ライブラリを使用したユーザー委任 SAS の作成について詳しくは、次のリソースを参照してください。

コード サンプル

REST API の操作

Azure SDK for Python には Azure REST API に基づき構築されたライブラリが含まれるため、使い慣れた Python パラダイムを通じて REST API 操作を実施できます。 ユーザー委任キーを取得するためのクライアント ライブラリ メソッドでは、次の REST API 操作を使用します。

クライアント ライブラリのリソース

関連項目

  • この記事は、Python の Blob Storage 開発者ガイドの一部です。 詳細については、「Python アプリの構築」にある開発者ガイドの記事の完全な一覧を参照してください。