マネージドIDフローのマスター:PowerShellとMicrosoft Graphで
By Mirko Peters ·
ポッドキャストブログへようこそ!スクリプトに パスワードをハードコーディングしたり、面倒なクライアントシークレットを管理したり、自動化スクリプトから資格情報が漏えいしないか心配したりしたことがあるなら、ここが最適な場所です。
Automatically translated with AI from the original post. Read the English original
ポッドキャストブログへようこそ!パスワードのハードコーディング、面倒なクライアントシークレットの管理、自動化スクリプトでの資格情報の漏えいに悩んだことがあるなら、このページがお役に立つはずです。クラウド自動化では、セキュリティに対する考え方を転換する必要があります。もはや、資格情報をプレーンテキストの構成ファイルや環境変数に入れておき、誰にも見られないと安心していられる時代ではありません。本記事では、クラウドネイティブな認証の仕組みを詳しく解説します。特に、Azure のマネージド ID を PowerShell スクリプト内で活用し、機密性の高い資格情報を保存することなく Microsoft Graph に安全に認証する方法を取り上げます。
Microsoft 365 環境の自動化は、もはや「あると便利なスキル」ではなく、運用上どうしても必要なスキルです。ただし、PowerShell と Microsoft Graph API を組み合わせると、アクセス許可の確認、スロットリングの制限、複雑なトークン取得フローが入り組んだ迷路のように感じられることがあります。アイデンティティを中心に据えた最新のワークフローへと考え方を切り替えれば、Azure 内で動作するワークロードについては、資格情報の管理そのものを不要にできます。本記事では、クラウドネイティブ認証の重要な構成要素を分解し、前提条件、Azure AD アプリの登録、トークン取得フロー、スクリプトの最適化について順を追って解説します。この手順をさらに詳しく知りたい場合は、関連するポッドキャストエピソード Use Managed Identity with PowerShell for Microsoft Graph もぜひお聴きください。
PowerShell + Graph API の前提条件
PowerShell と Graph API を使って Microsoft 365 のタスクを自動化する前に、システムと環境を適切に準備する必要があります。この準備により、スクリプトを円滑に実行でき、Microsoft Graph のリソースへ安全にアクセスできるようになります。
PowerShell モジュールのインストール
Microsoft Graph API と連携するには、適切な PowerShell モジュールをインストールする必要があります。Microsoft Graph PowerShell SDK には、この連携に必要なcmdlet がすべて含まれています。エラーを避けるため、システムが次の最小要件を満たしているか確認してください。
| 要件 | 説明 |
|---|---|
| PowerShell のバージョン | クラウドスクリプトの最新環境には、PowerShell 7 以降が必要です。 |
| .NET Framework | 特に Windows 環境では、.NET Framework 4.7.2 以降が必要です。 |
| PowerShellGet | モジュール管理の安定性を確保するため、PowerShellGet を最新バージョンに更新してください。 |
| 実行ポリシー | スクリプトのインポートを許可するため、実行ポリシーを RemoteSigned 以下の制限に設定してください。 |
PowerShellGet は Install-Module PowerShellGet -Force を実行して更新できます。実行ポリシーは Set-ExecutionPolicy RemoteSigned で設定します。その後、次のコマンドで Microsoft Graph モジュールをインストールします。
Install-Module Microsoft.Graph -Scope CurrentUserこのコマンドは最新の安定版モジュールをダウンロードし、Microsoft Graph のエンドポイントを簡単に呼び出せるようにします。
Microsoft 365 環境のセットアップ
自動化を成功させるには、Microsoft 365 環境を正しく構成することが欠かせません。次の手順で開始してください。
- システムが要件を満たしていることを確認します。PowerShell 7.2 以降、.NET Framework 4.7.2 以降、最新の PowerShellGet モジュールが必要です。
- 上記のとおり Microsoft Graph PowerShell モジュールをインストールします。
- モジュールをインポートし、必要なスコープを指定して認証することで、Microsoft 365 テナントに接続します。例えば次のとおりです。
Connect-MgGraph -Scopes "User.ReadWrite.All","Directory.ReadWrite.All"このコマンドを実行するとサインインを求められ、ユーザーとディレクトリのデータを読み取りおよび書き込むためのアクセス許可がセッションに付与されます。自動化の要件に応じてスコープを調整できます。
アクセス許可とスコープの理解
アクセス許可とスコープは、スクリプトが Microsoft 365 内で何にアクセスでき、何を変更できるかを定義します。Microsoft Graph API には、主に 2 種類のアクセス許可があります。
- 委任されたアクセス許可: スクリプトをサインイン済みのユーザーとして実行する場合に適用されます。ユーザーが所有している、またはアクセスできるデータへのアクセスを制限します。
- アプリケーションのアクセス許可: サインイン済みのユーザーがいなくても、アプリやスクリプトが組織全体のデータにアクセスできるようにします。バックグラウンドの自動化やマネージド ID のフローで一般的に使われます。
一般的なアクセス許可には、読み取り専用アクセス用の *.Read.All と、読み取りと書き込みの完全なアクセス用の *.ReadWrite.All があります。たとえば、SecurityActions.Read.All ではセキュリティ アクションを表示でき、SecurityActions.ReadWrite.All ではそれを変更できます。
アプリケーションのアクセス許可には管理者の同意が必要です。セキュリティを確保するために、テナント管理者がこれらのアクセス許可を承認する必要があります。また、機密データにアクセスするには、Security Reader などの適切な Microsoft Entra ロールがユーザーに必要です。このロールベースのアクセス制御により、セキュリティの層がさらに増えます。
Microsoft Graph PowerShell SDK で接続する際は、スクリプトに必要なスコープのみを指定してください。これは最小権限の原則に従うもので、セキュリティリスクを低減します。アプリに付与されたアクセス許可は、そのアプリのすべてのユーザーに適用される点に注意し、定期的に見直して管理してください。
Entra ID におけるアプリ ID
新しいアプリの登録
PowerShell と Graph API で Microsoft 365 のタスクを自動化するには、まず Azure Active Directory (Azure AD) にアプリケーションを登録する必要があります。このアプリは、スクリプトが Microsoft Graph に安全にアクセスするために使用する ID として機能します。次の手順に従ってアプリを登録してください:
- Azure portal を開き、Azure Active Directory > アプリの登録 > 新規登録 の順に移動します。
- "My Graph Automation App" のように、わかりやすいアプリ名を付けます。
- サポートされているアカウントの種類を選択します:
- 単一テナント: Azure AD テナント内のユーザーのみがサインインできます。
- マルチテナント: 任意の Azure AD テナントのユーザーがサインインできます。
- マルチテナントおよび個人用アカウント: Azure AD ユーザーと個人用の Microsoft アカウントの両方がサインインできます。
- アプリの種類に応じて リダイレクト URI を設定します:
- Web アプリの場合は、
https://yourapp.com/auth/callbackのような URL を使用します。 - シングルページ アプリの場合は、
https://yourapp.comを使用します。 - モバイルまたはデスクトップ アプリの場合は、
https://login.microsoftonline.com/common/oauth2/nativeclientを使用します。
- Web アプリの場合は、
- 登録 をクリックしてアプリを作成します。
この手順により、テナント内に一意のアプリケーション ID が作成されます。この ID を使ってトークンを要求し、Microsoft Graph API を呼び出します。
API アクセス許可の構成
アプリを登録した後は、アプリに必要な API アクセス許可を構成する必要があります。これらのアクセス許可によって、アプリが Microsoft 365 内で何にアクセスしたり変更したりできるかが決まります。アクセス許可を設定するには:
- アプリの登録で、API のアクセス許可 > アクセス許可の追加 > Microsoft Graph の順に移動します。
- スクリプトが対話なしで実行される場合やマネージド ID のコンテキストで実行される場合はアプリケーションのアクセス許可を、対話形式で実行される場合は委任されたアクセス許可を選択します。
- アプリに必要な特定のアクセス許可を選択します(例:
User.Read.AllやDirectory.Read.All)。 - アクセス許可の追加 をクリックして適用します。
⚠️ 必ず最小権限の原則を適用してください。セキュリティリスクを減らすため、アプリに必要なアクセス許可のみを割り当ててください。
一部のアクセス許可は、アプリで使用する前に管理者の同意が必要です。Azure portal で [tenant name] に管理者の同意を付与 をクリックすると、この同意を付与できます。アプリに過剰な権限を与えないよう、アクセス許可を定期的に見直してください。
クライアント シークレットまたは証明書の生成
マネージド ID を使用しない場合、アプリが Azure AD で安全に認証するには資格情報が必要です。認証には クライアント シークレットか証明書のいずれかを使用できます。どちらの方法も、トークンを要求する際にアプリの ID を証明します。
| 方法 | メリット | デメリット |
|---|---|---|
| クライアント シークレット | 作成と使用が簡単で、多くの認証フローに対応します。 | パスワードと同じように扱われます。安全に保管しないと漏えいする可能性があり、侵害されても自動で通知されません。 |
| 証明書 | より安全です。認証時に証明書そのものを送信せず、即時の取り消しに対応します。 | 管理がより複雑で、堅牢なライフサイクルの追跡が必要です。 |
クライアント シークレットを作成するには、アプリの登録で 証明書とシークレット に移動し、新しいクライアント シークレット を選択して、説明を追加し、有効期限を設定します。証明書の場合は、同じセクションで有効な証明書ファイルをアップロードします。
アクセス トークンの取得
OAuth 2.0 の理解
OAuth 2.0 は、PowerShell と Graph API を使用する際に Microsoft Graph API へのアクセスを保護する重要な役割を果たします。信頼できるゲートキーパーとして機能し、アプリケーションが安全に認証を行い、アクセス トークンを取得できるようにします。これらのトークンはデジタル キーの役割を果たし、資格情報を直接公開することなく、スクリプトに Microsoft Graph エンドポイントを呼び出す権限を与えます。
OAuth 2.0 を使用するには、まずアプリケーションを Azure Active Directory(Azure AD)に登録する必要があります。この登録により、アプリケーション ID とシークレットや証明書などのクライアント資格情報が発行されます。スクリプトがアクセス トークンを要求すると、これらの資格情報を Azure AD に提示します。Azure AD は ID を検証し、有効期間の短いトークンを発行します。スクリプトは、要求したリソースにアクセスする権限があることを証明するために、このトークンを API 要求に含めます。
このプロセスにより、Microsoft 365 データへの安全で制御されたアクセスが確保されます。また、きめ細かなアクセス許可に対応しているため、スクリプトは必要なアクセスのみを取得できます。OAuth 2.0 の標準に従うことで、不正アクセスから環境を保護しつつ、PowerShell と Graph API による強力な自動化を実現できます。
トークン要求に PowerShell を使用する
シナリオに応じて調整された複数の認証フローを使用して、アクセス トークンを取得できます。各フローは、セキュリティと使いやすさのバランスが異なります。Microsoft Graph API は、次の一般的なフローをサポートしています。
- デバイス コード フロー: ブラウザーや入力機能がないデバイスやスクリプトに最適です。別のデバイスで認証するため、安全で使いやすい方法です。
- 証明書ベースのフロー: ヘッドレスの自動化向けに設計されたこのフローは、パスワードの代わりに証明書を使用するため、無人で実行されるスクリプトのセキュリティが強化されます。
- マネージド ID フロー: Azure Functions や仮想マシンなどのクラウド ネイティブ環境に最適です。このフローは Azure のマネージド ID を利用し、シークレットを保存せずにトークンを取得します。
デバイス コード フロー
デバイス コード フローは、入力が簡単ではないデバイスでスクリプトをローカルに実行する場合に適しています。スマートフォンや PC のブラウザーなど、別のデバイスで対話形式で認証できます。
PowerShell でデバイス コード フローを使用する手順は次のとおりです。
- 次のコマンドを実行して、デバイス コード認証を開始します。
Connect-MgGraph -Scopes "User.Read.All" -DeviceCode - PowerShell にコードと URL が表示されます。任意のデバイスのブラウザーで URL を開きます。
- PowerShell に表示されたコードを入力し、Microsoft 365 アカウントでサインインします。
- 認証に成功すると、PowerShell がアクセス トークンを取得し、セッションに接続します。
💡 デバイス コード フローは、セキュリティと使いやすさのバランスを取ります。スクリプトに資格情報を埋め込む必要がなく、手動または半自動のタスクに適しています。
証明書ベースのフロー
証明書ベースのフローは、ユーザーの操作なしで実行される自動化スクリプトに適しています。クライアント シークレットの代わりに証明書を使用して、アプリの ID を証明します。この方法により、シークレットの漏えいに関するリスクを軽減できます。
このフローを使用するには、次の手順に従います。
- アプリを Azure AD に登録し、証明書とシークレット で証明書をアップロードします。
- スクリプトを実行するマシンに証明書を安全に保存します。
- 証明書の拇印、クライアント ID、テナント ID を指定して、PowerShell でトークンを要求します。
以下は、PowerShell で証明書を使ってトークンを取得する方法の簡単な例です。
$tenantId = "YOUR_TENANT_ID"
$clientId = "YOUR_CLIENT_ID"
$certThumbprint = "YOUR_CERT_THUMBPRINT"
$cert = Get-Item Cert:\CurrentUser\My\$certThumbprint
$body = @{
grant_type = "client_credentials"
client_id = $clientId
scope = "https://graph.microsoft.com/.default"
client_assertion_type = "urn:ietf:params:oauth:client-assertion-type:jwt-bearer"
client_assertion = New-JwtToken -Certificate $cert -TenantId $tenantId -ClientId $clientId
}
$tokenResponse = Invoke-RestMethod -Method Post -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" -Body $body
$accessToken = $tokenResponse.access_token⚠️ 証明書の管理には注意が必要です。セキュリティを維持するために、秘密キーを保護し、証明書を定期的にローテーションしてください。
マネージド ID フロー
マネージド ID フローは、Azure Virtual Machines、Azure Functions、Azure Automation などの Azure サービス内で PowerShell と Graph API のスクリプトを実行する場合に最適です。Azure がリソースに ID を自動的に割り当てるため、資格情報を手動で管理する必要はありません。
マネージド ID を使用してアクセス トークンを取得するには、次の手順に従います。
- Azure リソースで、マネージド ID (システム割り当てまたはユーザー割り当て) を有効にします。
- Microsoft Graph PowerShell または Graph Explorer を使用して、必要な Microsoft Graph API のアクセス許可をこの ID に Azure AD で割り当てます。
- PowerShell を使用して、ローカルの Azure Instance Metadata Service (IMDS) からトークンを要求します。
マネージド ID を使用してトークンを取得する PowerShell のサンプル コードです。
$resource = "https://graph.microsoft.com"
$tokenAuthUri = "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=$resource"
$headers = @{ Metadata = "true" }
$response = Invoke-RestMethod -Method Get -Uri $tokenAuthUri -Headers $headers
$accessToken = $response.access_token🔐 マネージド ID フローを使用すると、スクリプトに秘密情報を保存する必要がなくなります。Azure 環境内で、安全かつシームレスな認証を提供します。
PowerShell + Graph API による API 呼び出し

