WindowsサーバへのRPD接続にYubikey PIV認証を使用する
RDP接続する際の認証にYubiKeyを使えるようにした際のログです。YubiKeyの公式サイトが少しわかりにくいところがあったので、一つの記事にまとめました。
英語での環境をもとにスクリーンショットを取ってるのでGPO等の項目が日本語で違うかもしれません。
Table of Contents
Toggle0. 前提
Setting up Smart Card Login for Enroll on Behalf of
を前提にしており、ユーザが直接証明書を要求できないように、登録エージェントを使用してユーザの証明書を代理登録できるようにするための手順です。YubiKey 5 NFCを使用しました。
1. YubiKeyにPINを設定
Yubikey Managerを使用
Applications -> PIV -> PIN Management
2. YubiKey minidriverをインストール
Smart card drivers and tools からダウンロード。
クライアントとサーバにそれぞれインストール
RDPでの認証をするためにRDP接続先ではINSTALL_LEGACY_NODE=1
をつけることを忘れずに。
msiexec /i .YubiKey-Minidriver-4.1.1.210-x64.msi INSTALL_LEGACY_NODE=1 /quiet
3. CAサーバの役割をドメイン内のサーバにインストール
以下の2つのRoleは必須。
- Certification Authority
- Certification Authority Web Enrollment (if you need to use an off-domain client machine)
秘密鍵作成の際に要件にあったものを作成すること。
Creating a Certification Authority
4. スキーマバージョン2以上のテンプレートを使えるようにする
参考:【解決方法】[証明書テンプレートの選択] に証明書テンプレートが表示されない
ADサーバ上でADSI Editを開き、[CN=Configuration,DC=\<DCName>] – [CN=Services] – [CN=Public Key Services] – [CN=Enrollment Services] 内の"flags"の項目が2の場合。
CAサーバ上で以下のPowershellコマンドを実行。
# Set a registry
certutil -setreg CASetupStatus +SETUP_UPDATE_CAOBJECT_SVRTYPE
# Resetart CA Service
net stop certsvc & net start certsvc
5. Elliptic Curve Cryptography (ECC)証明書ログインを有効化
GPO
- IT管理者を含んだコンピュータに対するGPOを作成/編集
- コンピュータの構成 > ポリシー > 管理テンプレート > Windowsコンポーネント > スマートカード
- Allow ECC certificates to be used for logon and authenticationを選択し編集
- 有効化
レジストリ
GPOを使わない場合、以下のコマンドでECC証明書を使うためのレジストリを変更できます。
New-Item "HKLM:\SOFTWARE\Policies\Microsoft\Windows\SmartCardCredentialProvider" -Force;
New-ItemProperty -LiteralPath "HKLM:\SOFTWARE\Policies\Microsoft\Windows\SmartCardCredentialProvider" -Name 'SmartCardCredentialProvider' -Value 1 -PropertyType DWord -Force;
New-ItemProperty -LiteralPath "HKLM:\SOFTWARE\Policies\Microsoft\Windows\SmartCardCredentialProvider" -Name 'EnumerateECCCerts' -Value 1 -PropertyType DWord -Force;
6. CAサーバ上で証明書テンプレートを作成
Setting up Smart Card Login for Enroll on Behalf ofを参考にし、"To specify the permissions for the enrollment agents and publish the certificate template"まで設定。
テンプレートを設定中、暗号化(Cryptography)の設定が終わるまでは適用をクリックしない方がいいです。(テンプレートのバージョンかなんかによって設定できる内容が制限されるため)
7. 登録エージェント証明書を作成
- ドメイン参加済のPCに、作成したテンプレート「登録エージェント」に対し登録の権限を持ったユーザでログイン
- ファイル名を指定して実行からcertmgr.mscを開く
- コンソール上で証明書 - 現在のユーザ → 個人 → 証明書を開く
- 適当な箇所で右クリック、すべてのタスク → 新しい証明書の要求
- 次へをクリック
- Active Directory登録ポリシー
- 登録エージェントのテンプレートを選択し、登録
8. YubiKeyトークンに証明書を登録
- 登録エージェントをインストールしたPCにログイン、PINを設定したYubiKeyを挿入しておく
- certmgr.mscを開く
- コンソール上で証明書 - 現在のユーザ → 個人 → 証明書
- 適当な箇所で右クリック、すべてのタスク → 詳細設定操作 → 代理登録
- Active Directory登録ポリシーを選択
- 登録エージェント証明書を選択において検索 → 先ほどインストールした証明書を選択
- 作成した証明書テンプレートを選択し、代理登録
- 検索 → 登録したいユーザを選択
- ユーザ名に対象のユーザが入っていることを確認し、登録
- YubiKeyのPINが要求されるので入力
9. ドメイン参加していないPCでYubiKeyを使用する場合
ドメイン参加していないPCを使用する場合、CAサーバが初期設定のままだとドメイン不参加PCから証明書失効リストにアクセスできずYubiKeyにインストールした証明書のチェックに失敗します。
ということでCRLをHTTPで公開して、証明書にCRLのアドレスを追加する必要があります。
信頼済みルート証明書にCAサーバの証明書をインストール
Certmgr.mscから行ってもいいし、コマンドで追加してもいいです。
certutil -addstore root .your-ca-cert.cer
Kerberos認証証明書をADサーバにインストール
ADサーバ上でKerberos認証証明書を要求、発行
CRLをHTTPで公開
証明書失効ステータスをLDAPを使わずに確認する。
certsrv.mscを開いてCAの名前を右クリック→プロパティを開く。
拡張機能タブでAIAとCDPにHTTPが追加されていること、画像の箇所にチェックが入っていることを確認。
10. スマートカードでのログインのみを許可する
ユーザにスマートカードのみのログインを許可したい場合、ADのユーザアカウントのオプションにて「対話型ログオンにはスマートカードが必要」をチェック。
11. トラブルシューティング
有効な証明書が見つかりませんとかなんとか言われる場合
- YubiKey minidriverをクライアントPCにインストールしたか
- YubiKey minidriverをRDP接続先にINSTALL_LEGACY_NODE=1のオプション付きでインストールしたか
- クライアントPCにCA証明書をインストールしたか
- クライアントPCでECC証明書ログインが有効になっているか
などを確認するといいかと思います。
スマートカードにインストールされた証明書を確認する
スマートカードにインストールされた証明書は以下のコマンドで確認できます。CRLにアクセスできない場合そのエラーが明記されています。
certutil -scinfo
SCRootを更新
certutil –scroots update
証明書を検証
おまけ、証明書を検証するためのコマンド。
certutil -verify -urlfetch .thecert.cer
証明機関の設定を確認
ADサーバ上でADSI EditのConfigurationを開く → Services → Public Key Services
AIA、CDPなどの情報が確認できます。
古い情報などが残っていればそれが邪魔している可能性もあります。
11. おわり
YubiKeyを使ってRDP接続するの、ちょっとかっこいいですよね。この記事ではYubiKeyを使っていますが、言ってみれば証明書(秘密鍵)を保管しているに過ぎないので、8. YubiKeyトークンに証明書を登録 の箇所で他のスマートカードを使って、例えばTPM仮想スマートカードにも証明書をインストールしてRDP接続時の認証に応用できると思います。
この情報が誰かの役に立てばいいなと思います。