PowerShell SDK を使用したマイクロソフトグラフへの接続のアップダウン
で 前の記事では、2022 年 6 月 30 日に終了する前に、PowerShell 用 Microsoft Graph SDK のコマンドレットを使用して、Azure AD モジュールのライセンス管理コマンドレットを置き換える方法について説明します。結局のところ、次のようなコマンドレットに置き換えることで、いくつかの Azure AD コマンドレットを変換します。 ゲット・Mgユーザー そして セット-MgUserライセンス 特に難しいことではありません(もしそうなら、私はそれを行うことはできません)。ただし、運用環境で使用される PowerShell の組み合わせに新しいモジュールを導入すると、常にいくつかの疑問や懸念が生じますが、少なくともセキュリティはもちろん、問題が生じます。
Graph SDK コマンドレットをテスト環境や実稼働環境で使用するには、正しい方法と間違った方法があります。簡単に言うと、コマンドレットを対話的に実行するのは簡単ですが、アクセス許可超過のサービス プリンシパル (アプリ) に問題が発生する可能性があります。これは、Graph SDK の接続方法と、その接続に使用するアクセス許可に関係します。その理由を見てみましょう。
続きを読む: マイクロソフトは、グラフに Office 365 サービス通信 API を移動しています。
グラフ SDK への接続
Graph SDK を使用する場合の最初の手順は、 コネクト・Mgグラフ コマンドレット。実行する場合 コネクト・Mgグラフ グラフに接続するには、接続するテナントの識別子を指定するのが賢明です。
コネクトMgGraph -テナントId “828e1143-88e3-492b-bf82-24c4a47ada63"
繋ぐ–Mgグラフ –テナントID “828e1143-88e3-492b-bf82-24c4a47ada63" |
テナントを指定しない場合は、 コネクト・Mgグラフ セッション中にサインインした最後のテナントを選択します (接続先ではない可能性があります)。グラフに接続し、使用されたデータが開発テナントに属していることを発見しました。私はその時気づいたが、誰かが他の場所でこれを見逃す可能性があるので、テナント識別子と接続することを習慣にします。
セッションは、実行するまで続きます 切断- MgGraph (下記参照)、実行することで何日かの間に何度も再開できます。 コネクト・Mgグラフ.その背後で、Graph SDK は暗号化されたトークン キャッシュを保持し、必要に応じてトークンを更新して、Graph コマンドを使用できるようにします。
権限
接続が成功すると、セッションはアカウントとしてサインインします。接続のアクセス許可のスコープは、SDK 用の Azure AD に登録されているサービス プリンシパル (エンタープライズ アプリ) から取得されます。これまで Graph SDK でサインインしたことがない場合は、サービス プリンシパルが作成されます。 マイクロソフトグラフパワーシェル(プレビュー) のアプリIDを持つ 14d82eec-204b-4c2f-b7e8-296a70dab67e 制限されたアクセス許可を要求します (図 1)。管理者は、組織の代理としてこれらのアクセス許可に同意を付与できます。警戒管理者の合理的な疑いを和らげるために、サービスプリンシパルが検証済みとして現れた場合は良いことですが、現在はそうではありません。

新しいアクセス許可の収集
ユーザーが対話式クライアントを使用して Graph SDK コマンドを実行し始めると、コマンドの実行に必要なアクセス許可に同意する必要があります。たとえば、 ゲット・Mgユーザー コマンドレットを使用して一連の Azure AD アカウントを取得するには、ユーザーがディレクトリ情報を読み取るためのアクセス許可が必要であるため、 スコープ 次のように接続を行う場合は、次のパラメータを指定します。
$RequiredScopes = @(ディレクトリ.アクセスアスユーザー.すべて、ディレクトリ.読み書き.すべて)
コネクトMgGraph – スコープ$RequiredScopes
$必要なスコープ = @(ディレクトリ.アクセスアスユーザー.すべての, ディレクトリ.読み取り書き込み.すべての) 繋ぐ–Mgグラフ –スコープ $必要なスコープ |
サービス プリンシパルが保持していないアクセス許可を含むスコープを使用して接続すると、Azure AD はサービス プリンシパルから継承されていないアクセス許可の同意を求めます (図 2)。

