Azure AD の証明書ベース認証の環境を作ってみた。



この投稿は [Microsoft Security Advent Calendar 2022 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/microsoft-security) の 12/18 の記事になります。


## はじめに


今年2月に Azrue AD の証明書ベース認証機能のパブリックプレビューが[アナウンス](https://techcommunity.microsoft.com/t5/microsoft-entra-azure-ad-blog/azure-ad-certificate-based-authentication-now-in-public-preview/ba-p/2464390)されました。概要やアナウンスされた新機能については、Azure Identity サポート チームの[Blogに記事](https://jpazureid.github.io/blog/azure-active-directory/check-out-new-azure-ad-certificate-based-authentication-cba/
)があります。

そして、Ignite 2022 において機能の正式リリースが[アナウンス](https://techcommunity.microsoft.com/t5/microsoft-entra-azure-ad-blog/azure-ad-certificate-based-authentication-cba-on-mobile/ba-p/2365672)されました。[iOSやAndroidの対応](https://techcommunity.microsoft.com/t5/microsoft-entra-azure-ad-blog/azuread-certificate-based-authentication-for-ios-and-android-now/ba-p/244999) や、さらにハードウェア セキュリティ キー ( YubiKey )の証明書のサポートのパブリック プレビューも登場するなど機能の強化が続いています。

#### 本記事は、手元の環境で証明書ベースの認証を試してみた際のメモになります。

## 自分の検証環境の構成
* 既存のCAはオンプレミスに展開済みのActive Directoryの証明機関を利用しています。
* オンプレミスの証明機関とIntuneを[証明書コネクタ](https://learn.microsoft.com/ja-jp/mem/intune/protect/certificate-connector-overview) で接続してSCEP証明書プロファイルで展開できるようになっています。
* インターネットに公開が必要なWebサービスは、Azure Web Appllication Proxy のパススルーモードで外部からアクセス可能にしています。(CRL配布ポイントなど)


## 証明書ベース認証の有効化

すでに既存のCAが存在していれば、証明書ベース認証の有効化は非常に簡単です。
あらかじめ、CAで以下の準備をしておきましょう。

* 既存のCAからルート証明書をエクスポート  (中間証明機関がある場合には、中間証明機関のルート証明書も)
* 既存のCAのCRL配布ポイントのURLを確認

### Azure AD の設定
##### 1. Azure AD に証明機関の登録

1. AzureAD の管理ポータルにアクセス
2. 「管理」→ 「セキュリティ」でセキュリティメニューに移動
3. 「管理」→ 「証明機関」より、ルート証明書をアップロードおよびCRL配布ポイントのURLを登録

下記の画面で事前の準備で用意したCAのルート証明書のアップロードと証明書失効リストのURLを入力して「追加」を押して完了です。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618393/8fc86b71-a3cf-07da-5dcd-7057da3c5a2f.png">
設定が終了するとこんな感じになります。
    <img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618393/c656d8c7-37f7-a462-6a6f-2bc82bb80b65.png">

###### 2. Azure AD で証明書認証を有効化

1. AzureAD の管理ポータルにアクセス
2. 「管理」→ 「セキュリティ」でセキュリティメニューに移動
3. 「管理」→ 「認証方法」より、認証方法ポリシーから「証明書ベースの認証」を有効化

設定した内容は下記の通りです。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618393/64936f14-149d-bd5c-b603-c4ba1a03df5d.png">
最初に、「証明書ベースの認証の設定」画面の「有効化及びターゲット」タブの項目を設定します。
「有効にする」をトグルボタンをONに。ターゲットはとりあえず「すべてのユーザー」にしておきます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618393/ec8858fa-ad1f-9f35-014d-dbeacfcf59be.png">
続いて、「構成」タブの認証バインドの保護レベルは「多要素認証」を選択、ユーザー名バインドは「PrincipalName」/ 「RFC822Name」に「UserPrincipalName」を設定します。

ココでの多要素認証の設定は、本来は証明書がスマートカード+PINなどで正しく保護されている場合に選択するべきものかと思います。
今回はあくまでも検証ということで。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618393/255a7e1c-f60c-f170-8c51-849b6f184e56.png">

最後に「保存」をクリックして設定は完了です。証明書ベースの認証が「はい」になっていればOKです。


### 動作確認

証明書ベースの認証を有効にしたら、実際のサインイン画面を見てみます。
まずは通常のサイン画面が表示されますので、UPN(メールアドレス)を入力して「次へ」をクリック
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618393/3991fc62-0564-8084-b1b0-feadc75ec516.png">
パスワードの入力画面に遷移したら、メニューに「証明書またはスマートカードを使用する」が追加されているのでクリック
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618393/cea54795-bfd2-fb44-21d9-6ba55c28555d.png">
証明書の選択ウィンドウがポップアップするので、適切な証明書を選択することでサインインが正常に完了します。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618393/bd6f41e8-6ef5-130c-63ba-4fd63a077ed3.png">
(画面はブラウザに依存します。Microsoft Edgeを例にしています。)

既存のCAが存在していれば、導入自体は非常に簡単だということがわかります。

### Azure AD 証明書ベース認証の勘所

今回はあらかじめCAが構成されており、デバイスにユーザー証明書が展開済みという前提で記載してきました。
実際には、証明書テンプレートの作成やSCEP/NDESによる証明書展開をどうするか？というのが実際の検証では
結構てこずりました。以下、実際に設定した項目を備忘録として記載してみます。

### Active Directory 証明書サービスの前提条件と証明書テンプレート

オンプレミスのCAから、Intuneを介してデバイスに証明書を展開する場合、SCEPを利用する際にはこちらの[ドキュメント](https://learn.microsoft.com/ja-jp/mem/intune/protect/certificates-scep-configure#certificates-and-templates)を参照いただければと思います。
ポイントとしては、NDESをホストするサーバーにHTTPSでアクセスできるようにWebサーバー証明書が展開されていることがあげれられます。

また、証明書添付レートについては、以下のようにサブジェクト名を「要求に含まれる」としていただき、
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618393/775cbc71-22b1-9ec7-f934-5a6adc6cbafa.png">

Intune のSCEP証明書テンプレートで、UPNがサブジェクト名に含まれるように展開することで証明書認証に利用できるようになります。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618393/0445c1dd-e492-0e5e-2e8e-fa6a239506fc.png">

## さいごに

AzureAD の証明書ベース認証は、冒頭のアナウンスにもあった通り、従来のスマートカードだけではなくモバイルデバイスからYubiKeyなどと連携するなど様々な利用が可能になってきています。よりセキュアにクラウドサービスを利用することを可能にする仕組みになると思います。
本記事が皆さんの検証の一助になれば幸いです。