Shared Access Signature を使用して Azure Storage へのアクセスを委任する

完了

Shared Access Signature (SAS) を使用して、リソースへのアクセスを委任することができます。 クライアントがあなたのストレージ アカウントの資格情報に直接アクセスすることはできません。また、細かいレベルでクライアントのアクセス先を制御します。

すべての認可オプションを調査した後、SAS についてさらに詳しく見ていきます。 あなたは、C# .NET Web アプリで SAS を作成して使用したいと考えています。 また、SAS を使用するタイミングと方法に関する Microsoft のベスト プラクティスに従うつもりです。

このユニットでは、SAS が技術的なレベルでどのように動作するか、およびそれを使用するために記述する必要がある C# コードを確認します。

Shared Access Signature のしくみ

SAS には、2 つのコンポーネントがあります。1 つ以上のストレージ リソースを指す URI と、クライアントがリソースにアクセスする方法を示すトークンです。

https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg?sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D などの 1 つの URI で、次のように SAS トークンから URI を分離できます。

URI SAS トークン
https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg? sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D

SAS トークンには、次のコンポーネント、またはクエリ パラメーターが含まれています。

クエリ パラメーター フィールド名 説明
sp 署名されたアクセス許可 sp=r クライアントが実行できる 1 つ以上の操作を示します。 値は、a (add)、c (create)、d (delete)、l (list)、r (read)、w (write) の複合にすることができます。 sp=r は読み取り専用です。sp=acdlrw では使用可能なすべての権限が付与されます。
st 開始時刻 st=2020-01-20T11:42:32Z アクセスを開始する日付と時刻。
se 有効期限 se=2020-01-20T19:42:32Z アクセスを終了する日付と時刻。 この例では、開始日に基づいて、8 時間のアクセス権が付与されます。
スプリント 署名されたプロトコル spr=https SAS を使用して行われた要求に許可されたプロトコル。 HTTPS と HTTP の両方の値 (既定値) または HTTPS のみを含む省略可能なフィールド。
sv 署名されたバージョン sv=2019-02-02 使用するストレージ API のサービス バージョン。
sr リソースのスコープ sr=b アクセスされるストレージの種類。 使用可能な値には、b (BLOB)、c (コンテナー)、d (ディレクトリ)、f (ファイル)、s (共有) があります
sig signature sig=SrW1...wVZs%3D 暗号化署名。

サービスまたはアカウントの Shared Access Signature を作成するときには、署名は自分のストレージ アカウント キーで署名されます。 ストレージへのアクセス権を持つ Microsoft Entra セキュリティ プリンシパルを使う場合は、ユーザー委任 Shared Access Signature を作成します。 また、Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey アクションをプリンシパルに許可します。

.NET で SAS を作成する

会社からサード パーティへのアクセス権が付与されるため、Microsoft Entra ID を使って、医療画像へのアクセスが必要なサード パーティごとにサービス プリンシパルを作成することはできません。 アプリでは、個々のファイルに対してストレージ アカウント キーが使用されます。 次の手順では、C# コードを使用して SAS を作成する方法を示します。

BLOB コンテナー クライアントを作成して Azure のストレージ アカウントに接続する

BlobContainerClient container = new BlobContainerClient( "ConnectionString", "Container" );

SAS トークンを作成したい BLOB を取得して、BlobClient を作成する

foreach (BlobItem blobItem in container.GetBlobs())
{
    BlobClient blob = container.GetBlobClient(blobItem.Name);
}

SAS トークンの生成に使用する BLOB の BlobSasBuilder オブジェクトを作成する

BlobSasBuilder sas = new BlobSasBuilder
{
    BlobContainerName = blob.BlobContainerName,
    BlobName = blob.Name,
    Resource = "b",
    ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(1)
};

// Allow read access
sas.SetPermissions(BlobSasPermissions.Read);

BlobSasBuilder オブジェクトの ToSasQueryParameters メソッドの呼び出しを認証する

StorageSharedKeyCredential storageSharedKeyCredential = new StorageSharedKeyCredential( "AccountName", "AccountKey");

sasToken = sas.ToSasQueryParameters(storageSharedKeyCredential).ToString();

ベスト プラクティス

Microsoft では、SAS 使用の潜在的なリスクを軽減するために、次のガイダンスを提供しています。

  • 安全に SAS を配布し、中間者攻撃を防ぐには、常に HTTPS を使用します。
  • 最も安全な SAS は、ユーザー委任です。 これによりコードにストレージ アカウント キーを格納する必要がなくなるため、可能な限り使用してください。 資格情報を管理するには Microsoft Entra ID を使う必要があります。このオプションは、ソリューションでは使用できない可能性があります。
  • 有効期限を最も小さい有効な値に設定してみてください。 これで、SAS キーが侵害されても、悪用されるのが短時間で済む可能性があります。
  • 最低限必要な特権の規則を適用します。 必要なアクセス権だけを許可します。 たとえば、このアプリには読み取り専用アクセスで十分です。
  • SAS が適切な解決策ではない状況もあります。 SAS を使用するリスクが許容できない場合は、ユーザーとそのストレージへのアクセスを管理するための中間層サービスを作成します。

サービスまたはアカウント SAS を使用するための最も柔軟性が高く安全な方法は、SAS トークンを保存されているアクセス ポリシーに関連付けることです。 後のユニットでは、これらの利点とそのしくみについて確認します。