Java を使用してコンテナー用のユーザー委任 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 の資格情報を使い、Java 用の Azure Storage クライアント ライブラリを使ってコンテナー用のユーザー委任 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 セキュリティ プリンシパルが BLOB データにアクセスしようとする場合、そのセキュリティ プリンシパルはリソースへのアクセス許可を保持している必要があります。 セキュリティ プリンシパルが Azure 内のマネージド ID であるか、開発環境でコードを実行している Microsoft Entra ユーザー アカウントであるかにかかわらず、BLOB データへのアクセスを許可する Azure ロールをセキュリティ プリンシパルに割り当てる必要があります。 Azure RBAC によるアクセス許可の割り当てについては、「BLOB データにアクセスするために Azure ロールを割り当てる」を参照してください。

プロジェクトの設定

この記事のコード例を使用するには、次のインポート ディレクティブを追加します。

import com.azure.storage.blob.*;
import com.azure.storage.blob.models.*;
import com.azure.storage.blob.sas.*;

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

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

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

BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
        .endpoint("https://<storage-account-name>.blob.core.windows.net/")
        .credential(new DefaultAzureCredentialBuilder().build())
        .buildClient();

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

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

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

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

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

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

public UserDelegationKey requestUserDelegationKey(BlobServiceClient blobServiceClient) {
    // Request a user delegation key that's valid for 1 day, as an example
    UserDelegationKey userDelegationKey = blobServiceClient.getUserDelegationKey(
        OffsetDateTime.now().minusMinutes(5),
        OffsetDateTime.now().plusDays(1));

    return userDelegationKey;
}

コンテナー用にユーザー委任 SAS を作成する

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

SAS に署名するためのユーザー委任キーは、BlobServiceSasSignatureValues に指定された値と共にこのメソッドに渡されます。 アクセス許可は、BlobContainerSasPermission インスタンスとして指定されます。

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

public String createUserDelegationSASContainer(BlobContainerClient containerClient, UserDelegationKey userDelegationKey) {
    // Create a SAS token that's valid for 1 day, as an example
    OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1);

    // Assign read permissions to the SAS token
    BlobContainerSasPermission sasPermission = new BlobContainerSasPermission()
            .setReadPermission(true);

    BlobServiceSasSignatureValues sasSignatureValues = new BlobServiceSasSignatureValues(expiryTime, sasPermission)
            .setStartTime(OffsetDateTime.now().minusMinutes(5));

    String sasToken = containerClient.generateUserDelegationSas(sasSignatureValues, userDelegationKey);
    return sasToken;
}

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

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

// Create a SAS token for a container
BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient("sample-container");
String sasToken = createUserDelegationSASContainer(containerClient, userDelegationKey);

// Create a new BlobContainerClient using the SAS token
BlobContainerClient sasContainerClient = new BlobContainerClientBuilder()
        .endpoint(containerClient.getBlobContainerUrl())
        .sasToken(sasToken)
        .buildClient();

リソース

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

REST API の操作

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

コード サンプル

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

関連項目