NPS と 802.1x 認証 で注意すること

# はじめに
Windows Server の ネットワークポリシーサービス (NPS) で 802.1x 認証 を構成する場合は、以下の画面のような設定を行うと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4885475c-b081-e30d-1419-02cacd72eaba.png)

この構成を行う際に、ネットで各種ドキュメントを見ても、その内容と この画面の設定項目とを突き合わせてみても、どう解釈すればよいのか理解するのに とても苦労しました。

この記事では、その点について 説明したいと思います。

# 注意すべき点
802.1x 認証 を行う際に出てくる認証方式がありますが、呼び名について、著しく表記ゆれがあります。
まずは、そのことを意識しておかないと、各種ドキュメントを読み解けません。

以下のドキュメント (URL：認証方式）で説明されている認証方式 (EAPの種類) は何種類かありますが、以下の３項目に着目しました。
- EAP-TLS
- EAP-MSCHAPv2
- 保護された EAP (PEAP)

:::note warn
以下の認証方式は、（カッコ内）の理由にて除外しました。、
- EAP-TTLS（現時点で非サポート）
- EAP-SIM、EAP-AKA（SIMカードの認証で使う。MSCHAPv2 や 証明書認証では使えない）
- TEAP（Windows10 (2004) & Windows Server 2022 以降のみとの制限あり）
:::

（URL：認証方式）
https://learn.microsoft.com/ja-jp/windows-server/networking/technologies/extensible-authentication-protocol/network-access?wt.mc_id=mvp_407731#authentication-methods

## ３種類の認証方式に記載されている説明と解釈
色枠外は、上記の (URL：認証方式）のサイトからの抜粋です。
色枠内は、私の見解です。
### (EAP-TLS)
EAP トランスポート層セキュリティ (EAP-TLS)：
相互認証のために証明書と組み合わせて TLS を使用する標準ベースの EAP メソッド。
Windows でスマート カードまたはその他の証明書 (EAP-TLS) として表示されます。

:::note info
MSCHAPv2認証 には使えない。
クライアント証明書 を使った認証には使える。
なお、セキュリティを考えると PEAP を使った方が良い。
:::

### (EAP-MSCHAPv2)
EAP-Microsoft チャレンジ ハンドシェイク認証プロトコル バージョン 2 (EAP-MSCHAP v2): 
認証にユーザー名とパスワードを使用する MSCHAP v2 認証プロトコルをカプセル化する Microsoft が定義した EAP メソッド。
Windows にはセキュリティで保護されたパスワード (EAP-MSCHAP v2) として表示されます。
EAP-MSCHAPv2 は、VPN のスタンドアロンの認証方法として使用できますが、有線/ワイヤレスの場合は内部メソッドとして使用することしかできません。

:::note alert
EAP-MSCHAPv2 は、VPN の認証には使えるけど、802.1x 認証 では利用できない点に注意。
802.1x で、ユーザーID + パスワード の認証を使いたい場合は、PEAP (MSCHAPv2) を使う必要アリ！
:::

### (保護された EAP)
保護された EAP (PEAP)：
TLS トンネル内に EAP をカプセル化する Microsoft が定義した EAP メソッド。
TLS トンネルは、それ以外の方法では保護されない可能性のある、内部 EAP メソッドをセキュリティで保護します。
Windows では、内部メソッドとして EAP-TLS と EAP-MSCHAP v2 がサポートされています。

:::note warn
PEAP は、保護された EAP（Protected EAP）という意味で セキュリティが高い。
さらに、内部メソッドとして、EAP-TLS と EAP-MSCHAPv2 がサポートされていて、選んで利用できる。
:::

:::note alert
EAP-TLS、EAP-MSCHAPv2 と、PEAP が並列で分類されているのに、PEAP の内部メソッドにも EAP-TLS / EAP-MSCHAPv2 が登場するので、混乱の元になっています。

分かりやすく例えると「HTTP/HTTPS」と「SSL-VPN で暗号化した HTTP/HTTPS」を並列で比較しているような感じだと思ってください。
これを区別しようとすると、HTTP、HTTPS、SSL-VPN という３種類のプロトコルがあり、SSL-VPN を使った場合に、さらに VPNトンネル内を経由した通信を区別するために、SSL-VPN (HTTP) , SSL-VPN(HTTPS) と表現します。
:::

## 表記のゆれ（具体例）
表にまとめると、こんな感じでしょうか・・・・
| |暗号の強度|クライアント証明書による認証|IDとパスワードによる認証|
|:-:|:-:|:-:|:-:|
|EAP<br>EAP-TLS|低|EAP-TLS|EAP-MSCHAPv2<br>★802.1x 認証 では使えない|
|"保護されたEAP"<br>Protected EAP<br>PEAP<br>EAP-PEAP|高|PEAP (EAP-TLS)<br>PEAP-TLS|PEAP (EAP-MSCHAPv2)<br>PEAP-MSCHAPv2<br>MSCHAPv2<br>※さまざまな略し方が存在|

- EAP-TLS
PEAP ではなく、保護されていない方の EAP-TLS の事を指しています。
　<br>

- EAP-MSCHAPv2
PEAP ではなく、保護されていない方の EAP-MSCHAPv2 の事を指しています。
★802.1x 認証 では使えません。
　<br>

- PEAP (EAP-TLS)
PEAP で 保護された EAP-TLS のこと
以下は、全部 同じ意味（PEAPを略してしまうと 意味が違ってしまう）
　PEAP (EAP-TLS)
　PEAP-TLS
　<br>

- PEAP (MS-CHAPv2)
PEAP で 保護された EAP-MSCHAPv2 のこと
以下は、全部 同じ意味
　PEAP (EAP-MS-CHAPv2)
　PEAP (EAP-MSCHAPv2)
　PEAP (MS-CHAPv2)
　PEAP (MSCHAPv2)
　PEAP-MS-CHAPv2
　PEAP-MSCHAPv2

:::note warn
これらも、同じ意味を指している場合があります。
　EAP-MS-CHAPv2
　EAP-MSCHAPv2
　MS-CHAPv2
　MSCHAPv2

"PEAP" が前提で説明されている文章内で、"PEAP" を省略して書かれているサイトなどを見たことがあります。注意深く見てください。
:::

- その他の表現
　EAP-PEAP
　　見慣れない表記ですが、PEAP の事です。

例えば、以下のサイトでは、「EAP-TLS と EAP-PEAP」の認証シーケンスの違いについてを説明しているだけです。PEAP (EAP-TLS) と PEAP (MSCHAPv2) については 触れられていませんが、両方とも PEAP なので、認証シーケンスは同一だと解釈しましょう。
https://nwengblog.com/802-1x-sequence/

:::note info
この表記のゆれを踏まえて 各種ドキュメントを読んでいくと 内容が理解できるようになります。いや～ホントに分かりづらいです💦
:::

# NPS の設定画面を深堀りしてみる
前章までの前提を理解してもらうと、NPS の設定画面も理解できるようになります。

「ID + Passで認証」をさせたい場合は、PEAP (EAP-MSCHAPv2) を構成する必要があります。その場合は 下図の 緑枠の項目(PEAP) を追加したあと「編集」ボタンを押して、水色枠のウィンドウを開きます。
このウィンドウのタイトルは、赤下線のように "Protected EAP" になっているので、PEAP の事です。
この画面で、PEAP の内部メソッドを設定できるので、ここで 黄枠の "EAP-MSCHAPv2" を追加します。
こうすることで、802.1x 認証 で、ID + Passでの 認証 (MS-CHAPv2) を利用できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1d623f9a-ddcf-a33b-fea6-8528d422852a.png)

上記の図の 紫枠 の箇所の英語については、NPSサーバー内の どの サーバー証明書 をクライアントに提示するのかを設定しています。クライアントPC の 信頼されたルート証明機関のストア には、この サーバー証明書 と チェーンとなる ルート証明書 がインポートされている必要があります。
※後述する「NPS + 802.1x 認証における 証明書要件（サーバー証明書）」の章で用意する証明書の事です。

:::note info
以下に 翻訳結果を載せておきます。
（英文）
Select the certificate the server should use to prove its identity to the client.
A certificate that is configured for Protected EAP in Connection Request Policy will override this certificate.
（日本語：DeepL翻訳）
サーバーがクライアントに身元を証明するために使用する証明書を選択します。
接続要求ポリシーで保護された EAP に設定されている証明書は、この証明書に優先します。
:::

オレンジ枠の「セキュリティで保護されたパスワード(EAP-MSCHAPv2)」ですが、これは PEAP ではありません。

:::note alert
オレンジ枠の「EAP-MSCHAPv2」を追加した設定を行う事は可能なのですが、802.1x 認証 では利用できません。追加しないようにしましょう。
この設定を使って MSCHAPv2 の動作を検証しても 成功できません。ハマりどころの１つです。

クライアント側の 設定も見てみると、"EAP-MSCHAPv2" という選択肢が無いので、NPSサーバー側とクライアント側とでプロトコルを合わせられないのも原因と思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b57dc67a-b08e-99c1-b99a-bf09e924167b.png)
上記の赤枠の「設定」を押すと、以下の画面で PEAP の内部メソッドを選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ffa60511-ed4b-7a4d-1dae-95b4ad15908d.png)
:::

