hostapdで認証(IEEE802.1X EAP-TLS)付きの無線APを構築する

# 目的

* 現在のオフィスでは無線環境がないのだが、来年のオフィス移転に併せて、会社所有のPCだけを無線LANに接続できるようにしたい
* 無線LANの端末認証にはIEEE 802.1XのEAP-TLSを使えるか検証したい
* EAP-TLSは証明書の管理が面倒らしいので、Active Directoryで自動化したい
* IEEE802.1X対応APは持っていないので、余ったノートPCにhostapdを入れてアクセスポイントにして検証する

WindowsをRADIUSサーバにしてEAP-TLSの構成をしたhostapdの例は見つからなかったので、少々苦労した。

# 構成

* 既存のドメインコントローラ
  * OS: Windows Server 2012R2
  * IP: 192.168.10.234/24
  * 証明書サービスをインストールして、認証局(プライベートCA)にする
  * グループポリシーで、ドメイン参加PCにはコンピュータの証明書を自動で登録するよう構成
  * ネットワークポリシーサーバーをインストールして、認証サーバ(RADIUSサーバ)にする
* 余ったLet's Note
  * OS: Ubuntu 18.04 Server
  * IP: 192.168.10.202/24
  * hostapdをインストールして、オーセンティケータとして動作させる
  * NATではなくブリッジ接続する
* ドメイン参加済みのPC
  * サプリカントとして無線LANに接続できるか検証する
  * サーバとは同じセグメントにDHCPでIPが割り当てられるようにする

# PKIの構築

[標準テキスト Windows Server 2012 R2 構築・運用・管理パーフェクトガイド](https://www.amazon.co.jp/dp/B00U178112/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)の通りに作業したので、
ここでは割愛。p.344からp.355をそのまま実施した。

認証局(CA)の構築、各コンピュータの証明書の自動登録テンプレートの登録を実施したので、
ドメインに参加したクライアントPCには、証明書の個人ストアに各々のコンピュータの証明書が入り、
信頼されたルート証明機関にドメインコントローラの証明書が自動で登録・更新される。

# ネットワークポリシーサーバーのインストールと設定

アラクサラネットワークス社のマニュアル、[RADIUS サーバ設定ガイド　Windows Server 2012 編](https://www.alaxala.com/jp/techinfo/archive/guide/pdf/N14R030_RADIUS_Win2012_V1_R0.pdf)に従って作業したので、これも割愛。

行った作業は下記の通り。

* 2.2.4. ネットワークポリシーとアクセスサービス(NPS)のインストール
* 3.1.2. NPS の設定

今回は証明書を用いた認証のみを有効化したので、EAPの種類は下図のような設定となった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197772/fc0b985f-b63e-0600-c0c7-7e0e950c3dd6.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197772/79166f32-2827-96f1-44af-adc271eb1067.png)


# 無線APの構築

## hostapdのインストール

Ubuntu 18.04 Serverではリポジトリにhostapdがなかったので、

~~~
wget http://archive.ubuntu.com/ubuntu/pool/universe/w/wpa/hostapd_2.6-15ubuntu2_amd64.deb
sudo dpkg -i hostapd_2.6-15ubuntu2_amd64.deb
~~~

でhostapdをインストールした。

リポジトリにhostapdがあるなら

~~~
sudo apt install hostapd
~~~

でもOK。

## ブリッジ設定

今回はhostapdに無線で接続してきたクライアントを、無線APと同じネットワークに接続したいので、ブリッジ接続する。

`bridge-utils`がインストールされていなければ追加。

~~~
sudo apt install bridge-utils
~~~

netplanの設定ファイルを編集して、ブリッジを作成する。

~~~/etc/netplan/99_config.yaml
network:
    ethernets:
        enp0s25:
            dhcp4: false
    bridges:
        br0:
            interfaces: [enp0s25]
            addresses: [192.168.10.202/24]
            gateway4: 192.168.10.253
            nameservers:
                addresses: [192.168.10.234, 192.168.10.236]    
            dhcp4: false
            optional: true
    version: 2
~~~

設定を適用する。

~~~
sudo netplan apply
~~~

## hostapd設定

今回、なかなか設定例が見つからず苦労したところ。
`wpa_key_mgmt`に`WPA-EAP`を設定し、`ieee8021x`に`1`を設定する。

`auth_server_shared_secret`と`acct_server_shared_secret`にはネットワークポリシーサーバーの設定で
新しいRADIUSクライアントを設定したときに入れた値を入れる。

~~~/etc/hostapd/hostapd.conf
ctrl_interface=/var/run/hostapd
interface=wlp2s0
bridge=br0
driver=nl80211
ssid=TEST-EAP-TLS
country_code=JP
hw_mode=g
channel=3
wpa=2
wpa_key_mgmt=WPA-EAP
rsn_pairwise=CCMP
ieee8021x=1
nas_identifier=TEST-EAP-AP
own_ip_addr=192.168.10.202
radius_client_addr=192.168.10.202
auth_server_addr=192.168.10.234
auth_server_port=1812
auth_server_shared_secret=TestSecret
acct_server_addr=192.168.10.234
acct_server_port=1813
acct_server_shared_secret=TestSecret
~~~

設定ファイルができたら、起動する。

~~~
sudo hostapd -d /etc/hostapd/hostapd.conf
~~~

`-d`はデバッグメッセージを表示するオプション。
終了するときはCtrl + C。

# 接続できるかテスト

ドメイン参加済みのPC(Windows 10)の通知領域にあるWi-Fiのところから、
SSID一覧を表示させると、hostapdで設定したSSIDが表示されるはず(この例では`TEST-EAP-TLS`)

そのまま「接続」とすると、下記のようにサーバの証明書が正しいか聞いてくるので、確認して「接続」を押し、ちゃんとIPが振られればOK。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197772/00e8bc35-70d2-f608-49fc-281595e0020d.png)

一応、「ネットワークと共有センター」から、「新しい接続またはネットワークのセットアップ」を行い、マニュアルで設定することも可能(Windows 10だとこの設定画面に行くまでが大変)。
この場合は、信頼されたルート証明機関でサーバの証明書を選択できるので、上図のフィンガープリントの確認画面は出ない。
ヤマハのマニュアルが分かりやすかった
→ [無線端末を設定(WPA/WPA2エンタープライズ / EAP-TLS) : Windows10](https://network.yamaha.com/setting/wireless_lan/wireless_terminal/airlink-windows10_tls)

# 上手く行かない場合

接続できない場合は、以下のログを確認する。

* hostapd起動中に標準出力へ吐かれるログ
* RADIUSサーバーのプロパティで、イベントログに成功と失敗のログを出力するように設定しておき、イベントビューアでIDが6272から6280あたりのログをフィルターして見る

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197772/083ba2e7-5ea5-43cb-5b75-13c89a09c8d6.png)