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 トークンを保存されているアクセス ポリシーに関連付けることです。 後のユニットでは、これらの利点とそのしくみについて確認します。