# NPS + 802.1x 認証 における 証明書要件
## サーバー証明書について
NPSサーバー を使って、802.1x 認証 を構成する場合には、サーバー証明書 が必要です。
※PEAP (MSCHAPv2)、PEAP (EAP-TLS)、EAP-TLS の どの方式を使う場合でも、サーバー証明書が必要です。

（URL：NPSサーバーに必要な証明書の要件）
https://learn.microsoft.com/ja-jp/windows-server/networking/technologies/nps/nps-manage-cert-requirements?wt.mc_id=mvp_407731#minimum-server-certificate-requirements

:::note info
上記の要件で作成された サーバー証明書 が、NPSサーバーにインポートされていること
この証明書のチェーンとなる ルート証明書 が、クライアントPC にインポートされていること
:::

（URL：ネットワーク ポリシー サーバーで利用されるサーバー証明書について）
紫枠の説明で取り上げた NPSサーバーでの サーバー証明書 のバインドに関する説明です。
以下の記事を参照して、ポリシーで 意図した サーバー証明書 を掴んで（バインド）いるか確認するようにしましょう。
※Microsoft社としても、手動バインド を推奨しているようです。

https://jpwinsup.github.io/blog/2021/02/02/WirelessNetwork/NPS/Server-Certificates-Used-by-Network-Policy-Servers/