Graph API を使用する他のアプリと同様に、管理者は組織に代わって要求されたアクセス許可に同意します。これにより、サービス プリンシパルが保持するセットに追加のアクセス許可が追加されます。管理者が同意を与えない場合、要求されたアクセス許可はセッションで使用できますが (サインインアカウントが保持する管理ロールに従います)、サービス プリンシパルが保持するセットには参加しません。
時間の経過と共に、サービス プリンシパルによって保持されるアクセス許可は、同意の最初の時点で付与されるアクセス許可と、対話的なクライアントで作業するユーザーが後で付与されるその他のアクセス許可になります。つまり、サービス プリンシパルは、時間の経過と同じ時間の間に集約されたアクセス許可を収集します。このため、Graph SDK コマンドレットを対話的に使用することはお勧めできません。これは、次の方法で強調された問題の一種です。 クラウド アプリ セキュリティのためのアプリ ガバナンス (または、 この記事で説明した自家栽培のソリューション).
過剰な権限を持つサービス プリンシパルの唯一の解決方法は、その削除と再作成であり、その時点で管理者は、新しいサービス プリンシパルに制限されたアクセス許可の同意を与えることができます。Graph SDK コマンドレットを使用してサービス プリンシパルを削除する方法は次のとおりです(当然)。
$Sp = 取得-MgServicePrincipal -トップ 999 | ?{ $_.AppId -“14d82eec-204b-4c2f-b7e8-296a70dab67e" }
を削除 Sp.Id します。
$Sp = 取得–サービスプリンシパル –ページのトップへ 999 | ? { $_.アプリID –という感じで “14d82eec-204b-4c2f-b7e8-296a70dab67e" } 取り去る–サービスプリンシパル –サービスプリンシパル Id $Sp.身分証明書 |
ベータプロファイルへの接続
状況によっては、特定のコマンドやデータにアクセスするためにベータプロファイルを使用する必要があります。これは、Graph API クエリを発行するときにベータエンドポイントを指定することと同じです。ベータプロファイルを選択するには、 Mg プロファイルを選択します。 コマンドレット:
接続の報告
適切なプロファイルとアクセス許可を持つ適切なテナントに接続していることを確認するには、 ゲット・Mgオーガニゼーション コマンドレット、現在の接続 取得 -Mg コンテキスト コマンドレット、およびで使用されるプロファイル を取得します。 コマンドレットを使用して、次の便利な情報を表示します。
Mgプロファイルベータを選択
$Details = 取得-Mg コンテキスト
$Scopes = $Details |選択 – 展開プロパティ のスコープ
$Scopes = $Scopes – 結合 “, "
$ProfileName = (取得-Mgプロファイル)。名前
$OrgName = (ゲット・Mg組織)。表示名
CLS
書き込みホスト “Microsoft グラフ接続情報"
書き込みホスト “————————————–"
書き込みホスト " "
書き込みホスト (「アカウント {2}としてテナント {0} ({1}) に接続" -f $Details.TenantId、$OrgName、$Detailsアカウント)
書き込みホスト “+——————————————————————————————————————-+"
書き込みホスト (「プロファイルは{0}として設定されます。次のアクセス許可スコープが定義されています: {1}" -f $ProfileName、$Scopes)
書き込みホスト “"
マイクロソフトグラフ接続情報
————————————–
テナント a662313f-14fc-43a2-9a7a-d2e27f4f3475 (IT 担当者向け Office 365) に接続 Global.Administrator@office365itpros.com
+————————————————————————————————-+
定義された次のスコープを持つベータとして設定されたプロファイル: Directory.AccessAsUser.All, ディレクトリ.ReadWrite.All,開いた、プロファイル,ユーザー.読み取り,電子メール,グループ.読み取り.すべて,グループ.ReadWrite.All
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
選ぶ–Mgプロファイル Beta $細部 = 取得–Mg コンテキスト $スコープ = $細部 | 選ぶ –プロパティを展開します。 スコープ $スコープ = $スコープ –接続 “, “ $プロファイル名 = (取得–Mgプロファイル).名前 $組織名 = (取得–Mg組織).表示名 CLS 書く–ホスト “マイクロソフト グラフ接続情報" 書く–ホスト “————————————–“ 書く–ホスト " “ 書く–ホスト (「アカウント{2}としてテナント{0}({1})に接続」 –f $細部.テナントID, $組織名, $細部.アカウント) 書く–ホスト “+——————————————————————————————————————-+" 書く–ホスト (“プロファイルは{0}として設定されます。次のアクセス許可スコープが定義されています: {1}" –f $プロファイル名, $スコープ) 書く–ホスト “" マイクロソフト グラフ 接続 情報 ——————————————————— 接続 宛先 テナント a662313f–14fc–43a2–9a7a–d2e27f4f3475 (オフィス 365 対して それ 長所) として アカウント グローバル.管理者@オフィス365itpros.com +————————————————————————————————————————————————–+ プロフィール セット として Beta で ザ 次 スコープ 定義: ディレクトリ.アクセスアスユーザー.すべての, ディレクトリ.読み取り書き込み.すべての, オープンID, プロフィール, 利用者.読む, 電子メール, 群.読む.すべての, 群.読み取り書き込み.すべての |
上記のアクセス許可には、サービス プリンシパルから継承されたアクセス許可と、ユーザーがセッションに要求したその他のアクセス許可が含まれます。
完了したら切断する
グラフの操作が終了したら、必ず、実行中にセッションを終了してください。 切断- MgGraph グラフからセッションをサインアウトするには. セッションを切断すると、暗号化されたトークン キャッシュが削除され、セッションが再初期化されなくなります。
本番環境でのアプリケーション専用アクセス
説明は、ボーブはインタラクティブセッションをカバーします。これは、Graph SDK コマンドレットとデバッグ スクリプトを知って操作に備えて、適切な方法です。同意とサービス プリンシパルに関する問題のため、Microsoft では、操作スクリプトに個別のアプリが Azure に登録され、証明書ベースの認証を使用することをお勧めします(アプリ専用アクセス).対話型クライアントを使用してコードを記述してテストすることはできますが、コードが完成したら、スコープ付きアクセス許可セットを持つ独自のアプリを使用してコードを実行します。この方法では、スクリプトによって実行される処理で必要なセットのみにアプリに割り当てられたアクセス許可を制限できます。スコープのアクセス許可を持つ別々のアプリを使用する場合の欠点は、時間の経過とともに管理する必要がある多数の登録済みアプリを Azure AD に蓄積する可能性があることです。
マイクロソフトが解決すべき問題
継続的にアクセス許可を熱心に収集するサービス プリンシパルを持つことは、良い考えではないようです。実際、それはお粗末な考えです。マイクロソフトでは、管理者がセキュリティ上の問題を発生させずに Graph SDK コマンドレットを対話的に実行できるようにする、より適切な方法を考え出す必要があります。セキュリティ プリンシパルの削除 切断- MgGraph は、アクセス許可をゼロ化する方法の 1 つを実行しますが、これは貧弱なソリューションです。ユーザー名とパスワードをハードコードしたり、スクリプトでアプリシークレットを使用して Graph へのアクセスを認証したりできるようにすることも、現在の脅威の状況を考えると、取る方向ではありません。
問題の事実は、テナント管理者がサービス プリンシパルをチェックしない限り、アクセス許可の蓄積の問題を忘れるということです。それは悲しいですが、真実であり、他の仕事の要求のために。人々は走らない 切断- MgGraph コマンドレットと同じ理由で、 切断マイクロソフトチーム そして 切断 Exchange オンラインを切断します。 は無視されます。
グラフ SDK は、グラフ API の使用に伴う多くの複雑さから PowerShell ユーザーを分離するため、優れたアイデアです。まだ進行中の作業ですが、Microsoft が Graph SDK をテナント管理者向けのツールにしたい場合は、アクセス許可の問題を解決する必要があります。そして間もなく(2022年6月30日締め切り前!
ディスカッション
コメント一覧
まだ、コメントがありません