マイクロソフト グラフ APIは、ほぼすべての側面を単一のREST APIエンドポイントの下でAzure ADおよびOffice 365を読み取り、変更、管理できるサービスです。この記事では、APIをPowerShellグラフ APIに変換する方法について学びます。
前提条件
この記事で一緒に進む場合は、まず以下の基準を満たしていることを確認してください:
- Windows PowerShell 5.1を実行していること(これが私がテストしたバージョンです。他のバージョンでも動作する可能性がありますが、保証されません)
- Azureテナント
- グローバル管理者権限またはサブスクリプションに対するアプリ登録権限を持つアカウントでAzureに認証され、アプリ登録リクエストを受け入れるためのグローバル管理者がいること。
Microsoft Graph APIのアプリケーションアイデンティティの作成
Microsoft Graph APIにアクセスするには、最初にOAuthトークンを取得するためのアイデンティティが必要です。これは、Azure Portalで作成できるアプリケーションアイデンティティを使用して主に行われます。次の手順でアプリケーションアイデンティティを作成できます:アプリケーションアイデンティティの作成をクリックしてAzureポータルに移動します。
- Azureポータルに移動してAzure Active Directoryに移動します。
- 左側のメニューでApp Registrationsをクリックし、Manageの下のNew registrationボタンをクリックします。

- アプリケーションの名前を入力し、Registerをクリックします。
- 後で使用するためにアプリケーションIDのGUIDをコピーします。

Microsoft Graph APIのシークレットの作成
あなたはGraph APIには、AppId/Secretおよび証明書ベースの認証の2つの主要な方法で認証できます。PowerShellでGraph APIに接続する際には認証が必要です。
両方の方法で認証する手順を見てみましょう。
AppId/Secret
アプリケーションID/シークレットは通常のユーザー名/パスワードと同じです。アプリケーションIDはユーザー名の代わりにGUIDで構成され、パスワードはランダムな文字列です。
シークレットを作成するには、左メニューの証明書とシークレットをクリックし、新しいクライアントシークレットを選択します。

シークレットの説明を入力し、有効期限を選択します。これで、必要なデータにアクセスできるように許可を求めるだけです。
証明書
自己署名証明書を作成し、その公開鍵をAzureにアップロードすることが可能です。これが認証の好ましいかつより安全な方法です。
最初に自己署名証明書を生成する必要があります。幸運なことに、PowerShellで簡単に行うことができます。
さあ、セルフサイン証明書を$CerOutputPath
にエクスポートし、左のメニューの証明書とシークレットをクリックして証明書をアップロードしてAzureアプリケーションにアップロードします。

アプリケーションへの権限の追加
アプリケーションに適切な権限を与えることは重要です – アプリの機能だけでなくセキュリティにも関わります。Microsoft Graph APIのほぼすべての情報はドキュメントに記載されています。
設定が完了したら、テナントからすべてのセキュリティイベントを収集します。そのためには、最低限SecurityEvents.Read.Allの許可が必要です。これにより、不可能なトラベルイベント、VPN/TOR経由で接続するユーザーなどに対処できます。
アプリケーションにSecurityEvents.Read.Allを追加するには、「APIアクセス許可」をクリックしてから「アクセス許可の追加」をクリックします。これにより、Graph APIだけでなく、Azureの他のアプリケーションも表示されます。これらのアプリケーションのほとんどは、Microsoft Graph APIに接続する方法を知っていれば簡単に接続できます。
Microsoft Graphをクリックして、アプリケーションのアクセス許可、セキュリティイベントを選択し、SecurityEvents.Read.Allをチェックします。その後、「アクセス許可の追加」ボタンを押します。
管理者の同意が必要列にはいが設定されていることに気付きましたか?これは、許可がアプリケーションに追加される前にテナント管理者の承認が必要であることを意味します。

グローバル管理者の場合、管理者の同意を付与するをクリックするか、グローバル管理者に承認を依頼します。管理者が読み取り/書き込み許可を設定する代わりに、ユーザーからの許可を求めることは、OAuth認証の大部分を占めています。ただし、これにより、Microsoft Graphのほとんどの許可をバイパスできます。
おそらく、FacebookやGoogleで既に目にしていると思いますが、「アプリケーションXがプロフィールにアクセスすることを許可しますか?」

