Translated ['', 'src/pentesting-cloud/azure-security/az-basic-informatio

This commit is contained in:
Translator
2026-02-05 12:39:14 +00:00
parent 2280b5895d
commit 7b2f131ad4

View File

@@ -4,97 +4,97 @@
## 基本情報
Entra IDは、Microsoftのクラウドベースのアイデンティティおよびアクセス管理(IAMプラットフォームであり、Microsoft 365Azure Resource Managerなどのサービスの基盤となる認証および認可システムとして機能します。Azure ADは、リソースへのアクセスを管理するためにOAuth 2.0認可フレームワークとOpenID ConnectOIDC認証プロトコルを実装してます。
Entra IDMicrosoft のクラウドベースの identity and access management (IAM) プラットフォームで、Microsoft 365Azure Resource Manager のようなサービスの認証と認可の基盤として機能します。Azure AD は OAuth 2.0 認可フレームワークと OpenID Connect (OIDC) 認証プロトコルを実装して、リソースへのアクセスを管理します。
### OAuth
**OAuth 2.0の主参加者:**
OAuth 2.0 の主参加者:
1. **リソースサーバーRS:** リソースオーナーが所有するリソースを保護します。
2. **リソースオーナー(RO:** 通常、保護されたリソースを所有するエンドユーザーです。
3. **クライアントアプリケーションCA:** リソースオーナーの代理としてリソースへのアクセスを求めるアプリケーションです
4. **認可サーバーAS:** クライアントアプリケーションを認証および認可した後、アクセス トークンを発行します。
1. **Resource Server (RS):** リソースオーナーが所有するリソースを保護します。
2. **Resource Owner (RO):** 通常、保護されたリソースを所有するエンドユーザーです。
3. **Client Application (CA):** リソースオーナーに代わってリソースへのアクセスを求めるアプリケーション。
4. **Authorization Server (AS):** クライアントアプリを認証・認可した後、アクセス トークンを発行します。
**スコープと同意:**
- **スコープ:** アクセスレベルを指定するリソースサーバー上で定義された詳細な権限です。
- **同意:** リソースオーナーが特定のスコープでリソースにアクセスするためのクライアントアプリケーションに権限を付与するプロセスです
- **Scopes:** リソースサーバー上で定義される細かな権限で、アクセスレベルを指定します。
- **Consent:** リソースオーナーが特定のスコープでクライアントアプリにリソースへのアクセス権を付与するプロセス。
**Microsoft 365統合:**
**Microsoft 365統合:**
- Microsoft 365はIAMのためにAzure ADを利用し、複数の「ファーストパーティ」OAuthアプリケーションで構成されています。
- これらのアプリケーションは深く統合されており、相互依存するサービス関係を持っています。
- ユーザーエクスペリエンスを簡素化し機能を維持するため、Microsoftはこれらのファーストパーティアプリケーションに「暗黙の同意」または「事前同意」を付与します。
- **暗黙の同意:** 特定のアプリケーションは、明示的なユーザーまたは管理者の承認なしに特定のスコープへのアクセスを**自動的に付与されます**。
- これらの事前同意されたスコープは通常、ユーザーや管理者から隠されており、標準の管理インターフェースではあまり目立ちません
- Microsoft 365 は IAM に Azure AD を利用しており、複数の「first-party」OAuth アプリケーションで構成されています。
- これらのアプリケーションは深く統合されており、サービス間で相互依存関係を持つことが多いです。
- ユーザー体験を簡素化し機能を維持するため、Microsoft はこれらの first-party アプリに対して「implied consent」または「pre-consent」を付与します。
- **Implied Consent:** 特定のアプリケーションは**ユーザー管理者の明示的な承認なしに特定のスコープへのアクセス自動的に付与されます**。
- これらの事前承認されたスコープは通常、ユーザーや管理者の双方から隠されており、標準の管理インターフェースでは見えにくくなっています
**クライアントアプリケーションの種類:**
1. **機密クライアント:**
-の資格情報(例パスワードや証明書)を持っています。
- 認可サーバーに**安全に自己認証**できます
2. **パブリッククライアント:**
- ユニークな資格情報を持っていません。
- 認可サーバーに安全に認証できません。
- **セキュリティの影響:** 攻撃者は、認可サーバーがアプリケーションの正当性を確認するメカニズムがないため、トークンを要求する際にパブリッククライアントアプリケーションを偽装できます。
1. **Confidential Clients:**
- 自の資格情報(例: パスワードや証明書)を持ます。
- Authorization Server に対して**安全に自身を認証できる**
2. **Public Clients:**
- 固有の資格情報を持ません。
- Authorization Server に対して安全に認証することができません。
- **Security Implication:** Authorization Server がアプリの正当性を検証する仕組みがないため、トークン取得時に攻撃者が public client アプリを偽装できる可能性があります。
## 認証トークン
OIDCで使用される**3種類のトークン**があります
OIDC で使用される**3種類のトークン**があります:
- [**アクセス トークン**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** クライアントはこのトークンをリソースサーバーに提示して**リソースにアクセス**します。これは特定のユーザー、クライアント、およびリソースの組み合わせのみ使用でき、**期限切れまで取り消すことはできません** - デフォルトで1時間です
- **IDトークン:** クライアントはこの**トークンを認可サーバーから受け取ります**。ユーザーに関する基本情報が含まれています。これは**特定のユーザーとクライアントの組み合わせにバインドされています**。
- **リフレッシュトークン:** アクセストークンとにクライアントに提供されます。**新しいアクセスおよびIDトークンを取得するために使用されます**。これは特定のユーザーとクライアントの組み合わせにバインドされており、取り消すことができます。非アクティブなリフレッシュトークンのデフォルト有効期限は**90日**で、アクティブなトークンには**有効期限がありません**(リフレッシュトークンから新しいリフレッシュトークンを取得することが可能です)。
- リフレッシュトークンは**`aud`**、いくつかの**スコープ**、および**テナント**に結び付けられており、そのaud、スコープ(それ以上ではな)およびテナントのためにのみアクセス トークンを生成できる必要があります。ただし、これは**FOCIアプリケーショントークン**には当てはまりません。
- リフレッシュトークンは暗号化されており、Microsoftのみがそれを復号化できます。
- [**Access Tokens**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** クライアントはこのトークンをリソースサーバーに提示して**リソースにアクセス**します。これは特定のユーザー、クライアント、リソースの組み合わせのみ使用可能で、期限切れまで**取り消すことはできませんデフォルトで1時間**
- **ID Tokens**: クライアントはこの**トークンを authorization server から受け取ります**。ユーザーに関する基本情報を含みます。特定のユーザーとクライアントの組み合わせに**紐づいています**。
- **Refresh Tokens**: アクセストークンとともにクライアントに提供されます。新しいアクセスおよび ID トークンを取得するために使用されます特定のユーザーとクライアントの組み合わせに紐づき、取り消すことができます。非アクティブな refresh token のデフォルト有効期限は **90 days** で、アクティブなトークンには**有効期限がありません**(リフレッシュトークンから新しいリフレッシュトークンを取得することが可能なため)。
- リフレッシュトークンは **`aud`**、いくつかの **scopes**、および **tenant** に紐づくべきであり、その aud、scopes(それ以上ではな)およびテナントのためアクセストークンのみを生成できるべきです。しかし、これは **FOCI applications tokens**は当てはまりません。
- リフレッシュトークンは暗号化されており、復号できるのは Microsoft のみす。
- 新しいリフレッシュトークンを取得しても、以前のリフレッシュトークンは取り消されません。
> [!WARNING]
> **条件付きアクセス**に関する情報は**JWT**に**保存**されています。したがって、**許可されたIPアドレス**から**トークンを要求**すると、その**IP**トークンに**保存**され、そのトークンを使用して**許可されていないIPからリソースにアクセス**できます。
> **条件付きアクセス** に関する情報は **JWT** の内部に**格納**されます。したがって、**許可された IP アドレスからトークンを要求すると**、その **IP**トークンに**格納**され、後で**許可されていない IP からそのトークンを使ってリソースにアクセスできる**ようになります。
### アクセストークン "aud"
### Access Tokens "aud"
"aud"フィールドに示されたフィールドは、ログインを実行するために使用される**リソースサーバー**(アプリケーション)です。
"aud" フィールドに示される値は、ログインを実行するために使用される**resource server**(アプリケーション)です。
コマンド`az account get-access-token --resource-type [...]`は、以下のタイプをサポートしており、それぞれが結果のアクセス トークンに特定の"aud"を追加します
コマンド `az account get-access-token --resource-type [...]` は次のタイプをサポートしており、それぞれが結果のアクセス トークンに特定の "aud" を追加します:
> [!CAUTION]
> 以下は`az account get-access-token`サポートされているAPIに過ぎませんが、他にもあります。
> 次に示すのは `az account get-access-token`サポートする API の例に過ぎず、他にもあります。
<details>
<summary>audの例</summary>
<summary>aud examples</summary>
- **aad-graph (Azure Active Directory Graph API)**: レガシーAzure AD Graph API非推奨にアクセスするために使用され、アプリケーションがAzure Active DirectoryAzure AD)内のディレクトリデータを読み書きすることを可能にします。
- **aad-graph (Azure Active Directory Graph API)**: レガシーAzure AD Graph API非推奨にアクセスするために使用され、アプリケーションが Azure Active Directory (Azure AD) のディレクトリデータを読み書きできるようにします。
- `https://graph.windows.net/`
* **arm (Azure Resource Manager)**: Azure Resource Manager APIを通じてAzureリソースを管理するために使用されます。これには仮想マシン、ストレージアカウントなどのリソースの作成、更新、削除などの操作が含まれます。
* **arm (Azure Resource Manager)**: Azure Resource Manager API を通じて Azure リソースを管理するために使用されます。これには仮想マシン、ストレージアカウントなどのリソースの作成、更新、削除といった操作が含まれます。
- `https://management.core.windows.net/ or https://management.azure.com/`
- **batch (Azure Batch Services)**: 大規模並列および高性能コンピューティングアプリケーションをクラウドで効率的に実行するためのサービスであるAzure Batchにアクセスするために使用されます。
- **batch (Azure Batch Services)**: 大規模並列処理や高性能コンピューティングアプリケーションをクラウドで効率的に実行するための Azure Batch にアクセスするために使用されます。
- `https://batch.core.windows.net/`
* **data-lake (Azure Data Lake Storage)**: スケーラブルなデータストレージおよび分析サービスであるAzure Data Lake Storage Gen1と対話するために使用されす。
* **data-lake (Azure Data Lake Storage)**: Azure Data Lake Storage Gen1 と対話するために使用される、スケーラブルなデータストレージおよび分析サービスです。
- `https://datalake.azure.net/`
- **media (Azure Media Services)**: ビデオおよびオーディオコンテンツのためのクラウドベースのメディア処理および配信サービスを提供するAzure Media Servicesにアクセスするために使用されます。
- **media (Azure Media Services)**: ビデオオーディオコンテンツのクラウドベースのメディア処理および配信サービスである Azure Media Services にアクセスするために使用されます。
- `https://rest.media.azure.net`
* **ms-graph (Microsoft Graph API)**: Microsoft 365サービスデータのための統一エンドポイントであるMicrosoft Graph APIにアクセスするために使用されます。Azure AD、Office 365、Enterprise Mobility、およびSecurityサービスなどのサービスからデータインサイトにアクセスできます。
* **ms-graph (Microsoft Graph API)**: Microsoft 365 サービスデータに対する統一エンドポイントである Microsoft Graph API にアクセスするために使用されます。これにより、Azure AD、Office 365、Enterprise Mobility、Security services などのサービスからデータインサイトにアクセスできます。
- `https://graph.microsoft.com`
- **oss-rdbms (Azure Open Source Relational Databases)**: MySQL、PostgreSQL、MariaDBなどのオープンソースリレーショナルデータベースエンジンのためのAzure Databaseサービスにアクセスするために使用されます。
- **oss-rdbms (Azure Open Source Relational Databases)**: MySQL、PostgreSQL、MariaDB のようなオープンソースリレーショナルデータベースエンジン向けの Azure Database サービスにアクセスするために使用されます。
- `https://ossrdbms-aad.database.windows.net`
</details>
### アクセストークンスコープ "scp"
### Access Tokens Scopes "scp"
アクセストークンのスコープは、アクセストークンJWT内のscpキーに保存されています。これらのスコープ、アクセストークンがアクセスできるものを定義します。
アクセス トークンのスコープは、アクセス トークンJWT 内の scp キーに格納されます。これらのスコープ、アクセス トークンが何にアクセスできるを定義します。
JWTが特定のAPIに連絡することが許可されているが、**要求されたアクションを実行するためのスコープを持っていない場合**、そのJWTアクションを**実行できません**。
JWT が特定の API にアクセスすることが許可されていても、要求されたアクションを実行するための**スコープを持っていない**場合、その JWT ではそのアクションを**実行できません**。
### リフレッシュおよびアクセストークンの取得例
### Get refresh & access token example
```python
# Code example from https://github.com/secureworks/family-of-client-ids-research
import msal
@@ -106,7 +106,7 @@ from typing import Any, Dict, List
# LOGIN VIA CODE FLOW AUTHENTICATION
azure_cli_client = msal.PublicClientApplication(
"04b07795-8ddb-461a-bbee-02f9e1bf7b46" # ID for Azure CLI client
"00b41c95-dab0-4487-9791-b9d2c32c80f2" # ID for Office 365 Management
)
device_flow = azure_cli_client.initiate_device_flow(
scopes=["https://graph.microsoft.com/.default"]
@@ -144,31 +144,31 @@ scopes=["https://graph.microsoft.com/.default"],
)
pprint(new_azure_cli_bearer_tokens_for_graph_api)
```
### その他のアクセストークンフィールド
### その他の access token フィールド
- **appid**: トークンを生成するために使用されるアプリケーションID
- **appidacr**: アプリケーション認証コンテキストクラスリファレンスは、クライアントがどのように認証されたかを示します。パブリッククライアントの場合値は0で、クライアントシークレットが使用される場合、値は1です。
- **acr**: 認証コンテキストクラスリファレンスクレームは、エンドユーザーの認証がISO/IEC 29115の要件を満たさなかった場合に「0」となります
- **amr**: 認証方法は、トークンがどのように認証されたかを示します。「pwd」の値は、パスワードが使用されたことを示します。
- **groups**: プリンシパルがメンバーであるグループを示します。
- **iss**: 発行者は、トークンを生成したセキュリティトークンサービスSTS)を特定します。例: https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/uuidはテナントIDです
- **oid**: プリンシパルのオブジェクトID
- **tid**: テナントID
- **iat, nbf, exp**: 発行日時(いつ発行されたか)、使用不可日時(この時以前は使用できない、通常iatと同じ値、有効期限。
- **appid**: トークンを生成するために使用された Application ID
- **appidacr**: The Application Authentication Context Class Reference はクライアントがどのように認証されたかを示す。public client の場合値は 0、client secret が使われた場合は 1
- **acr**: The Authentication Context Class Reference クレームは、エンドユーザーの認証が ISO/IEC 29115 の要件を満たしていない場合 "0" になる
- **amr**: The Authentication method はトークンがどのように認証されたかを示す。値が “pwd” の場合はパスワードが使用されたことを示す。
- **groups**: プリンシパルがメンバーであるグループを示す。
- **iss**: トークンを生成したセキュリティトークンサービス (STS) を識別する。例: https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/ uuid は tenant ID
- **oid**: プリンシパルの object ID
- **tid**: Tenant ID
- **iat, nbf, exp**: Issued at発行時刻、Not before(この時以前は使用できない、通常 iat と同じ値)、Expiration time有効期限
## FOCIトークンの特権昇格
## FOCI Tokens Privilege Escalation
以前に述べたように、リフレッシュトークンは生成された**スコープ**、**アプリケーション**、および**テナント**に結びついている必要があります。これらの境界のいずれかが破られると、ユーザーがアクセスできる他のリソースやテナントに対してアクセストークンを生成できるため、特権を昇格させることが可能です
以前に述べたように、refresh tokens は生成された **scopes**、生成先の **application**、および生成先の **tenant** に紐付けられるべきである。これらの境界のいずれかが破られると、ユーザーがアクセスできる他のリソースやテナント向けの access tokens を、元々意図されていたより多くの scopes で生成できるようになり、escalate privileges が可能になる
さらに、これは[Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/)Microsoft Entraアカウント、Microsoft個人アカウント、FacebookGoogleなどのソーシャルアカウント)において**すべてのリフレッシュトークンで可能です**。なぜなら、[**ドキュメント**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens)に記載されているように、「リフレッシュトークンはユーザーとクライアントの組み合わせに結びついていますが、**リソースやテナントには結びついていません**。クライアントは、許可されている任意のリソースとテナントの組み合わせに対してアクセストークンを取得するためにリフレッシュトークンを使用できます。リフレッシュトークンは暗号化されており、Microsoft identity platformのみがそれを読み取ることができます。」
さらに、[Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/)Microsoft Entra アカウント、Microsoft personal アカウント、および FacebookGoogle のような social accounts を含む)では、[**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens) に記載されているとおり、**this is possible with all refresh tokens**: "Refresh tokens are bound to a combination of user and client, but **aren't tied to a resource or tenant**. A client can use a refresh token to acquire access tokens **across any combination of resource and tenant** where it has permission to do so. Refresh tokens are encrypted and only the Microsoft identity platform can read them."
さらに、FOCIアプリケーションはパブリックアプリケーションであるため、サーバーに認証するために**シークレットは必要ありません**
また、FOCI アプリケーションは public applications であるため、サーバーに対して認証するのに **no secret is needed** である点にも注意すること
次に、[**元の研究**](https://github.com/secureworks/family-of-client-ids-research/tree/main)報告された既知のFOCIクライアントは、[**こちら**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv)で見つけることができます
既知の FOCI クライアントは [**original research**](https://github.com/secureworks/family-of-client-ids-research/tree/main)報告されており、[**found here**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv) で確認できる
### 異なるスコープを取得
### 異なる scope を取得
前の例のコードに続いて、このコードでは異なるスコープの新しいトークン要求しています:
前のサンプルコードの続きで、このコードでは異なる scope のための新しいトークン要求されている:
```python
# Code from https://github.com/secureworks/family-of-client-ids-research
azure_cli_bearer_tokens_for_outlook_api = (
@@ -201,27 +201,28 @@ scopes=["https://graph.microsoft.com/.default"],
# How is this possible?
pprint(microsoft_office_bearer_tokens_for_graph_api)
```
## トークンの見つけ方
## tokens を見つける場所
攻撃者の視点から見ると、例えば被害者のPCが侵害された場合にアクセスおよびリフレッシュトークンを見つけることができる場所を知ることは非常に興味深いです
攻撃者の観点では、被害者のPCが侵害された場合にどこで access and refresh tokens を見つけられるかを知ることは非常に重要です:
- **`<HOME>/.Azure`**
- **`azureProfile.json`** は過去ログインユーザーに関する情報が含まれています
- **`clouds.config`** はサブスクリプションに関する情報が含まれています
- **`service_principal_entries.json`** はアプリケーションの資格情報(テナントID、クライアントおよびシークレットが含まれています。LinuxおよびmacOSのみ
- **`msal_token_cache.json`** にはアクセス トークンとリフレッシュ トークンが含まれています。LinuxおよびmacOSのみ
- **`service_principal_entries.bin`** と **`msal_token_cache.bin`** はWindowsで使用され、DPAPIで暗号化されています
- **`msal_http_cache.bin`** はHTTPリクエストのキャッシュです
- **`<HOME>/.Azure`** の中
- **`azureProfile.json`** は過去ログインしたユーザーの情報を含む
- **`clouds.config contains`** はサブスクリプションに関する情報
- **`service_principal_entries.json`** はアプリケーションの認証情報(tenant id、clients、secretを含む。Linux & macOS のみ
- **`msal_token_cache.json`** は access tokens と refresh tokens を含む。Linux & macOS のみ
- **`service_principal_entries.bin`** と msal_token_cache.bin は Windows で使用され、DPAPI で暗号化されてい
- **`msal_http_cache.bin`** は HTTP リクエストのキャッシュ
- 読み込む: `with open("msal_http_cache.bin", 'rb') as f: pickle.load(f)`
- **`AzureRmContext.json`** はAz PowerShellを使用した以前のログインに関する情報が含まれています(ただし資格情報は含まれていません
- **`C:\Users\<username>\AppData\Local\Microsoft\IdentityCache\*`** 内には、ユーザーのDPAPIで暗号化された**アクセス トークン**、IDトークン、およびアカウント情報を含むいくつかの`.bin`ファイルがあります。
- **`C:\Users\<username>\AppData\Local\Microsoft\TokenBroken\Cache\`** 内の`.tbres`ファイルに、DPAPIで暗号化されたアクセス トークンを含むbase64含まれているため、さらに**アクセス トークン**を見つけることができます。
- LinuxおよびmacOSでは、Az PowerShell使用されている場合)から**アクセス トークン、リフレッシュ トークン、およびIDトークン**を取得できます。コマンドを実行するには `pwsh -Command "Save-AzContext -Path /tmp/az-context.json"`使用します。
- WindowsではこれによりIDトークンのみ生成されます。
- LinuxおよびmacOSAz PowerShellが使用されたかどうかを確認するには、`$HOME/.local/share/.IdentityService/` 存在するかどうかを確認します(ただし含まれているファイルは空で無用です)。
- ユーザーが**ブラウザでAzureにログインしている**場合、[**この投稿**](https://www.infosecnoodle.com/p/obtaining-microsoft-entra-refresh?r=357m16&utm_campaign=post&utm_medium=web)によると、**localhostへのリダイレクト**で認証フローを開始し、ブラウザ自動的にログインを承認し、リフレッシュトークンを受け取ることが可能で。localhostへのリダイレクトを許可するFOCIアプリケーションは限られているためaz cliやPowerShellモジュールなど)、これらのアプリケーションが許可されている必要があります。
- **`AzureRmContext.json`** は Az PowerShell を使った過去のログイン情報を含む(ただし資格情報は含まない
- **`C:\Users\<username>\AppData\Local\Microsoft\IdentityCache\*`** の中には複数の `.bin` ファイルがあり、access tokens、ID tokens、およびアカウント情報がユーザーの DPAPI で暗号化されている
- さらに **access tokens****`C:\Users\<username>\AppData\Local\Microsoft\TokenBroken\Cache\`** 内の `.tbres` ファイルに、DPAPI で暗号化された base64 として含まれていることがある
- LinuxmacOS では、Az PowerShell使用されていれば)で `pwsh -Command "Save-AzContext -Path /tmp/az-context.json"`実行すると access tokens, refresh tokens and id tokens を取得できる
- Windows ではこれは id tokens のみ生成する
- LinuxmacOSAz PowerShell が使用されたかどうか`$HOME/.local/share/.IdentityService/` 存在を確認することでわかる(ただし含まれるファイルは空で役に立たない)
- ユーザーがブラウザで Azure にログインしている場合、こちらの [**post**](https://www.infosecnoodle.com/p/obtaining-microsoft-entra-refresh?r=357m16&utm_campaign=post&utm_medium=web) によれば、authentication flow を **redirect to localhost**開始し、ブラウザ自動ログインを承認させて refresh token を受け取ることが可能である。localhost への redirect を許可する FOCI applications は限られている(例: az cli や powershell moduleため、これらのアプリケーションが許可されている必要があ
- ブログで説明されている別の方法として、任意のアプリケーションを使えるツール [**BOF-entra-authcode-flow**](https://github.com/sudonoodle/BOF-entra-authcode-flow) を使用する手法がある。これはリダイレクト URI `https://login.microsoftonline.com/common/oauth2/nativeclient` を用い、最終認証ページのタイトルから OAuth code を取得してから refresh token を取得する
## 参考文献
## 参考資料
- [https://github.com/secureworks/family-of-client-ids-research](https://github.com/secureworks/family-of-client-ids-research)
- [https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md](https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md)