## ID + パスワード認証の場合 (MS-CHAPv2)
クライアント証明書 の構成は不要です。

ユーザーの利用シーンとしては、２通りあります。
① ネットワーク接続時に 手動で ID+Pass を入力
　この利用方法を想定している場合は、大きな問題はありません。
　WiFi アクセスポイントに接続する際に ID と パスワード の入力が求められます。

② OS の ログオンID を引き継いで SSO で認証する（接続時の手入力不要）
　SSO が動作しなかった場合は、手入力 に切り替わるので ① と同じ動作になります。

:::note warn
SSO が動作するためには、クレデンシャルガードが "無効" である必要があります。
この要件があるため、端末によって SSO の動作にバラつきが発生して、利用者ごとの個別対応での原因究明に苦労する可能性があります。
"あのPCは、SSO で動作するのに、なぜ この PC は手入力が必要なのか？" など
:::

:::note alert
クレデンシャルガードは、条件によって 動作にバラつきが生じます。
- ハードウェアによって、対応の有無があります（メーカー、モデル、マシン購入時期の差）
- BIOS の設定で、有効／無効 の設定があります（利用者が意識せず 変更してたりする）
- Win10 と Win11 で OS の既定値が 異なる（Win10は有効、Win11は無効）
:::

NPS + 802.1x (MS-CHAPv2) の構築手順は、以下に記載しました。
なるべくわかりやすく、誰でも構築できるように記載したつもりです。
ぜひ、参照ください！

https://qiita.com/carol0226/items/05d8ef17a6d25018cd4e

以下の記事は、私が 上記の記事を書く前に、初めて検証して ハマった際に 参考にしたサイトです。

（URL : WPA2-Enterpriseを使用したRADIUS認証の設定）
https://documentation.meraki.com/%E6%97%A5%E6%9C%AC%E8%AA%9E/Wireless_LAN/Encryption_and_Authentication/Configuring_RADIUS_Authentication_with_WPA2-Enterprise

（URL : NPS、ワイヤレスLANコントローラ、およびワイヤレスネットワークを構成する）
https://www.cisco.com/c/ja_jp/support/docs/wireless/5500-series-wireless-controllers/115988-nps-wlc-config-000.html

（URL：無線LANをActiveDirectoryアカウントで認証する）
https://blog.web-arena.com/authenticate-wifi-with-activedirectory-account/

## クライアント証明書について
クライアント証明書 で認証する場合にのみ必要です。
※PEAP(EAP-TLS) or EAP-TLS の場合

クライアント証明書を使った認証は、ユーザーが ID と パスワード の入力を意識することなく、ネットワーク にアクセスできます。

管理者が端末キッティング時に証明書を埋め込んでおき、その端末からしか接続できないように構成する事も可能です。（MSCHAPv2だと、社内PC 以外からでも接続できてしまう）

以下の２種類のうち、いずれかの証明書を発行して 利用します。
- ユーザー証明書（サブジェクトの別名に UPN が含まれていること）
- コンピューター証明書（サブジェクトの別名に クライアントの FQDN が含まれていること）

（URL：クライアント証明書の要件）
https://learn.microsoft.com/ja-jp/windows-server/networking/technologies/nps/nps-manage-cert-requirements?wt.mc_id=mvp_407731#minimum-client-certificate-requirements

:::note info
上記の要件で作成された クライアント証明書 が、クライアントPC にインポートされていること
この証明書のチェーンとなる ルート証明書 が、NPSサーバー にインポートされていること
:::

クライアント証明書を使う場合は、証明書に「サブジェクトの別名」 が含まれている必要がありますが、取り扱いには注意が必要です。以下の記事で 説明していますので、参考にしていただければと思います。

https://qiita.com/carol0226/items/be07b6e11967c31aeb65

構築手順については、以下の記事にまとめてありますので、参照ください。

https://qiita.com/carol0226/items/564a21455cd3e5f58906

# トラブルシューティング
構成したあと、うまくいかない場合の切り分けのために、ログの場所などが説明されています。

https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/troubleshoot-network-policy-server?wt.mc_id=mvp_407731

https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/troubleshoot-wireless-technologies?wt.mc_id=mvp_407731