PowerShell + Graph API で API を呼び出すと、Microsoft 365 のサービスを効果的に操作できます。API と正しく通信するには、HTTP 要求の組み立て方を理解することが不可欠です。
HTTP 要求の組み立て
Microsoft Graph API を操作する際は、HTTP 要求を正しく組み立てる必要があります。HTTP 要求の主な構成要素は次のとおりです。
- アクセス トークンの取得: 取得したトークンをヘッダーに使用します。
- ヘッダーの設定:
Content-Type: application/jsonやAuthorization: Bearer $accessTokenなどの必要なヘッダーを設定します。 - GET/POST 要求: 目的の Microsoft Graph API エンドポイントに対して、要求を明示的に送信します。
Invoke-RestMethod の使用
Invoke-RestMethod コマンドレットを使用すると、Microsoft Graph API との通信が簡単になります。HTTP 要求を送信し、応答を簡潔な形で受け取ることができます。動作と制限の概要は次のとおりです。
| 制限事項 / 要因 | 説明 |
|---|---|
| 1 回の呼び出しで取得できる最大結果数 | 負荷の高いエンドポイントでは、エラーを避けるために、1 回の呼び出しで 120 件未満の結果を要求することが推奨されています。 |
| エラー処理 | クエリ フィルターの構文が正しくない場合、コマンドレットが 400 Bad Request エラーを返すことがあります。 |
| パフォーマンス | ディレクトリ ログやサインイン アクティビティのデータを取得するとリソースを多く消費するため、適切なページングが必要です。 |
よく使用される API エンドポイント
Microsoft 365 の管理作業では、いくつかの Microsoft Graph API エンドポイントが頻繁に使用されます。代表的なものは次のとおりです。
| エンドポイント | 用途 |
|---|---|
| Office 365 グループ アクティビティ数の取得 | Microsoft 365 グループのレポートを実行し、アクティブなコラボレーションを特定します。 |
| グループのプラン一覧の取得 | Microsoft 365 グループに関連付けられているプランを確認します。 |
| 会話の投稿 | Microsoft 365 グループ内で新しい会話を開始します。 |
| 既定のノートブックの取得 | グループの既定のノートブックを取得します。 |
API 出力の管理
JSON 応答の理解
Microsoft Graph API と通信すると、データは JSON 形式で返されます。JSON (JavaScript Object Notation) は軽量で読みやすい形式です。データを効果的に操作するには、JSON 応答を理解することが重要です。典型的な JSON 応答は次のようになります。
{
"id": "1",
"displayName": "John Doe",
"mail": "john.doe@example.com"
}JSON から PowerShell オブジェクトへの変換
PowerShell で JSON データを扱うには、PowerShell オブジェクトに変換する必要があります。この変換により、データを簡単に操作できるようになります。その処理には ConvertFrom-Json コマンドレットを使用します。仕組みは次のとおりです。
$jsonData = '{"id": "1", "displayName": "John Doe", "mail": "john.doe@example.com"}'
$powerShellObject = $jsonData | ConvertFrom-Jsonでは、$powerShellObject には直接アクセスできるプロパティが含まれています。たとえば $powerShellObject.displayName のように指定できます。
データのフィルター処理と書式設定
PowerShell オブジェクトにデータを取得したら、要件に合わせてフィルター処理や書式設定を行えます。PowerShell には出力データを絞り込むためのさまざまな手法があります。たとえば、Microsoft Graph API を呼び出す際に OData クエリ パラメーターを使うと、API 側で直接結果を絞り込めます。
| クエリ パラメーター | 説明 | 例 |
|---|---|---|
| $expand | 関連するリソースを返します。 | /groups?$expand=members |
| $filter | 結果の行を絞り込みます。 | /users?$filter=startswith(givenName,'J') |
| $orderby | 結果を並べ替えます。 | /users?$orderby=displayName desc |
| $select | プロパティ (列) を絞り込みます。 | /users?$select=givenName,surname |
| $top | 結果の1ページあたりの件数を設定します。 | /users?$top=2 |
結果のエクスポート
PowerShell スクリプトの結果をエクスポートすることは、効果的なデータ管理に欠かせません。出力は CSV、JSON、XML などのさまざまな形式で保存できます。たとえば、次のようにしてユーザーの詳細情報をエクスポートできます。
$users = Get-MgUser -All
$users | Select-Object DisplayName, Mail | Export-Csv -Path "Users.csv" -NoTypeInformationベスト プラクティスとトラブルシューティング
エラーと API の制限への対処
Microsoft Graph API を使用する際、エラーは多くの場合、テナント固有の設定やアクセス許可の問題から発生します。インターネットからダウンロードしたスクリプトを環境に合わせて調整せずに実行し、失敗するケースも多く見られます。さらに、Microsoft Graph にはサービスを保護するためのレート制限があります。スクリプトが短時間に多すぎるリクエストを送信すると、API は 429 ステータス コードを返します。その場合は Retry-After ヘッダーを確認し、示された時間だけ待ってから再試行してください。
| スコープ | 種類 | 上限 | 備考 |
|---|---|---|---|
| Global (All Services) | すべて | アプリごとに 10 秒あたり 130,000 件 | Graph のすべてのサービスを通じた絶対的な上限 |
| Intune (General) | すべて | テナントごと、アプリごとに 20 秒あたり 1,000 件 | アプリのすべての操作に対する上限 |

