PowerShellコマンドレットで条件付きアクセスポリシーを設定

皆さんこんにちは。国井です。
今日はMicrosoft Entra IDに含まれるサービスである条件付きアクセスについてです。
条件付きアクセスはEntra IDに登録されたクラウドアプリへのアクセス制御を実現する機能で、「特定のIPアドレスからのみOffice 365にアクセスできるようにしたい」などの要件を実現することができます。条件付きアクセスそのものはMicrosoft Entra管理センターから設定することができますが

・企業の要件に応じて設定を動的に変更したい
・ベンダーさんがお客さんのテナントに決め打ちの設定を実装したい
・IaC的な運用をしたいので、マスターをデータとして持っていたい

などの理由からコマンドで操作したいというニーズがあるかと思います。
そういう時は New-MgIdentityConditionalAccessPolicy コマンドレットを利用します。
コマンドレットそのものの使い方は@ITさんの連載で書かせてもらっているので、そちらを見ていただくとして

ここではコマンドレットで経由でインポートするハッシュテーブルの書き方を紹介します。

基本的な書き方

New-MgIdentityConditionalAccessPolicyコマンドレットはMicrosoft Entra IDへの接続を済ませた後に以下のような形式で実行します。

New-MgIdentityConditionalAccessPolicy -BodyParameter $params

このとき $params という変数が登場しますが、$params 変数の中に条件付きアクセスで設定したい内容をハッシュテーブルの形式で指定します。これは@ITさんの連載で書いたものと同じものなのですが、管理者がOffice 365にアクセスするときは多要素認証が必要という設定を表しています。

$params = @{
  DisplayName = "管理者によるOffice365アクセス"
  State = "enabled"
  Conditions = @{
    Applications = @{
      IncludeApplications = @(
        "Office365"
      )
    }
    Users = @{
      IncludeGroups = @(
        "62e90394-69f5-4237-9190-012177145e10"
       )
    }
   }
   GrantControls = @{
     Operator = "OR"
     BuiltInControls = @(
       "mfa"
     )
   }
}

これをGUIで設定するとこんな感じになります。

image

ではGUIのメニュー別に上から順番にハッシュテーブルの書き方を見ていきます。

ポリシー名

まず2行目ですがポリシーの名前を設定する項目になります。
GUIだと[名前]という項目のところがそれにあたります。

ユーザー

10~14行目ではポリシーの対象となるユーザーを指定しています。
GUIだとユーザーはすべてのユーザー or 指定のユーザー という選択になります。

image

特定のユーザーやグループを指定するときはGUIの画面に表示されているID (上の画面では消してしまっていますが..)を12行目に指定します。

Users = @{
IncludeGroups = @(
"62e90394-69f5-4237-9190-012177145e10"
)
}

IncludeGroups の部分ですがユーザーの種類を定義しており、次の項目名が利用できます。

項目名 説明
includeUsers 対象となるユーザーを指定
excludeUsers 対象外となるユーザーを指定
includeGroups 対象となるグループを指定
excludeGroups 対象外となるグループを指定
includeRoles 対象となるロールを指定
excludeRoles 対象外となるロールを指定
includeGuestsOrExternalUsers 対象となるゲスト/外部ユーザーを指定
excludeGuestsOrExternalUsers 対象外となるゲスト/外部ユーザーを指定

ロールを指定するときはロールのテンプレートIDを指定する必要があります。テンプレートIDはMS Learnのページで確認できます。

一方、ゲスト/外部ユーザーを指定するときはincludeGuestsOrExternalUsersに続けてguestOrExternalUserTypes=.. と書くとGUI画面でも指定可能な以下の属性を指定できます。

image

6つの項目はそれぞれ”B2bCollaborationGuest, B2bCollaborationMember, B2bDirectConnectUser, InternalGuest, ServiceProvider, OtherExternalUser”で表現します。例えば、ローカルゲストユーザーだったら.. という条件を指定するのであれば

Users = @{ 
includeGuestsOrExternalUsers=@{guestOrExternalUserTypes="InternalGuest"
}
}

のように書いてあげます。

ターゲットリソース

5~9行目ではGUIの[ターゲットリソース]に当たる設定を行います。

Applications = @{
IncludeApplications = @(
"Office365"
)
}

