はじめに
AzureにおけるStorage Account(主にBlob Storage)のアクセスをどう制御するかについて、調査したことを備忘として残しておく。
検証に使用したリソースは削除済みであるため、画像に写り込んでいるURLやアクセスキーなどは無効となっている。
検証日: 2023/07/06
完全にPublicにしたい時
コンテナーを作成するときに、パブリックアクセスレベルを「BLOB」に設定する。(「コンテナー」でもOKだが、コンテナ内のBLOBを一覧表示できるようになる)
BLOBパスを示したURLだけで、ファイルにアクセスできるようになる。
Privateにしたい時
前提として、コンテナーは「プライベート」のアクセスレベルで作成する。じゃないとパブリックで誰でも閲覧できる状態になってしまう。
手っ取り早くアクセスできるようにしたい時
アクセスキーを使用する。
デメリットとしては、何でもできてしまうこと。
ストレージアカウント内のBlob、File、Queue、Tableは全て読取も書込も可能で、削除することもできる。
かなり危ないので、次に紹介するSASを使用するのがベター。
制限付きアクセスを付与する
Shared Access Signature (SAS) を使用すると、ストレージ アカウント内のリソースへのセキュリティで保護された委任アクセスが可能になります。 SAS を使用すると、クライアントがデータにアクセスする方法をきめ細かく制御できます。
Shared Access Signatures (SAS) でデータの制限付きアクセスを付与する - Azure Storage | Microsoft Learn より引用
以下のことを制御できる。
- どのリソースにアクセスできるか
- Blobであればコンテナー単位
- リソースに対し何の操作ができるか
- 読取・書込・削除など
- SAS有効期間
SAS を使用する際のベスト プラクティス には目を通しておく。
SASには下記3種類あるが、サービス SASおよびアカウント SASは、ストレージアカウントキー(アクセスキー)に依存する。アクセスキーは漏洩したらアウトであり、頻繁に更新が推奨されているが、管理コストが増えてしまう。公式でも、warning noteに示すように、AzureAD認証を用いた「ユーザー委任 SAS」の使用を呼びかけている。
- ユーザー委任 SAS
- サービス SAS
- アカウント SAS
セキュリティのベスト プラクティスとして、より侵害されやすいアカウント キーを使用するのではなく、可能な限り Azure AD 資格情報を使用することをお勧めします。 アプリケーション設計で、BLOB ストレージへのアクセスのため、Shared Access Signature が必要な場合は、セキュリティを強化するために、可能な限り、Azure AD 資格情報を使用してユーザー委任 SAS を作成してください。 詳細については、「Azure Storage でデータへのアクセスを承認する」をご覧ください。
公式ドキュメント より引用
ストレージアカウントキー(アクセスキー)を使用しないなら、安全のためにも無効化しておくと良い。
アカウントSASを利用する場合の手順メモ
推奨されてはいないが、使わざるを得ない時もありそうな気がするのでメモ
アクセスポリシーの作成
アクセスポリシーを先に作成し、アカウントSASに紐づけることで、有効期限やアクセス許可を柔軟に変更することができる。
アクセスポリシーを作成したいコンテナのメニューから、「アクセス ポリシー」を選択
許可するアクセス種類や有効期限を設定する。
(実質)無期限に設定することもできそうだ。
SASの発行
SASを作成したいコンテナのメニューから、「SAS の生成」を選択
- アカウントSAS、ユーザー委任SASのどちらを作成するか
- アカウントキーはどちらを使うのか
- どのアクセスポリシーを使用するか
などを指定できる。
動作確認
Public設定時は、下記のようなリソースパスを示したURLでBLOBを参照できていたが、ResourceNotFoundエラーが返却されている。
https://qiitasample.blob.core.windows.net/private-container/dir1/hoge1.txt
URLにSASトークンを付与してやると、BLOBを参照することができた。
ネットワークトラフィックを制限する
[ストレージアカウント]-[セキュリティとネットワーク]-[ネットワーク]ブレード-[ファイアウォールと仮想ネットワーク]タブ
こちらより、特定のネットワークを介した通信に制限するよう設定することができる。
設定できるのは以下。
- 特定の仮想ネットワーク/サブネット
- 特定IPアドレス
- 2023/07/06ではIPv4のみサポート
- アクセス許可を持つシステム割り当てマネージド ID
プライベートエンドポイントを使用する
[ストレージアカウント]-[セキュリティとネットワーク]-[ネットワーク]ブレード-[プライベートエンドポイント接続]タブ
トラフィックを制限してプライベート向けに限定することで、リソースへのアクセス安全性を高めることができる。詳細は以下の公式ドキュメント参照。
プライベート エンドポイントを使用する - Azure Storage | Microsoft Learn
なお、サブリソースごとに個別のプライベートエンドポイントを作成する必要がある。
- BLOB (blob、blob_secondary)
- Table (table、table_secondary)
- Queue (queue、queue_secondary)
- File (file、file_secondary)
- Web (web、web_secondary)
- Dfs (dfs、dfs_secondary)
Refference