資格情報の保護
Microsoft 365 のタスクを自動化する際は、資格情報の保護が極めて重要です。アプリの登録とマネージド ID を使用して、アプリケーション用の安全な ID を作成してください。可能な限り、クライアント シークレットをスクリプト内に平文で保存しないようにしてください。
スクリプトの最適化
効率的なスクリプトは時間を節約し、リソースの消費を抑えます。$select クエリ パラメーターを使って必要なプロパティだけを取得し、バッチ処理の仕組みを活用するとともに、自動化ループには適切なページング処理を組み込んでください。
PowerShell と Microsoft Graph API によるマネージド ID フローを習得すると、クラウド自動化へのアプローチが根本から変わります。静的なシークレットを排除し、クラウド ネイティブの ID を採用することで、企業を守る堅牢で安全性の高いワークフローを構築できます。これらの戦略や、最新のクラウド管理に関する実践的な議論をさらに知りたい方は、関連エピソードもぜひご覧ください: Use Managed Identity with PowerShell for Microsoft Graph。ぜひ今日からサンドボックス テナントでこれらの例を試し、自動化の仕組みを次のレベルへ引き上げてください。
よくある質問
PowerShell とは何ですか?
PowerShell は Microsoft が提供するタスク自動化フレームワークで、コマンド ライン シェルとスクリプト言語を組み合わせ、システム管理やクラウド運用を効率化します。
Microsoft Graph API とは何ですか?
Microsoft Graph API は、ユーザー、グループ、メール、ディレクトリ構成など、Microsoft 365 全体のデータやサービスにアクセスするための統合された RESTful エンドポイントです。
Microsoft Graph PowerShell モジュールをインストールするにはどうすればよいですか?
PowerShell 7 環境で Install-Module Microsoft.Graph -Scope CurrentUser を実行すると、モジュールをインストールできます。
委任されたアクセス許可とアプリケーションのアクセス許可の違いは何ですか?
委任されたアクセス許可では、アプリがサインインしたユーザーの代わりに動作できます。一方、アプリケーションのアクセス許可では、アクティブなユーザー コンテキストがなくてもバックグラウンドで実行できます。
API のレート制限にはどのように対処すればよいですか?
429ステータスコードを受け取った場合は、必ず応答ヘッダーの Retry-After の値を確認し、スクリプトに指数バックオフによる再試行ロジックを実装してください。
OAuth 2.0とは何ですか?
OAuth 2.0は、アプリケーションが基になるユーザーの資格情報を公開することなく、保護されたAPIを呼び出すためのアクセス トークンを安全に取得できるようにする認可フレームワークです。
PowerShellはLinuxで使用できますか?
はい。PowerShellは完全にクロスプラットフォーム対応であり、Windows、macOS、Linuxでネイティブに動作します。
PowerShellでデータをエクスポートするにはどうすればよいですか?
レポートの形式要件に応じて、Export-Csv や ConvertTo-Json などのコマンドレットを使えば、構造化データを簡単にエクスポートできます。