6行目のIncludeApplicationsは条件付きアクセスポリシーの対象となるアプリの指定、excludeApplicationsは対象外のアプリの指定を表します。
そして@{に続けて7行目にアプリの名前を入れます。Office 365の場合は名前をそのまま入れればOKなのですが、自分で後から追加したアプリの場合は条件付きアクセスポリシーのアプリ選択欄に書かれているアプリのIDを設定する必要があります。

image

例えば一部のアプリを除く、すべてのアプリという指定をするときはこんな感じで設定します。

"applications": {
"includeApplications": {
"All"
}
"excludeApplications": {
"499b84ac-1321-427f-aa17-267ca6975798"
}
}

条件

ポリシーの対象となる条件は4行目の Conditions = @{ 以降に記述します。4~5行目の間に書いておけばよいでしょう。
条件の項目の中には色々な項目がありますが、これらについてこんな感じで書いていくよというのを紹介します。

■サインインリスク/ユーザーリスク
有効にする設定はなく、単純にリスクの種類とリスクレベルだけを

signInRiskLevels = @( "high","medium" )

のように書きます。ユーザーリスクならsignInRiskLevels 部分がuserRiskLevels となります。

■プラットフォーム
OSの種類を指定する項目で対象と対象外があります。includePlatforms で対象、excludePlatforms で対象外を指定します。書き方はこんな感じ。

platforms = @{
includePlatforms = @("all")
excludePlatforms = @("iOS","Windows")
}

■場所
あらかじめ作成したネームドロケーションにはIDが設定されますので、そのIDを指定します。
ちなみにネームドロケーションのIDはMicrosoft Entra管理センターで参照することはできないので Get-MgIdentityConditionalAccessNamedLocation -All コマンドレットを実行し、あらかじめ確認しておきます。確認できたらincludeLocations で対象、excludeLocations で対象外の場所をIDで指定します。(すべてはAllと書きます)

locations = @{
includeLocations = @("all")
excludeLocations = @("3d46dbda-8382-466a-856d-eb00cbc6b910")
}

■クライアントアプリケーション
レガシーアプリケーションがなくなった今、ブラウザーまたはモバイル/デスクトップアプリしか指定することのなくなったクライアントアプリケーションですが、こんな感じで書いていきます。

clientAppTypes = @("browser","mobileAppsAndDesktopClients")

■デバイス
ごめんなさい。だいぶ格闘したのですが設定方法を見出せませんでした。
こんな感じで書いてみたんだすけどね..

 
Devices= @{
DeviceFilter=@{
 Mode = "include"
 Rule = "device.trustType -ne 'AzureAD'"
} 
}

アクセス制御 – 許可

16~21行目に書かれている項目が許可・拒否のアクセス制御を設定する部分でOperator =”zzz” とBuiltInControls = @( “xxx” }を使って表現します。
“xxx”に入る項目名は以下の通り。

image

↑blockのスペルミスってる!
例えばブロックする場合はこんな感じになります。
(※大文字/小文字を区別するので注意)

GrantControls = @{
Operator = "OR"
BuiltInControls = @(
"block"
)
}

アクセス制御 – セッション

16~21行目に書かれている項目の代わりに、16行目をSessionControls = @{ と書き始めます。17行目から20行目を xxx = @{ zzz }のように書き換えてセッション設定を埋めていきます。xxx に入る項目名は以下の通り。

image

この中から永続的なブラウザーセッションで永続的にしない設定にする場合であれば次の通りになります。

sessionControls = @{
 persistentBrowser = @{
 Mode = "never"
 isEnabled = $true
 }
}

【参考】セッションポリシーの書き方を知る

セッションポリシーには色々な項目があり、どうやって書いたらよいの?というところで悩むと思います。その場合にはGUIで一度ポリシーを作成し、そのポリシーの内容をGet-MgIdentityConditionalAccessPolicyコマンドレットで参照するという方法があります。

Get-MgIdentityConditionalAccessPolicyコマンドレットはそのまま実行するとポリシー一覧がポリシーIDとともに表示されるので事前に該当のポリシーのポリシーIDを確認しておき、そのうえで

 Get-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId ポリシーのID | Select-Object -ExpandProperty sessionControls | ConvertTo-Json

と実行すると書き方が確認できます。
ここでは[アプリの条件付きアクセス制御を使う]設定を有効化し、[カスタムポリシーを使用する]を選択した場合の設定をコマンドレットの実行結果から参照しています。

なるほど。ということはこう書けばよいってことがわかりますね。

 sessionControls = @{ 
 cloudAppSecurity = @{
 CloudAppSecurityType = "mcasConfigured"
 isEnabled = $true
}
} 

ポリシーの有効化

3行目がGUIの[ポリシーの有効化]を表す項目になります。
有効な時はEnabled、無効な時はDisabled、レポート専用の時はenabledForReportingButNotEnforcedと指定します。

まとめ

New-MgIdentityConditionalAccessPolicyコマンドレットから条件付きアクセスポリシーを設定する場合、ここまで見ていただいたようなフォーマットでポリシーを記述する必要があります。Microsoft  Graphで直接アクセスするときはJSONフォーマットで記述するので、書式が若干違ったりします。サードパーティのコマンドレットを使えば、そのままJSONフォーマットでインポート/エクスポートできたりするので、そうしたものを使うことも併せて検討してみても良いかもしれません。

■参考情報
conditionalAccessPolicy を作成する – Microsoft Graph v1.0 | Microsoft Learn

conditionalAccessPolicy リソースの種類 – Microsoft Graph v1.0 | Microsoft Learn