YubiKey 5 シリーズで Azure AD のサービス プリンシパルの証明書認証を試したのでメモ。
元ネタ
土曜の昼におきたら EMS 勉強会なるもの TL で盛り上がっているので見ていたら、条件付きアクセスで管理者がロックアウトされて困ったという話があり、こういうのあればいいなーと思ったので作ってみる。
緊急解除ボタンを作る。
問題点
Microsoft Graph API で 条件付きアクセスが操作 できるようになったので、 緊急解除ボタンを作ること自体は簡単なのですが誰でも押せてしまうと困りますね。
うーん、資格情報を安全に保管できる素敵なデバイスはないかなぁ~?
証明書を保存できて、手ごろで丈夫なデバイス無いかな~?
.
.
.
.
はい、ありました。
宣伝したので指紋認証のできる YubiKey ください🤤🤤
YubiKey に保存した証明書で、証明書認証がしたい
YubiKey4, YubiKey5 シリーズは、Windows 上でスマートカードとして働く。Windows 10 の場合、minidriver も初めから入っているので、Service Principal の認証もできるんじゃない?と思ってやってみたら簡単にできたので、メモ。
Azure AD に条件付きアクセス解除用のサービスプリンシパル (アプリ) を作る
まずは、条件付きアクセス解除用のサービス プリンシパルを作る。サービスプリンシパルについては以前 Qiita で書いたのでさっくりと。
アプリの作成
Azure Active Directory
> アプリの登録
> 新しいアプリ
全てデフォルトで登録。
API のアクセス許可
サービス プリンシパルで条件付きアクセスを操作するには、アプリケーション権限の Policy.Read.All
, Policy.ReadWrite.ConditionalAccess
, Application.Read.All
が必要。
アクセス許可の追加
から Microsoft Graph API を選び、「アプリケーション権限」で、上記 3 つの権限を追加する。その後、「<テナント名>にアクセス許可を追加します」をクリックし、Admin Consent を実施する。
YubiKey のセットアップ
その後、おもむろに YubiKey 5 を PC に刺して、以下のコマンドを実行する。
$currentDate = Get-Date
$notAfter = $currentDate.AddYears(10)
$selfCert = New-SelfSignedCertificate -CertStoreLocation cert:\CurrentUser\my -Subject "CN=d22351ce-beb5-4e41-8346-3a7d99db934,OU=ConditionalAccessUnlocker" -Provider "Microsoft Base Smart Card Crypto Provider" -KeySpec Signature -NotAfter $notAfter
証明書の作法はあまり分からないけど、AppId を Subject に入れとけば便利そう。
スクリーンショットはテスト中のなので、DNS で設定してる。
PIN を要求されるので、YubiKey 5 の PIN を入れる。Azure AD などで FIDO2 で使っている場合は共通なので、それを入れる。初めて使う場合は好きな PIN を入れる。
上記コマンドで YubiKey 上に自己証明書が保存される。YubiKey Manager で見るとこんな感じで 9a スロットに証明書が保存されているのが分かる。
certutil
でも確認できる。
certutil -scinfo
削除するコマンドもメモっておく。
certutil -delkey -csp "Microsoft Base Smart Card Crypto Provider" "te-4d4c1e9d-2c00-4995-9396-4014ef5a281d" #キーコンテナ名は -scinfo で出てきたやつ
以下のコマンドで証明書を出力する。
$cerfile = ".\ConditionalAccessUnlocker.cer"
Export-Certificate -Cert $cert -FilePath $cerfile
Note:
この辺動かないときは、もしかするとこの辺のレジストリが設定されているかもしれない。
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-r2-and-2008/ff404287(v=ws.10)
証明書のアップロード
Azure ポータルに戻って、作ったアプリの 証明書とシークレット
を選択し、先ほどエクスポートした証明書、 ConditionalAccessUnlocker.cer
をアップロードする。
Azure AD PowerShell Module で条件付きアクセスを操作
PowerShell Module のインストール
Azure AD PowerShell Module v2 の Version 2.0.2.106
以上をインストールする。
Install-Module -Name AzureAD -Force
作成したサービス プリンシパルの権限でサインイン
さっき作成した証明書を読み込んで、作成したサービス プリンシパルの権限でサインインする。
$cert = Get-ChildItem Cert:\CurrentUser\My\ | ?{ $_.Subject -like "*OU=ConditionalAccessUnlocker*"} ; $cert
$appId = $cert.Subject.Split(",")[0].Split("=")[1]
Connect-AzureAD -TenantId $tenantId -ApplicationId $appId -CertificateThumbprint $cert.Thumbprint
PIN を聞かれるので、YubiKey の PIN を入力する。
サインインできるので、後はポリシーを操作するコマンドをポチポチ叩いて解除すれば…
あれ… うまく動かない…。 😅
まとめ
削除は上手く動いたので、緊急時は Remove-AzureADMSConditionalAccessPolicy でブロックされてるポリシーを削除するなりしてください。
いつの間にか治ってました。
Get-AzureADMSConditionalAccessPolicy | %{ Set-AzureADMSConditionalAccessPolicy -PolicyId $_.Id -State "disabled"}
これで、緊急時に YubiKey があれば条件付きアクセスを削除してテナントに入れるようになったので、安心して条件付きアクセスの実験が出来ますね。