Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-stor

This commit is contained in:
Translator
2026-01-18 15:04:28 +00:00
parent 1d1bce3c55
commit fd6bb9c2d2

View File

@@ -2,84 +2,99 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## 基本情報
Azure Storage Accounts は、blobs (binary large objects)、files、queues、tables といったさまざまなデータタイプ向けのスケーラブルで安全かつ高可用なクラウドストレージを提供する、Microsoft Azure の基盤となるサービスです。これら異なるストレージサービスを単一のネームスペースの下でまとめて管理するためのコンテナとして機能します。
Azure Storage Accounts は Microsoft Azure の基本的なサービスで、スケーラブルで安全かつ高可用なクラウド **さまざまなデータ型向けのストレージ** を提供します。これには blobs (binary large objects)、ファイル、キュー、テーブルが含まれます。これら異なるストレージサービスを単一の名前空間でまとめて管理できるコンテナとして機能します。
**主な構成オプション**:
**主な設定オプション**:
- すべての storage account は **Azure 全体で一意の名前** を持つ必要があります。
- 各 storage account は **region** または Azure extended zone にデプロイされます
- より高いパフォーマンスのために **premium** バージョンの storage account を選択可能です。
- ラック、ドライブ、データセンターの **障害** に対する保護のため **4 種類の冗長** の中から選択できます。
- storage account は **Azure 全体で一意の名前** を持つ必要があります。
- 各 storage account は **リージョン** または Azure extended zone にデプロイされます
- より高いパフォーマンスのために storage account の **premium** バージョンを選択できます
- ラック、ドライブ、データセンターの **障害** から保護するため **4種類の冗長化オプション** 選択できます。
**セキュリティ構成オプション**:
**セキュリティ設定オプション**:
- **Require secure transfer for REST API operations**: ストレージとの通信で TLS を必須にします
- **Allows enabling anonymous access on individual containers**: 効にしている場合、将来的にコンテナで匿名アクセスを有効にすることはできません。
- **Enable storage account key access**: 無効にすると Shared Keys によるアクセスは禁止されます
- **Minimum TLS version**
- **Permitted scope for copy operations**: 任意の storage account から、同 Entra tenant 内の任意の storage account から、または同仮想ネットワーク内の private endpoints を持つ storage account からの許可を選べます。
- **REST API 操作に対して安全な転送を要求する**: ストレージとの通信では常に TLS を要求します
- **個別コンテナーでの匿名アクセスを有効化可能にする**: 効にしないと、将来的に匿名アクセスを有効化できなくなります
- **storage account key アクセスを有効化**: 有効化しない場合、Shared Keys によるアクセスは禁止されます
- **最小 TLS バージョン**
- **コピー操作の許可スコープ**: 任意の storage account、同 Entra tenant の storage account、または同仮想ネットワーク内の private endpoints を持つ storage account からのコピーを許可できます。
**Blob Storage オプション**:
**Blob Storage options**:
- **Allow cross-tenant replication**
- **Access tier**: Hot頻繁にアクセスるデータ、CoolCold稀にアクセスるデータ
- **クロステナント複製を許可**
- **アクセス層**: Hot (頻繁にアクセスされるデータ)、Cool および Cold (稀にアクセスされるデータ)
**Networking オプション**:
**ネットワーキングオプション**:
- **Network access**:
- Allow from all networks
- Allow from selected virtual networks and IP addresses
- Disable public access and use private access
- **Private endpoints**: 仮想ネットワークから storage account へのプライベート接続を可能にします
- すべてのネットワークから許可
- 選択した仮想ネットワークと IP アドレスから許可
- 公開アクセスを無効にしてプライベートアクセスを使用
- **Private endpoints**: 仮想ネットワークから storage account へのプライベート接続を可能にします
**Data protection オプション**:
**データ保護オプション**:
- **Point-in-time restore for containers**: コンテナを過去の状態に復元することを可能にします
- これは versioning、change feed、blob soft delete 有効化が必要です。
- **Enable soft delete for blobs**: 削除された(上書きされたものも含む)blob に対して日数単位の保持期間を有効にします
- **Enable soft delete for containers**: 削除されたコンテナに対して日数単位の保持期間を有効にします
- **Enable soft delete for file shares**: 削除された file share に対して日数単位の保持期間を有効にします
- **Enable versioning for blobs**: blob の以前のバージョンを保持します
- **Enable blob change feed**: blob の作成、変更、削除の変更ログを保持します
- **Enable version-level immutability support**: アカウント レベルでの時間ベースの保持ポリシーを設定、すべての blob バージョンに適用できるようにします。
- **Point-in-time restore for containers**: コンテナーを以前の状態に復元できます
- これは versioning、change feed、および blob soft delete 有効にする必要があります。
- **Enable soft delete for blobs**: 削除された blob(上書きされたものも含む)に対する日数単位の保持期間を有効にします
- **Enable soft delete for containers**: 削除されたコンテナに対する日数単位の保持期間を有効にします
- **Enable soft delete for file shares**: 削除されたファイル共有に対する日数単位の保持期間を有効にします
- **Enable versioning for blobs**: blob の以前のバージョンを保持します
- **Enable blob change feed**: blob の作成、変更、削除の変更ログを保持します
- **Enable version-level immutability support**: アカウントレベルでの時間ベースの保持ポリシーを設定でき、すべての blob バージョンに適用されます。
- version-level immutability support と point-in-time restore for containers は同時に有効にできません。
**Encryption 構成オプション**:
**暗号化設定オプション**:
- **Encryption type**: Microsoft-managed keys (MMK) または Customer-managed keys (CMK) を使用できます
- **Enable infrastructure encryption**: データを二重に暗号化して「より強固なセキュリティ」を提供します
- **Encryption type**: Microsoft-managed keys (MMK) または Customer-managed keys (CMK) を使用できます
- **Enable infrastructure encryption**: データを「より安全に」二重に暗号化することを可能にします
### Storage endpoints
### ストレージエンドポイント
<table data-header-hidden><thead><tr><th width="197">Storage Service</th><th>Endpoint</th></tr></thead><tbody><tr><td><strong>Blob storage</strong></td><td><code>https://<storage-account>.blob.core.windows.net</code><br><br><code>https://<stg-acc>.blob.core.windows.net/<container-name>?restype=container&comp=list</code></td></tr><tr><td><strong>Data Lake Storage</strong></td><td><code>https://<storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure Files</strong></td><td><code>https://<storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>Queue storage</strong></td><td><code>https://<storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>Table storage</strong></td><td><code>https://<storage-account>.table.core.windows.net</code></td></tr></tbody></table>
### Public Exposure
### 公開露出
"Allow Blob public access" **enabled**(デフォルトは disabledになっている場合、コンテナを作成する際に以下が可能です:
If "Allow Blob public access" is **enabled** (disabled by default), when creating a container it's possible to:
- **public access to read blobs** を許可(名前を知っている必要があります)。
- コンテナ内の **blob を列挙** して **読み取る**
- 完全に **private** にする。
- **public access to read blobs** を付与できる(名前を知っている必要があります)。
- **List container blobs** および **read** することができる
- 完全に **private** にすることができる
<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfoetUnYBPWQpRrWNnnlbqWpl8Rdoaeg5uBrCVlvcNDlnKwQHjZe8nUb2SfPspBgbu-lCZLmUei-hFi_Jl2eKbaxUtBGTjdUSDmkrcwr90VZkmuMjk9tyh92p75btfyzGiUTa0-=s2048?key=m8TV59TrCFPlkiNnmhYx3aZt" alt=""><figcaption></figcaption></figure>
#### Auditing anonymous blob exposure
### Static website (`$web`) exposure & leaked secrets
- **データを公開する可能性のある storage accounts を特定**: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'``allowBlobPublicAccess``false` の場合、コンテナを public にすることはできません
- **リスクのあるアカウントを確認**してフラグやその他の弱い設定を確認: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
- フラグが有効な場合の **container レベルの露出を列挙**:
- **Static websites** は特殊な `$web` コンテナーから、地域固有のエンドポイント(例: `https://<account>.z13.web.core.windows.net/`)経由で配信されます
- `$web` コンテナーは blob API 経由で `publicAccess: null` と報告する場合がありますが、ファイルは静的サイトのエンドポイントから依然として到達可能です。したがって、そこに config/IaC アーティファクトを置くと secrets を leak する可能性があります。
- Quick audit workflow:
```bash
# Identify storage accounts with static website hosting enabled
az storage blob service-properties show --account-name <acc-name> --auth-mode login
# Enumerate containers (including $web) and their public flags
az storage container list --account-name <acc-name> --auth-mode login
# List files served by the static site even when publicAccess is null
az storage blob list --container-name '$web' --account-name <acc-name> --auth-mode login
# Pull suspicious files directly (e.g., IaC tfvars containing secrets/SAS)
az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdout --account-name <acc-name> --auth-mode login
```
### 匿名 blob の露出を監査する
- **公開可能なストレージアカウントを特定する**: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. `allowBlobPublicAccess``false` の場合、コンテナを公開にできません。
- **リスクのあるアカウントを調査して** フラグや他の弱い設定を確認する: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
- **フラグが有効な場合のコンテナ単位の露出を列挙する**:
```bash
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
```
- `"Blob"`: 匿名での読み取り許可されている **ただし blob 名が既知の場合のみ**(一覧表示は不可)。
- `"Container"`: 匿名でての blob**一覧取得 + 読み取り** が可能。
- `null`: 非公開; 認証が必要。
- **資格情報なしでアクセスを証明**:
- `publicAccess` `Container` の場合、匿名での一覧取得が可能: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
- `Blob` `Container` の両方で、名前が分かっていれば匿名での blob ダウンロードが可能:
- `"Blob"`: 匿名での読み取り許可されるが、**blob名がわかっている場合のみ**(一覧表示は不可)。
- `"Container"`: 匿名でのすべてのblob**一覧表示 + 読み取り**が可能。
- `null`: プライベート;認証が必要。
- **認証情報なしでアクセスを証明する**:
- If `publicAccess` is `Container`, anonymous listing works: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
- For both `Blob` and `Container`, anonymous blob download works when the name is known:
```bash
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
# or via raw HTTP
@@ -87,31 +102,31 @@ curl "https://<acc>.blob.core.windows.net/<container>/<blob>"
```
### ストレージに接続
アクセス可能な**ストレージ**を見つけた、[**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) を使って接続できます。
接続可能な**ストレージ**を見つけた場合、[**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) を使って接続できます。
## ストレージへのアクセス <a href="#about-blob-storage" id="about-blob-storage"></a>
### RBAC
Entra ID のプリンシパルを使い、**RBAC roles** で storage accounts にアクセスすることが可能で、推奨される方法です。
Entra ID のプリンシパルを **RBAC roles** と組み合わせてストレージアカウントにアクセスすることが可能で、推奨される方法です。
### Access Keys
storage accounts にはアクセスに使用できる access keys があり、**これによりストレージアカウントへの完全なアクセスが可能になります。**
ストレージアカウントにはアクセスに使用できるアクセスキーがあり、これによりストレージアカウントへの**完全なアクセス**が可能になります。
<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>
### **Shared Keys & Lite Shared Keys**
アクセスキーで署名された [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) を生成して、署名付き URL 経由で特定リソースへのアクセスを許可することが可能です。
アクセスキーで署名した[**Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key)を生成して、署名付きURL経由で特定リソースへのアクセスを許可することができます。
> [!NOTE]
> `CanonicalizedResource` 部分はストレージサービスのリソースURIを表します。URL 内のいずれかの部分がエンコードされている場合は、`CanonicalizedResource` 内でも同様にエンコードされている必要があります。
> `CanonicalizedResource` 部分はストレージサービスのリソース (URI) を表します。URL の任意の部分がエンコードされている場合は、`CanonicalizedResource` 内でも同様にエンコードる必要があります。
> [!NOTE]
> これはリクエストの認証において **既定で `az` cli によって使用されます**。Entra ID プリンシパルの資格情報を使用させるには、パラメータ `--auth-mode login` を指定してください。
> これはデフォルトで `az` cli がリクエストの認証に使用する方法です。Entra ID プリンシパル認証情報を使用させたい場合はパラメータ `--auth-mode login` を指定してください。
- 次の情報に署名することで**shared key for blob, queue and file services** を生成することが可能です:
- 次の情報に署名することで **shared key for blob, queue and file services** を生成できます:
```bash
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
@@ -128,7 +143,7 @@ Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- 次の情報に署名することで **shared key for table services** を生成できます
- 次の情報に署名することで**shared key for table services** を生成できます:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
@@ -136,7 +151,7 @@ Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
```
- 次の情報に署名することで、**lite shared key for blob, queue and file services**を生成できます:
- 次の情報に署名して、**lite shared key for blob, queue and file services** を生成できます:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
@@ -145,12 +160,12 @@ Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- 次の情報に署名することで、**lite shared key for table services** を生成することが可能です:
- 次の情報に署名することで、**lite shared key for table services** を生成することができます:
```bash
StringToSign = Date + "\n"
CanonicalizedResource
```
次に、キーを使用するには、次の構文に従って Authorization ヘッダーに設定します:
そのキーを使用するには、Authorization ヘッダーで次の構文に従って指定します:
```bash
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
#e.g.
@@ -162,26 +177,26 @@ x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=
Content-Length: 0
```
### **共有アクセス署名** (SAS)
### **Shared Access Signature** (SAS)
Shared Access Signatures (SAS) は、Azure Storage アカウントのアカウントアクセスキーを公開せずにリソースへの特定のアクセス権を付与する、セキュアで時間制限付きの URL です。アクセスキーは全リソースへの管理者権限を与えるのに対し、SAS は読み取りや書き込みなどの権限を指定し、有効期限を定することで細か制御を可能にします。
Shared Access Signatures (SAS) は、アカウントのアクセスキーを公開することなく、Azure Storage アカウントのリソースへの特定のアクセス権を付与する、安全で時間制限付きの URL です。アクセスキーがすべてのリソースに対する管理者アクセスを提供する一方で、SAS は読み取りや書き込みなどの権限を指定し、有効期限を定することで細か制御を可能にします。
#### SAS の種類
#### SAS Types
- **User delegation SAS**: これは **Entra ID principal** から作成され、principal が SAS に署名しユーザーから SAS へ権限を委譲します。**blob and data lake storage** のみ使用できます([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas))。生成された user delegated SAS をすべて **revoke** することが可能です。
- ユーザーより「多い」権限 delegation SAS を生成できる場合があっても、principal がそれらの権限を持っていなければ機能しません(no privesc)。
- **Service SAS**: これはストレージアカウントのいずれかの **access keys** を使って署名されます。単一のストレージサービス内の特定リソースへのアクセス付与に使えます。キーが更新されると、その SAS は動作しなくなります。
- **Account SAS**: 同様にストレージアカウントの **access keys** で署名されます。BlobQueueTableFile といったストレージアカウントサービス全体のリソースへアクセスを付与でき、サービスレベルの操作を含めることができます。
- **User delegation SAS**: これは **Entra ID principal** から作成され、principal が SAS に署名しユーザーから SAS へ権限を委譲します。**blob and data lake storage** のみ使用できます([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas))。生成された user delegated SAS をすべて **revoke** することが可能です。
- ユーザーより「多い」権限を持つ delegation SAS を生成することは可能ですが、principal 自身にその権限がなければ動作しません(権限昇格は発生しない)。
- **Service SAS**: これはストレージアカウントの **access keys** のいずれかで署名されます。単一のストレージサービス内の特定リソースへのアクセス付与するために使用できます。キーが更新されると、SAS は動作しなくなります。
- **Account SAS**: これもストレージアカウントの **access keys** のいずれかで署名されます。Blob, Queue, Table, File といったストレージアカウントサービス全体のリソースへアクセスを付与、サービスレベルの操作を含めることができます。
access key によって署名された SAS URL の例:
A SAS URL signed by an **access key** looks like this:
- `https://<container_name>.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D`
user delegation として署名された SAS URL の例:
A SAS URL signed as a **user delegation** looks like this:
- `https://<container_name>.blob.core.windows.net/testing-container?sp=r&st=2024-11-22T15:07:40Z&se=2024-11-22T23:07:40Z&skoid=d77c71a1-96e7-483d-bd51-bd753aa66e62&sktid=fdd066e1-ee37-49bc-b08f-d0e152119b04&skt=2024-11-22T15:07:40Z&ske=2024-11-22T23:07:40Z&sks=b&skv=2022-11-02&spr=https&sv=2022-11-02&sr=c&sig=7s5dJyeE6klUNRulUj9TNL0tMj2K7mtxyRc97xbYDqs%3D`
いくつかの **http params** に注意:
Note some **http params**:
- The **`se`** param indicates the **expiration date** of the SAS
- The **`sp`** param indicates the **permissions** of the SAS
@@ -189,51 +204,51 @@ user delegation として署名された SAS URL の例:
#### SAS permissions
SAS を生成する際には、付与する権限を指定する必要があります。SAS を生成する対象オブジェクトによって含める権限は異なります。例えば:
SAS を生成する際には、付与する権限を指定する必要があります。SAS を生成する対象オブジェクトによって含めることができる権限は異なります。例えば:
- (a)dd, (c)reate, (d)elete, (e)xecute, (f)ilter_by_tags, (i)set_immutability_policy, (l)ist, (m)ove, (r)ead, (t)ag, (w)rite, (x)delete_previous_version, (y)permanent_delete
## Azure Blob Storage の SFTP サポート
## SFTP Support for Azure Blob Storage
Azure Blob Storage は現在 SSH File Transfer Protocol (SFTP) をサポートしており、カスタムソリューションやサードパーティ製品を必要とせずに直接 Blob Storage へ安全なファイル転送と管理が行えます。
Azure Blob Storage は現在SSH File Transfer Protocol (SFTP) をサポートしており、カスタムソリューションやサードパーティ製品を必要とせずにBlob Storage へ安全なファイル転送と管理を直接行うことができます。
### 主な機能
### Key Features
- Protocol Support: SFTP は hierarchical namespace (HNS) 有効 Blob Storage アカウントで動作します。これにより blobs をディレクトリやサブディレクトリに整理してナビゲーションを容易にます。
- Security: SFTP は認証にローカルユーザーのアイデンティティを使用し、RBAC や ABAC と統合されません。各ローカルユーザーは以下で認証できます:
- Protocol Support: SFTP はhierarchical namespace (HNS) 有効にした Blob Storage アカウントで動作します。これによりblobs をディレクトリやサブディレクトリに整理してナビゲーションを容易にできます。
- Security: SFTP は認証にローカルユーザーのアイデンティティを使用し、RBAC や ABAC と統合されません。各ローカルユーザーは次の方法で認証できます:
- Azure-generated passwords
- Public-private SSH key pairs
- Granular Permissions: Read、Write、Delete、List といった権限をローカルユーザーに対して最大 100 コンテナまで割り当てできます。
- Networking Considerations: SFTP 接続はポート 22 を通じて行われます。Azure はファイアウォール、private endpoints、virtual networks といったネットワーク設定をサポートしSFTP トラフィックを保護ます。
- Granular Permissions: Read、Write、Delete、List といった権限を最大 100 個のコンテナについてローカルユーザーに割り当てられます。
- Networking Considerations: SFTP 接続はポート 22 を使用します。Azure はファイアウォール、プライベートエンドポイント、または仮想ネットワークなどのネットワーク構成をサポートしSFTP トラフィックを保護できます。
### 設定要件
### Setup Requirements
- Hierarchical Namespace: ストレージアカウント作成時に HNS を有効にする必要があります。
- Supported Encryption: Microsoft Security Development Lifecycle (SDL) 承認の暗号アルゴリズム(例: rsa-sha2-256、ecdsa-sha2-nistp256を要求します。
- Supported Encryption: Microsoft Security Development Lifecycle (SDL) 承認の暗号アルゴリズム(例: rsa-sha2-256、ecdsa-sha2-nistp256が必要です。
- SFTP Configuration:
- Enable SFTP on the storage account.
- Create local user identities with appropriate permissions.
- Configure home directories for users to define their starting location within the container.
- ストレージアカウントで SFTP を有効化する。
- 適切な権限を持つローカルユーザーのアイデンティティを作成する。
- ユーザーごとの home directory を設定し、コンテナ内での開始位置を定義する。
### 権限
### Permissions
| Permission | Symbol | Description |
| 権限 | シンボル | 説明 |
| ---------------------- | ------ | ------------------------------------ |
| **Read** | `r` | ファイルの内容を読み取ります。 |
| **Write** | `w` | ファイルアップロードディレクトリ作成ができます。 |
| **List** | `l` | ディレクトリの内容を一覧表示します。 |
| **Delete** | `d` | ファイルディレクトリを削除します。 |
| **Create** | `c` | ファイルディレクトリを作成します。 |
| **Modify Ownership** | `o` | 所有ユーザーまたはグループを変更します。 |
| **Modify Permissions** | `p` | ファイルやディレクトリの ACL を変更します。 |
| **Read** | `r` | ファイルの内容を読み取ります。 |
| **Write** | `w` | ファイルアップロードし、ディレクトリ作成ます。 |
| **List** | `l` | ディレクトリの内容を一覧表示します。 |
| **Delete** | `d` | ファイルまたはディレクトリを削除します。 |
| **Create** | `c` | ファイルまたはディレクトリを作成します。 |
| **Modify Ownership** | `o` | 所有ユーザーまたはグループを変更します。 |
| **Modify Permissions** | `p` | ファイルやディレクトリの ACL を変更します。 |
## 列挙
## Enumeration
{{#tabs }}
{{#tab name="az cli" }}
<details>
<summary>az cli の列挙</summary>
<summary>az cli enumeration</summary>
```bash
# Get storage accounts
az storage account list #Get the account name from here
@@ -444,11 +459,12 @@ az-file-shares.md
../az-persistence/az-storage-persistence.md
{{#endref}}
## 参考文献
## 参考資料
- [https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- [https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview)
- [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support)
- [Holiday Hack Challenge 2025 Spare Key (Azure static website SAS leak)](https://0xdf.gitlab.io/holidayhack2025/act1/spare-key)
- [Holiday Hack Challenge 2025: Blob Storage (Storage Secrets)](https://0xdf.gitlab.io/holidayhack2025/act1/blob-storage)
- [https://learn.microsoft.com/en-us/cli/azure/storage/account](https://learn.microsoft.com/en-us/cli/azure/storage/account)
- [https://learn.microsoft.com/en-us/cli/azure/storage/container](https://learn.microsoft.com/en-us/cli/azure/storage/container)