これで準備完了です。ログインしてデータを取得しましょう!
アクセストークン(アプリケーションIDとシークレット)を取得
するには、Microsoft Graph OAuthエンドポイントにリクエストを投稿する必要があります。そのリクエストのボディには、以下の情報を提供する必要があります:
client_id
– アプリケーションID – URLエンコード済みclient_secret
– アプリケーションのシークレット – URLエンコード済みscope
– アクセスしたいリソースを指定するURL形式でエンコード済みgrant_type
– 使用している認証メソッド
エンドポイントのURLは、https://login.microsoftonline.com/<tenantname>/oauth2/v2.0/tokenです。以下のコードスニペットを使用して、PowerShellとGraph APIでアクセストークンをリクエストすることができます。
アクセストークンの取得(証明書を使用する場合)
証明書を使用してMicrosoft Graph APIに認証する場合、通常のAppId/シークレットのフローとは異なります。証明書を使用してアクセストークンを取得するには、以下の手順を実行する必要があります:
- Java Web Token(JWT)ヘッダーを作成します。
- JWTペイロードを作成します。
- 以前に作成した自己署名証明書でJWTヘッダーとペイロードに署名します。これにより、Microsoft Graphアクセストークンを要求するために使用される自己作成のアクセストークンが作成されます。
- 次の内容を含むリクエストボディを作成します:
client_id=<アプリケーションID>
client_assertion=<JWT>
client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
scope=<URLエンコードされたスコープ>
grant_type=client_credentials
- ヘッダーに
Authorization=<JWT>
を含めて、OAuthエンドポイントに対してPOSTリクエストを行います。
これを実現するPowerShellスクリプトは、Microsoftのドキュメントでは明確ではありませんが、以下に示します。
理解リクエストアクセストークンの出力
アプリケーションID/シークレットまたは証明書を介してアクセストークンを取得したら、四つのプロパティを持つオブジェクトが表示されるはずです。
token_type
– トークンの種類expires_in
– アクセストークンの有効期限(秒単位)ext_expires_in
–expires_in
と同様ですが、トークンサービスの障害に対処するためのものaccess_token
– 我々が求めていたもの
次に、token_type
とaccess_token
を使用してヘッダーを作成し、PowerShellを使用してMicrosoft Graph APIにリクエストを開始します。
Microsoft Powershell Graph APIへのリクエストの作成
さあ、APIに対していくつかのリクエストを開始します。
例を挙げると、まずセキュリティアラートをリストアップするためのURLが必要です。必要なものはMicrosoft Graph APIドキュメントを参照してください。
この場合、Authorization=Bearer <access_token>
を含むヘッダーとGraph API Alertsエンドポイントに向けたGETリクエストが必要です。PowerShellでこれを行う方法は次の通りです。
これで$SecurityAlerts
変数にセキュリティアラートがあれば、次のように見えるはずです。
JSONとして単一のセキュリティアラートを検査すると、次のようになります。
API出力ページの理解と管理
Microsoft Graph APIには、返されるアイテムの数に関する各機能ごとの制限があります。この制限は各機能ごとに存在しますが、たとえばアイテムが1000個の場合、そのリクエストで取得できる最大のアイテム数が1000個ということです。
この制限に達すると、残りのアイテムを配信するためにページングが使用されます。これは、リクエストの回答に@odata.nextLink
プロパティを追加することで行われます。@odata.nextLink
には、リクエストの次のページを取得するために呼び出せるURLが含まれています。
結論
Graph APIに認証する方法を学んだら、そこからデータを収集するのはかなり簡単です。これは、十分に活用されていない強力なサービスです。
幸いにも、既にMicrosoft Graph APIを利用するための多くのモジュールが存在していますが、独自のニーズに合わせるためには、独自のモジュールを作成する必要があるかもしれません。この記事で学んだスキルを使用すれば、十分に進んだ段階にあるはずです。
Office 365でゲストアクセスを制御する詳細な情報については、私のブログで詳細な記事を書いています。ぜひチェックしてみてください。