YubiKey 5 シリーズで Azure AD のサービス プリンシパルの証明書認証する

  • watahani
  • 20 Minutes
  • October 17, 2020

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

PIN

証明書の作法はあまり分からないけど、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 があれば条件付きアクセスを削除してテナントに入れるようになったので、安心して条件付きアクセスの実験が出来ますね。

参考

関連記事