条件付きアクセスとAzure ADのセキュリティの既定値

皆さんこんにちは。国井です。
Azure ADにセキュリティの既定値群(セキュリティデフォルト)と呼ばれる設定がリリースされ、MFAを適用する条件付きアクセスポリシーがAzure AD Premiumのライセンスがなくても利用できるようになっています。

公式ドキュメントでは以下の設定を強制するように構成されると書いてあります。

すべてのユーザーに対して Azure Multi-Factor Authentication への
登録を必須にします。

管理者に多要素認証の実行を要求します。
レガシ認証プロトコルをブロックします。
必要に応じてユーザーに多要素認証の実行を要求します。
Azure portal へのアクセスなどの特権が必要な作業を保護します。

だけど、レガシー認証とかまだブロックして欲しくない(というか心の準備ができていない)会社はいっぱいあるだろうし、何よりセキュリティデフォルトが有効だと自社で独自の条件付きアクセスの設定が使えない!

image

ということで条件付きアクセスを使おうと思っている会社では、Azure ADを使い始めるとき、まず最初にこの設定を無効にしておきましょう。

私などはトレーニングでMicrosoft 365の無料試用版を取得する機会が多いのですが、
その都度、セキュリティデフォルトを無効化するのが面倒くさい。
なんとかPowerShellとかで設定できないものかと思ったのですが、Microsoft Graphを利用することで実現できるようです。

あらかじめAzure ADの[アプリの登録]からアプリを作成し、シークレットを生成しておきます。(この時生成されるシークレットは後で使いますので、記録しておきましょう)

image

それからアプリの登録を作成したら生成されるクライアントIDもテナントIDと共に控えておきましょう。

image

次にアプリの登録を利用してidentitySecurityDefaultsEnforcementPolicyリソースにアクセスできるよう、アクセス許可を割り当てておきましょう。
[アプリの登録] – [APIのアクセス許可] を開いて、アプリケーションのアクセス許可としてMicrosoft GraphのPolicy.Read.AllPolicy.ReadWriteConditionalAccessを割り当てます。ここまでできたら、最後に管理者の同意を割り当てて設定は完了です。

image

あとは最後の大仕事として、アプリの登録を利用するようなPowerShellスクリプトを作成して、identitySecurityDefaultsEnforcementPolicyの設定を変更できるようにしましょう。

$TenantID = “テナントIDを入れる”
$ClientID = “アプリケーションIDを入れる”
$Secret = “クライアントシークレットを入れる”

#パラメーターの指定
$oAuthUri = “https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token”
$url = “https://graph.microsoft.com/beta/policies/identitySecurityDefaultsEnforcementPolicy”

$body = @{
client_id     = $ClientId
scope         = “https://graph.microsoft.com/.default”
client_secret = $secret
grant_type    = “client_credentials”
}

#アクセストークンの取得
$authResponse = Invoke-WebRequest -Method Post -Uri $oAuthUri -ContentType “application/x-www-form-urlencoded” -Body $body -ErrorAction Stop
$token = ($authResponse.Content | ConvertFrom-Json).access_token
$authHeader = @{‘Authorization’=”Bearer $token”}

#セキュリティデフォルトの設定変更(無効化)
$body = (@{“isEnabled”=”false”} | ConvertTo-Json)
$authHeader = @{‘Authorization’=”Bearer $token”;”Content-Type” = “application/json”}
$res = Invoke-WebRequest -Headers $AuthHeader -Uri $url -Method Patch -Body $body

以上の設定によりセキュリティデフォルトの設定を無効にできます。
だけど、これだったらGUIから設定したほうが早かったですね。。