From 7b2f131ad4794b3b30bf75b10ddcc25ac0df1a2a Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 5 Feb 2026 12:39:14 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/azure-security/az-basic-informatio --- .../az-tokens-and-public-applications.md | 159 +++++++++--------- 1 file changed, 80 insertions(+), 79 deletions(-) diff --git a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md index bcaf0bf2f..8962e99ff 100644 --- a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md +++ b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md @@ -4,97 +4,97 @@ ## 基本情報 -Entra IDは、Microsoftのクラウドベースのアイデンティティおよびアクセス管理(IAM)プラットフォームであり、Microsoft 365やAzure Resource Managerなどのサービスの基盤となる認証および認可システムとして機能します。Azure ADは、リソースへのアクセスを管理するためにOAuth 2.0認可フレームワークとOpenID Connect(OIDC)認証プロトコルを実装しています。 +Entra ID は Microsoft のクラウドベースの identity and access management (IAM) プラットフォームで、Microsoft 365 や Azure 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 の例に過ぎず、他にもあります。
-audの例 +aud examples -- **aad-graph (Azure Active Directory Graph API)**: レガシーAzure AD Graph API(非推奨)にアクセスするために使用され、アプリケーションがAzure Active Directory(Azure 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`
-### アクセストークンスコープ "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個人アカウント、FacebookやGoogleなどのソーシャルアカウント)において**すべてのリフレッシュトークンで可能です**。なぜなら、[**ドキュメント**](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 アカウント、および Facebook や Google のような 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 を見つけられるかを知ることは非常に重要です: -- **`/.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リクエストのキャッシュです +- **`/.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\\AppData\Local\Microsoft\IdentityCache\*`** 内には、ユーザーのDPAPIで暗号化された**アクセス トークン**、IDトークン、およびアカウント情報を含むいくつかの`.bin`ファイルがあります。 -- **`C:\Users\\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およびmacOSでAz 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\\AppData\Local\Microsoft\IdentityCache\*`** の中には複数の `.bin` ファイルがあり、access tokens、ID tokens、およびアカウント情報がユーザーの DPAPI で暗号化されている +- さらに **access tokens** は **`C:\Users\\AppData\Local\Microsoft\TokenBroken\Cache\`** 内の `.tbres` ファイルに、DPAPI で暗号化された base64 として含まれていることがある +- Linux と macOS では、Az PowerShell(使用されていれば)で `pwsh -Command "Save-AzContext -Path /tmp/az-context.json"` を実行すると access tokens, refresh tokens and id tokens を取得できる +- Windows ではこれは id tokens のみを生成する +- Linux と macOS で Az 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)