AAD Internalsを使ってみた

皆さんこんにちは。国井です。
最近はAzure ADに関連するツールや情報が色々とネットにあふれるようになり、様々な操作をするのに困ることも徐々に少なってきていますね。今日紹介するAAD Internals PowerShellモジュールもその一つだと思います。AAD Internalsは名前のとおりAzure ADの各種操作を行えるPowerShellモジュールで、ちょっと変わった操作ができるという印象があります。

早速使ってみましょう!

モジュールの利用開始

他のPowerShellモジュールと同じように利用開始するときはInstall-Moduleコマンドレットでインストールし、Import-Moduleコマンドレットでコンソールにロードします。

Install-Module AADInternals
Import-Module AADInternals

これができたらAzure ADに接続し、利用開始するのですが、変わっているのが利用するコマンドレットによって接続するためのコマンドレットが異なるってことです。例えば、サブスクリプションに割り当てられているライセンス(Sku)一覧を参照するコマンドレットであるGet-AADIntSubscriptionsコマンドレットを実行する場合、接続のコマンドレットしてGet-AADIntAccessTokenForAADGraphを使います

Get-AADIntAccessTokenForAADGraph –SaveToCache

ちなみに-SaveToChacheスイッチを使うとアクセストークンの期限が切れるとリフレッシュトークンを使ってアクセストークンを再取得してくれるので時間を気にせずコマンドレットを実行できるメリット?があります。
コマンドレット一覧は作者の方のブログで紹介されていますが、

コマンドレットを眺めていると、どうやら名詞部分がAADIntで始まるコマンドレットの実行には接続のコマンドレットしてGet-AADIntAccessTokenForAADGraphを使うようです。

■ ■ ■

次からは私が使ってみて気に入ったコマンドレットをいくつか挙げてみます。

ユーザーのMFA設定を確認

Get-AADintUserMFAコマンドレットを実行するとユーザーが利用するMFAのメソッドを確認できます。通話なのか、SMSなのか、それともMicrosoft Authenticatorアプリなのか?ということが確認できます。

image

管理者がユーザーのMFA設定をカスタマイズ

Set-AADIntUserMFAコマンドレットはユーザーごとのMFA設定を定義するコマンドレットです。MFA設定って初回アクセス時に携帯電話の番号やアプリの登録など面倒なことを色々やらなければならなくって、それを管理者サイドで設定してしまおうってもの。
xxx@xxxxユーザーの携帯電話番号の登録とデフォルトで使う認証をSMSによる通知にするのであれば、こんな感じに設定します。

Set-AADIntUserMFA -UserPrincipalName "xxx@xxxx”  -PhoneNumber "+81 90xxxxxxxx” -DefaultMethod OneWaySMS

最後のDefaultMethodってところですが、
OneWaySMSを選択するとSMSによるワンタイムパスワードの設定、
TwoWayVoiceMobileを選択すると通話による認証、
PhoneAppNotificationを選択するとアプリ(Microsoft Authenticatorなど)によるプッシュ通知を選択することになります。アプリの通知設定も別のコマンドレットでできるんですけど、デバイストークンの設定とかいろいろ面倒で普通に設定したほうがいいんじゃないかと思いました。

グローバル管理者の一覧を参照

グローバル管理者として不審なユーザーが紛れ込んでいないか確認するならこのコマンドレットを使います。定期的に実行して結果を確認するとか、そんな感じの使い方かな?

Get-AADIntGlobalAdmins

image

Teamsの在席状況を操作

AAD InternalsコマンドレットがスゴイのはOffice 365系のサービスも操作できちゃうこと。
中でも私のお気に入りはTeamsの在席状況をコマンドレットで操作できることです。
ただし、Teamsのコマンドレットを操作するときはTeams用のトークンを取ってくる必要があるので、

Get-AADIntAccessTokenForTeams –SaveToCache

を実行してから

Set-AADIntTeamsAvailability -Status Available

と実行します。すると在席状況を「連絡可能」な状態にできます。
これからリモートワークと称して遊びに出かけることができますねw

Teamsにチャットを投稿

Teamsでこんな感じのメッセージが並んでいるところに新しいチャットメッセージを書き込みたい場合、

image

Get-AADIntAccessTokenForTeams –SaveToCache

を実行してから以下を実行して

Get-AADIntTeamsMessages | ft Content,Link -AutoSize

これで既存のチャットメッセージを取得します。

image

するとLink欄からスレッド情報が取れるので、

Send-AADIntTeamsMessage -Thread "19:-DVxxxxxxxxx@xxxxxxxxxx" -Message "こんにちは世界"

と打ち込めばメッセージを書き込めます。

image

ちなみに書き込んだメッセージ一覧はGet-AADIntTeamsMessagesコマンドレットで取得できます。

不正アクセスでMFAを突破する

これはオマケなんですが、ADFS経由でのAzure AD接続を実装している場合、
有効なUserPrincipalName、Immutable ID、IssuerURIを指定できると、Open-AADIntOffice365Portalコマンドレットを使ってADFSサーバーが発行するトークンを偽装することができます。しかもADFSサーバーから発行するトークンにはMFA済みのクレームをトークンにセットできるので、Azure ADでMFAを設定してあってもMFAをスキップできてしまいます。(これはかなりの脅威!)
詳しくはFireEyeさんのブログに掲載されているのでご覧になってみていただければと思います。

他にもパススルー認証で使用するパスワードをDLLインジェクションで横取りしてパスワードを盗み見るInstall-AADIntPTASpyなんてコマンドレットもあるので(誰得?)、色々試せそうです。