FreeRADIUSでEAP-TLS認証Wi-Fiを構築しよう

自宅Wi-FiでWPA2 Enterprise認証(EAP-TLS認証)できるようにするべく、自宅ラズパイサーバーにFreeRADIUSをインストールしたのでその際の作業内容を備忘録としてまとめます。(2022/5/5 追記あり)

はじめにこれを言ってしまうのもなんですが、FreeRADIUSは公式サイトのドキュメントがとてもよく整備されています。なので、実際の設定作業は、公式サイトのドキュメントを見ながら行うことを推奨します。(本記事の最後にリンクを載せています。)

FreeRADIUS公式サイトにも以下のような記載があります。
「設定方法についてネット検索で調べる人が多いが、このやり方は生産的とは言えない。サードパーティの文書は誤りが多く、たいてい内容が古い」

ですので、本記事は全体の流れをつかみ、参考にする程度にとどめていただけると幸いです。なお、本記事執筆時点の最新版のFreeRADIUSのバージョンは、2020/03/25にリリースされた3.0.21です。

また本記事では、自宅内で利用するために必要最低限の設定でWPA2 Enterprise認証(EAP-TLS認証)Wi-Fiを構築することを目標としており、必要最低限の設定しかしていません。ひと通り設定してEAP-TLS認証でWi-Fiに接続できるようになったら、FreeRADIUSおよびOpenSSLのドキュメントを読んで、その他の設定項目についても確認し、セキュリティ確保他の観点から必要な設定が抜けていないかどうか確認されることを推奨します。

(2022/5/5 追記)Raspberry Pi OSを64bit環境に更新したのに伴い、FreeRADIUSも64bit環境でビルドし直しました。この際の手順について、追記しています。

1. FreeRADIUSのビルドとインストール
2. eapol_testのビルドとインストール
3. FreeRADIUSの動作確認
4. パケットの流れと電子証明書について
5. 電子証明書作成
6. EAP-TLS認証の設定
7. EAP-TLS認証のテスト
8. ネットワーク経由でのEAP-TLS認証のテスト
9. FreeRADIUSを自動起動させる
10. CRLを使う
11. 電子証明書をSupplicantにインストールする
12. Wi-Fiアクセスポイントを設定する
13. 自宅Wi-FiでEAP-TLS認証を運用しての感想
13. 自宅Wi-FiでEAP-TLS認証を運用しての感想
14. (追記)Debian 11(bullseye,64bit)環境でのビルド
15. 参考情報

1. FreeRADIUSのビルドとインストール

Raspberry Pi 4 Model B(以下、ラズパイ4、もしくはラズパイ)にFreeRADIUSをインストールします。なお、ラズパイにはOSとして、32bit版のRaspberry Pi OS(旧称:Raspbian)がインストールしてあります。

FreeRADIUSはリポジトリに登録されており、最初はパッケージ管理ソフト(aptコマンド)を使い「sudo apt-get install freeradius」でインストールしたのですが、古いバージョンのFreeRADIUSがインストールされたので、一旦アンインストールの上、ソースコードからビルドしてインストールし直しました。なお、本記事執筆時点の最新版のFreeRADIUSのバージョンは、2020/03/25にリリースされた3.0.21です。

FreeRADIUSをダウンロードしてビルドしようとしたところエラーメッセージが表示されたので、エラーメッセージ回避のための作業を含めて以下の流れで作業を行ない、FreeRADIUSをビルドした上でインストールしました。

【FreeRADIUSのビルドとインストール】
(1)tallocのビルドとインストール
tallocをダウンロードしてビルドしました。最新版をビルドしようとしたところエラーメッセージが出て止まったので、古いバージョン(2.1.1)をダウンロードしてビルドしたところ成功し、そのままインストールしました。

(2)libssl-devのインストール
以下のコマンドを実行してlibssl-devをインストールしました。これをインストールしないと、FreeRADIUSビルド時に「failed linking to libcrypto」エラーが出て進みませんでした。
$ sudo apt-get install libssl-dev

(3)FreeRADIUSのダウンロード・ビルド・インストール
以下の流れで、FreeRADIUSをダウンロード、ビルド、インストールします。
$ wget ftp://ftp.freeradius.org/...
$ tar xvzf (ダウンロードしたファイル名).gz
$ cd (Makefileのあるディレクトリ)
$ ./configure
$ make
$ sudo make install

2. eapol_testのビルドとインストール

本記事では、FreeRADIUSを使ってEAP-TLS認証できるようにするところまで設定を行いますが、FreeRADIUSのみのインストールだと、FreeRADIUSをインストールしたマシン単体、およびネットワーク経由でのEAP-TLS認証のテストができません。なので、EAP-TLS認証を含むさまざまなEAP認証のテストができるeapol_testコマンドも併せてビルド・インストールします。手順は、A very basic (but functional) eduroam configurationに書いてある通りですが、Raspberry Pi OSでビルドする際はスクリプトを若干修正する必要があったので、その箇所も含めて、以下に記します。

【eapol_testのビルドとインストール】
(1)以下のコマンドを実行する
$ sudo apt-get install git libssl-dev devscripts pkg-config libnl-3-dev libnl-genl-3-dev
$ git clone --depth 1 --no-single-branch https://github.com/FreeRADIUS/freeradius-server.git
$ cd freeradius-server/scripts/travis/

(2)eapol_test-build.shの修正
eapol_test-build.shをテキストエディタで開き、OS判定箇所を探し、以下のように修正する。
linux-gnu) → linux-gnu*)

(3)以下のコマンドを実行する
$ ./eapol_test-build.sh
$ sudo cp ./eapol_test/eapol_test /usr/local/bin/

3. FreeRADIUSの動作確認

FreeRADIUSが動作するかどうか、EAP認証を使わずPAP認証(Password Authentication Protocol)でテストします。

テスト前に、FreeRADIUSサーバーのコマンド名と設定ファイル他のあるディレクトリを以下に記します。本記事では、ソースコードからビルド・インストールした場合のコマンド名およびディレクトリで表記します。パッケージ管理ソフトからインストールした場合は、コマンド名とディレクトリを読み替えてください。

【FreeRADIUSサーバーのコマンド名と設定ファイル他のあるディレクトリ】
(1)FreeRADIUSをソースコードからビルド・インストールした場合
FreeRADIUSサーバーのコマンド名: /usr/local/sbin/radiusd
設定ファイル他のあるディレクトリ: /usr/local/etc/raddb
ログファイルのあるディレクトリ: /usr/local/var/log/radius

(2)FreeRADIUSをパッケージ管理ソフト(sudo apt-get install freeradius)でインストールした場合
(以下のコマンド名およびディレクトリは一例です。変更される可能性があります。)
FreeRADIUSサーバーのコマンド名: /usr/sbin/freeradius
設定ファイル他のあるディレクトリ: /etc/freeradius/3.0/

それでは、早速試してみます。

(1)テキストエディタ(※)で/usr/local/etc/raddb/usersを開き、ファイルの先頭に以下の1行を追加する。(※: sudoコマンドを使って起動)
taro Cleartext-Password := "hello"

(2)テキストエディタ(※)で/usr/local/etc/raddb/clients.confを開き、「secret = testing123」の1行があることを確認する。(※: sudoコマンドを使って起動)
client localhost {
(途中省略)
secret = testing123
(途中省略)
}

(3)Radiusサーバーコマンド(radiusd)をデバッグモードで起動する。
$ sudo radiusd -X

(4)別の端末(ターミナル)を開き、以下のコマンドを実行する。
$ radtest taro hello localhost 0 testing123

(5)radtestコマンドを実行した端末に、「Received Access-Accept」と表示されれば成功です! RADIUSサーバーは動作しており、PAP認証に成功しています。radiusdを起動した端末には、大量のログメッセージが表示されます。

これから、設定ファイルを修正してはテストコマンドを実行していくにあたって、注意点があります。「/usr/local/etc/raddb以下にある設定ファイル他を修正したら、radiusdを再起動すること!」です。設定ファイル他はradiusd起動時にしか読み込まれないので、radiusdを再起動しない限り、設定ファイル他の変更内容は反映されません。

(6)radiusdコマンドを起動した端末で、Ctrl+Cと入力して、radiusdコマンドを一旦終了させます。

4. パケットの流れと電子証明書について

電子証明書の作成を始める前に、EAP-TLS認証を含むEAP認証時の、端末・アクセスポイント・RADIUSサーバーの役割とパケットの流れ、および電子証明書について説明します。

端末・アクセスポイント・RADIUSサーバーの役割とパケットの流れは以下の通りとなります。

【Supplicant】
Wi-Fi、Ethernet等で構築されたLANにアクセスするための認証を要求する端末(パソコン、スマホ、タブレット等)をサプリカント(Supplicant)と呼びます。EAP認証の情報が入ったEAPパケットをEAPOL(EAP over LAN)でカプセル化の上、このEAPOLパケットをAuthenticatorに送ります。

【Authenticator】
Supplicantから受け取ったEAP認証の情報が入ったEAPOLパケットからEAPパケットを取り出し、RADIUSでカプセル化した上でAuthenticationサーバー(RADIUSサーバー)に取り次ぐ装置をAuthenticatorと呼びます。IEEE 802.1X認証対応のWi-FiアクセスポイントやLANスイッチ等がAuthenticatorになります。RADIUS関係の文書を読んでいると、NASという用語が頻出しますが、これはNetwork Access Serverの略で、Authenticatorのことです。(NASはNetwork Attached Storageの略としても使われますが、RADIUS関係の文脈ではNetwork Access Serverの略です。)Authenticator自身はEAP認証を行わず、EAP認証はAuthenticationサーバー(RADIUSサーバー)が行い、その結果をRADIUSサーバーから受け取り、Supplicantに返します。

【Authenticationサーバー(RADIUSサーバー)】
Authenticatorより受け取ったRADIUSパケットからEAPパケットを取り出した上でEAP認証を行い、その結果をAuthenticatorに返す装置をAuthenticationサーバーと呼びます。RADIUSサーバーがAuthenticationサーバーになります。

SupplicantとAuthenticationサーバー(RADIUSサーバー)の間でやりとりされるEAPパケットは、Supplicant〜Authenticator間ではEAPOLでカプセル化されるのに対し、Authenticator〜Authenticationサーバー(RADIUSサーバー)間ではRADIUSでカプセル化される、という違いがあります。また、EAPOLパケットはMACアドレス(L2)宛に送受信されるのに対し、RADIUSパケットはIPアドレス(L3)宛に送受信される、という違いもあります。

EAP-TLS認証をするためには、以下の電子証明書が必要になります。

(1)ルート証明書(Root Certificate)
(2)サーバー証明書(Server Certificate)
(3)クライアント証明書(Client Certificate)

ルート証明書に対応する秘密鍵で署名されたルート証明書を用いたプライベート認証局(Certification Authority、CA)が構成され、サーバー証明書とクライアント証明書はルート証明書に対応する秘密鍵で署名されます。(電子証明書を署名するとは、電子証明書のハッシュ値を計算して秘密鍵で暗号化することです。)

EAP-TLS認証では、SupplicantはAuthenticationサーバー(RADIUSサーバー)から提示されたサーバー証明書について2つのハッシュ値(サーバー証明書のハッシュ値、および署名をルート証明書に対応する公開鍵で復号化して得られたハッシュ値)が一致することをもってAuthenticationサーバー(RADIUSサーバー)を認証し、Authenticationサーバー(RADIUSサーバー)はSupplicantから提示されたクライアント証明書について2つのハッシュ値(クライアント証明書のハッシュ値、および署名をルート証明書に対応する公開鍵で復号化して得られたハッシュ値)が一致することをもってをSupplicantを認証します。

当該プライベート認証局を構成するルート証明書は、https(SSL/TLS)通信用のルート証明書とは違ってSupplicantに事前にはインストールされていないので、当該ルート証明書は事前にSupplicantにインストールする必要があります。まとめると、SupplicantとAuthenticationサーバー(RADIUSサーバー)について、証明書を以下のようにインストールする必要があります。

(1)Supplicantにはルート証明書とクライアント証明書をインストールし、OSがルート証明書を信頼するように設定する。
(2)RADIUSサーバーにはルート証明書とサーバー証明書をインストールする。

これらの電子証明書を作るために必要な設定ファイルの雛形は、FreeRADIUSの設定ファイルのディレクトリ内にインストールされているので、設定ファイルを(OpenSSLのドキュメントを見て)ゼロから作る必要はなく、これらの雛形を元に必要な修正を行なった上でコマンドを実行するだけで証明書は完成します。

5. 電子証明書作成

詳細はFreeRADIUS DOCUMENTATIONの「Implementation Chapter 6 – EAP Authentication」を見ていただくこととして、以下のような流れになります。

【電子証明書作成準備】
電子証明書(ルート証明書、サーバー証明書、クライアント証明書)作成に必要な設定ファイルは/usr/local/etc/raddb/certs以下にインストールされており、必要最低限の修正を行なう。
(1)以下のコマンドを実行する。
$ sudo bash
# cd /usr/local/etc/raddb/certs

(2)[ルート証明書]テキストエディタでca.cnfを開き、default_daysとcommonNameを修正する。(#以降の文字列は説明なので、入力不要です。)
[CA_default]
default_days = 1200 #有効期間がデフォルトの60日のままでは短すぎるので、1200日に修正します。

[certificate_authority]
commonName = "Private Root Certificate" #証明書をSupplicantにインストールしたり、OSが信頼するように設定する際に表示されるので、他の証明書と区別できるような名称を入力します。

(3)[サーバー証明書]テキストエディタでserver.cnfを開き、default_daysとcommonNameを修正する。(#以降の文字列は説明なので、入力不要です。)
[CA_default]
default_days = 800 #デフォルトの60日は短すぎるので、800日に修正します。iOS13以降のサーバー証明書に対する825日制限を考慮して、800日にします。(825日制限は実際にはSafariでhttpsサイトを開く時だけに適用されるらしいですが、念のため800日にしておきます。)

[server]
commonName = "Server Certificate" #サーバー証明書の名称を入力します。

(4)[クライアント証明書]テキストエディタでclient.cnfを開き、default_daysとemailAddressとcommonNameを修正する。(#以降の文字列は説明なので、入力不要です。)
[CA_default]
default_days = 1200 #ルート証明書同様にデフォルトの60日は短すぎるので、1200日に修正します。

[client]
emailAddress = taro@example.com #メールアドレスとありますが、有効なメールアドレスでなくても証明書は作成できました。ちなみに、クライアント証明書を作成すると、クライアント証明書のファイル名はこのメールアドレスになります。
commonName = taro #証明書は端末毎ではなく利用者単位で配布することを予定していたので、証明書をインストールするSupplicantの利用者の名前を入れました。複数の端末を同じ利用者が使っている場合、1つの証明書を複数の端末にインストールすることになりますが、1つの証明書を複数の端末にインストールしても問題なくEAP-TLS認証でWi-Fi接続できました。ちなみに、FreeRADIUSで実際にEAP-TLS認証をさせると、ここに入れたcommonNameがFreeRADIUSのログに表示されます。

(5)電子証明書(ルート証明書、サーバー証明書、クライアント証明書)の設定ファイルを修正したので、実際に証明書を作成します。(最後のopensslコマンドは、ca.pemをPKCS#12フォーマットに変換してca.p12のファイル名で保存しています。)
# make ca.pem
# make server.pem
# make client.pem
# openssl pkcs12 -export -in ca.pem -out ca.p12

(6)同じディレクトリ内に電子証明書他が完成しました。以下のようなファイルができています。
【ルート証明書関係】
ca.pem: ルート証明書
ca.key: ルート証明書の秘密鍵
ca.crl: CRL(Certificate Revocation List、後述します)
ca.p12: ルート証明書(PKCS#12フォーマット)

【サーバー証明書関係】
server.pem: サーバー証明書とサーバー証明書の秘密鍵を一体化したもの
server.crt: サーバー証明書
server.key: サーバー証明書の秘密鍵
server.p12: サーバー証明書とサーバー証明書の秘密鍵を一体化したもの(PKCS#12フォーマット)

【クライアント証明書関係】
client.pem: クライアント証明書とクライアント証明書の秘密鍵を一体化したもの
client.crt: クライアント証明書
client.key: クライアント証明書の秘密鍵
client.p12: クライアント証明書とクライアント証明書の秘密鍵を一体化したもの(PKCS#12フォーマット)

(7)以下のコマンドを実行する。
# exit
$

6. EAP-TLS認証の設定

EAP-TLS認証ができるように、FreeRADIUSを設定します。

(1)テキストエディタ(※)で/usr/local/etc/raddb/mods-enabled/eapを開き、以下の箇所について以下のように修正する。(※: sudoコマンドを使って起動)(#以降の文字列は説明なので、入力不要です。)
tls-config tls-common {
...
private_key_password = whatever #サーバー証明書のパスワードを指定する。server.cnfのinput_password/output_password(共に同じパスワード)と同じにします。
private_key_file = /usr/local/etc/raddb/certs/server.key #サーバー証明書の秘密鍵のファイルを指定する
certificate_file = /usr/local/etc/raddb/certs/server.pem #サーバー証明書のファイルを指定する
ca_file = /usr/local/etc/raddb/certs/ca.pem #ルート証明書のファイルを指定する。
check_crl = no #CRLのチェックを省略します。
allow_expired_crl = yes #有効期限の切れたCRLも使えるようにします。(後々のことを考えてここで設定しておきます。)
...
}

(2)テキストエディタ(※)で/usr/local/etc/raddb/sites-available/tlsを開き、以下の箇所について以下のように修正する。(※: sudoコマンドを使って起動)(#以降の文字列は説明なので、入力不要です。)
tls {
...
private_key_password = whatever #サーバー証明書のパスワードを指定する。server.cnfのinput_password/output_password(共に同じパスワード)と同じにします。
private_key_file = /usr/local/etc/raddb/certs/server.key #サーバー証明書の秘密鍵のファイルを指定する
certificate_file = /usr/local/etc/raddb/certs/server.pem #サーバー証明書のファイルを指定する
ca_file = /usr/local/etc/raddb/certs/ca.pem #ルート証明書のファイルを指定する。
check_crl = no #CRLのチェックを省略します。
allow_expired_crl = yes #有効期限の切れたCRLも使えるようにします。(後々のことを考えてここで設定しておきます。)
...
}

7. EAP-TLS認証のテスト

電子証明書を作り、さらにFreeRADIUSも設定したので、ルート証明書とクライアント証明書をホームディレクトリにコピーしてから、eapol_testコマンドを使ってマシン単体でのEAP-TLS認証のテストを行います。

(1)Radiusサーバーコマンド(radiusd)をデバッグモードで起動する。
$ sudo radiusd -X

(2)別の端末(ターミナル)を開き、サーバー証明書をホームディレクトリにコピーする。
$ cd
$ sudo cp /usr/local/etc/raddb/certs/ca.pem .
$ sudo cp /usr/local/etc/raddb/certs/client.crt .
$ sudo cp /usr/local/etc/raddb/certs/client.key .
$ sudo chmod 666 ./ca.pem
$ sudo chmod 666 ./client.crt
$ sudo chmod 666 ./client.key

(3)テキストエディタで以下のようなファイルを作り、ホームディレクトリにeap-tls-test1.confのファイル名で保存する。(#以降の文字列は説明なので、入力不要です。)
$ cat ~/eap-tls-test1.conf
network={
key_mgmt=WPA-EAP
eap=TLS
anonymous_identity="anonymous"
ca_cert="ca.pem"
client_cert="client.crt"
private_key="client.key"
private_key_passwd="whatever" #クライアント証明書のパスワードを指定する。client.cnfのinput_password/output_password(共に同じパスワード)を入力します。
}

(4)以下のコマンドを実行する。
$ eapol_test -c eap-tls-test1.conf -s testing123

(5)eapol_testコマンドを実行した端末には大量のメッセージが出力されますが、最後にSUCCESSと表示されれば、マシン単体でのEAP-TLS認証のテストに成功です!

(6)radiusdコマンドを起動した端末で、Ctrl+Cと入力して、radiusdコマンドを終了させます。

8. ネットワーク経由でのEAP-TLS認証のテスト

前の章で行なったEAP-TLS認証のテストはFreeRADIUSをインストールしたマシン単体でのテストです。いうなれば、RADIUSサーバーとSupplicantが同じマシン(同じIPアドレス)の場合のテストです。

この章では、ネットワーク経由でのEAP-TLS認証のテストを行います。すなわち、実際のEAP-TLS認証Wi-Fi運用時同様、RADIUSサーバーとSupplicantが別のマシン(異なるIPアドレス)となる場合を模擬したテストです。

FreeRADIUSをインストールしたマシンのIPアドレスと、SupplicantのIPアドレス(範囲)が以下の通りだと仮定して、設定を行なっていくことにします。
(1)FreeRADIUSをインストールしたマシンのIPアドレスは192.168.0.100
(2)SupplicantのIPアドレス(範囲)は192.168.0.0/24

まず、SupplicantにみたてるマシンとFreeRADIUSをインストールしたマシンの双方で以下のように準備を行います。

【Supplicantにみたてるマシン(FreeRADIUSをインストールしたのとは別のマシン)で以下の内容を実行する】
(1)eapol_testのビルドとインストール

【FreeRADIUSをインストールしたマシンで以下の内容を実行する】
(1)以下のファイルをscpコマンドを使ってSupplicantにみたてるマシンにコピーする。
/usr/local/etc/raddb/certs/ca.pem
/usr/local/etc/raddb/certs/client.crt
/usr/local/etc/raddb/certs/client.key

(2)テキストエディタ(※)で/usr/local/etc/raddb/clients.confを開き、ファイルの先頭に以下の内容を追加する。(※: sudoコマンドを使って起動)
client private-network-1 {
ipaddr = 192.168.0.0/24
secret = testing123
}

(3)Radiusサーバーコマンド(radiusd)をデバッグモードで起動する。
$ sudo radiusd -X

上記準備作業を行なったら、以下のようにしてネットワーク経由でのEAP-TLS認証のテストを行います。

【Supplicantにみたてるマシン(FreeRADIUSをインストールしたのとは別のマシン)で以下の内容を実行する】
(1)FreeRADIUSをインストールしたマシンからコピーしてきたca.pem、client.crt、client.keyが保存されているディレクトリに移動する。

(2)以下のコマンドを実行する。
$ chmod 666 ./ca.pem
$ chmod 666 ./client.crt
$ chmod 666 ./client.key

(3)テキストエディタで以下のようなファイルを作り、eap-tls-test2.confのファイル名で保存する。(#以降の文字列は説明なので、入力不要です。)
$ cat ~/eap-tls-test2.conf
network={
key_mgmt=WPA-EAP
eap=TLS
anonymous_identity="anonymous"
ca_cert="ca.pem"
client_cert="client.crt"
private_key="client.key"
private_key_passwd="whatever" #クライアント証明書のパスワードを指定する。client.cnfのinput_password/output_password(共に同じパスワード)と同じにします。
}

(4)以下のコマンドを実行する。
$ eapol_test -a192.168.0.100 -c eap-tls-test2.conf -s testing123

(5)大量のメッセージが出力されますが、最後にSUCCESSと表示されれば、ネットワーク経由でのEAP-TLS認証のテストに成功です!

FreeRADIUSをインストールしたマシン上で、Ctrl+Cと入力して、radiusdコマンドを終了させます。実際にEAP-TLS認証Wi-Fiを運用する際も、SupplicantのIPアドレス(範囲)を/usr/local/etc/raddb/clients.confに設定の上、FreeRADIUSを再起動します。

9. FreeRADIUSを自動起動させる

FreeRADIUSをsystemctlコマンドでコントロールできるように、スクリプトを作って登録します。こうすることで、systemctlコマンドを使ってFreeRADIUSを起動・停止・自動起動有効化・自動起動無効化(start,stop,enable,disable)することが可能になります。

(1)テキストエディタ(※)で以下のスクリプトを作成し、/etc/init.d/radiusdのファイル名で保存します。(※: sudoコマンドを使って起動)
$ sudo cat /etc/init.d/radiusd
#! /bin/sh
# /etc/init.d/radiusd
### BEGIN INIT INFO
# Provides: radiusd
# Required-Start: $syslog
# Required-Stop: $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: radiusd
# Description:
### END INIT INFO
#

case "$1" in
start)
echo "Starting FreeRADIUS"
/usr/local/sbin/radiusd
;;
stop)
echo "Stopping FreeRADIUS"
kill `pidof radiusd`
;;
*)
echo "Usage: /etc/init.d/radiusd {start|stop}"
exit 1
;;
esac

exit 0

(2)以下のコマンドを実行する。FreeRADIUSは起動し、OS起動時にも自動起動するようになります。
$ sudo chmod 755 /etc/init.d/radiusd
$ sudo update-rc.d radiusd defaults
$ sudo systemctl enable radiusd
$ sudo systemctl start radiusd

10. CRLを使う

電子証明書を無効化して使えなくすることを「Revokeする」と言います。Revokeされた(失効した)電子証明書の情報はCRL(Certificate Revocation List)に入り、FreeRADIUSがCRLの情報を読み込むように設定することで、失効した電子証明書の情報をFreeRADIUSに反映することが可能です。なお、CRLを作成(更新)したら、FreeRADIUSの再起動が必要になります。

ルート証明書とクライアント証明書は有効期間を3650日と長めに設定した一方で、サーバー証明書については800日と短めに設定したので、おおよそ2年毎の更新が必要になります。サーバー証明書の方が更新周期が短いので、ここではサーバー証明書をRevokeして、CRLを作成(更新)し、FreeRADIUSに情報を反映させてみます。

なお以下の内容は、実際に電子証明書をRevokeする段階になってから作業すればOKです。

(1)rootになって、certsディレクトリに移動する。
$ sudo bash
# cd /usr/local/etc/raddb/certs

(2)サーバー証明書をRevokeする。
# openssl ca -revoke server.pem -keyfile ca.key -cert ca.pem -config ca.cnf

(3)CRLを作成(更新)する。
# openssl ca -gencrl -keyfile ca.key -cert ca.pem -out crl.pem -config ca.cnf

(4)ルート証明書とCRLを一体化したファイル(ca_crl.pem)を作成(更新)する。
# cat ca.pem crl.pem > ca_crl.pem

(5)テキストエディタで/usr/local/etc/raddb/mods-enabled/eapを開き、以下の箇所について以下のように修正する。(#以降の文字列は説明なので、入力不要です。)
tls-config tls-common {
...
ca_file = /usr/local/etc/raddb/certs/ca_crl.pem #ルート証明書とCRLを一体化したファイルを指定する。
check_crl = yes #CRLのチェックを有効にします。
allow_expired_crl = yes #有効期限の切れたCRLも使えるようにします。
...
}

(6)テキストエディタで/usr/local/etc/raddb/sites-available/tlsを開き、以下の箇所について以下のように修正する。(#以降の文字列は説明なので、入力不要です。)
tls {
...
ca_file = /usr/local/etc/raddb/certs/ca_crl.pem #ルート証明書とCRLを一体化したファイルを指定する。
check_crl = yes #CRLのチェックを有効にします。
allow_expired_crl = yes #有効期限の切れたCRLも使えるようにします。
...
}

(7)FreeRADIUSを再起動する。
# systemcrl stop radiusd
# systemctl start radiusd
# exit
$

上記作業を行うとサーバー証明書が失効するので、eapol_testコマンドを使ってEAP-TLS認証のテストを行なっても、失敗するようになります。

サーバー証明書をRevokeしましたので、あらためてサーバー証明書を作成してから、上記作業のうち、(3)CRLの更新、(4)ca_crl.pemの更新、(7)FreeRADIUSの再起動を行えば、あらためて作成したサーバー証明書が有効になり、eapol_testコマンドを使ってEAP-TLS認証のテストをすると、成功するようになります。

11. 電子証明書をSupplicantにインストールする

電子証明書をSupplicant(パソコン、スマホ、タブレット等)にインストールします。

OS毎(Windows, MacOS, iOS, Android, Linux, BSD等)の詳細なインストール手順は割愛しますが、電子証明書インストールの際のポイントは以下の通りとなります。毛流麦花がiOS、Android、Windows10で電子証明書のインストールを試みたところ、いずれも成功しました。

(1)ルート証明書(ca.p12)、クライアント証明書とクライアント証明書の秘密鍵(client.p12)をインストールする。
(2)ルート証明書を信頼するように、OSを設定する。
(3)クライアント証明書のインストールに際してパスワードを聞かれたら、/usr/local/etc/raddb/certs/client.cnfのinput_password/output_password(共に同じパスワード)を入力する。(パスワードを聞かれることなくインストールできるOSもあるみたいです。毛流麦花が試したところ、Windows10では聞かれませんでした。)
(4)クライアント証明書のインストールに際してIDを聞かれる場合がある。Androidのスマホーにインストールする際に入力する欄があったので、クライアント証明書作成時に使った/usr/local/etc/raddb/certs/client.cnfのcommonNameを入力したら、インストールおよび実際のWi-Fi接続いずれも成功した。

電子証明書を端末に配布する方法ですが、配布時には端末を別のWi-Fi(WPA2 Personal(PSK)もしくはWPA3 Personal(SAE))、モバイル通信(ドコモ、KDDI、SoftBank、楽天等)でネットにつないだ上で電子メールで配布するのが手っ取り早く手軽であるものの、電子メールでの配布にセキュリティ上の懸念があると考える場合は、Windows10(1803以降)であればコマンドプロンプトを開きscpコマンドでサーバーから端末にコピーする、iOSであればMacでApple Configuratorを使って構成プロファイルを作り、iOS端末をMacにケーブルでつなぎ、構成プロファイルをケーブル経由でiOS端末に配布する、という方法もあります。

12. Wi-Fiアクセスポイントを設定する

Wi-Fiアクセスポイントについては、WPA2(WPA3) Enterprise認証および外部RADIUSサーバーでの認証に対応したものが必要になります。家庭用のWi-Fiルーター/Wi-Fiアクセスポイントでこれらの認証方法に対応したものはないので、業務/法人/SOHO用製品から選ぶことになります。

そうした製品で個人でも入手可能な製品となると、ヤマハ、バッファロー、Cisco、アライドテレシスなどのメーカーがメジャーと思われるものの、もっとも安い製品でも実売価格は3万円以上であり、気軽に買える値段ではありません。

毛流麦花は当初はヤマハのWLX212と組み合わせでEAP-TLS認証できるようにするべく、FreeRADIUSの設定作業を行なっていたのですが、eapol_testコマンドでEAP-TLS認証のテストに成功して「さあ、WPA2 Enterprise認証および外部RADIUSサーバーでの認証に対応したWi-Fiアクセスポイントを買うぞ!」と意気込んでネットであらためて調べたところ、ネットギアのWAC505を見つけ、検討の上購入しました。

WAC505を購入した理由は以下の通りです。なんといっても、(1)の値段の安さが購入の決め手となりました。
(1)値段が1万円弱と家庭用Wi-Fiルーター並の値段で、ヤマハWLX212の値段のおおよそ3分の1と安い。
(2)発売されてから2年程度経過しており、発売直後の新製品で懸念される、初期ファームウェア特有のバグ等の不具合が解消している可能性が高く、安定運用できる可能性が高い。

(2)については、要は最新製品ではないので、最新規格であるWi-Fi6には未対応です。WPA3 Personal/Enterprise認証についても未対応であったものの、2020年8月に公開された新ファームウェア(9.0.0.21)を適用することでWPA3 Personal/Enterprise認証対応になります。既存製品をファームウェア更新でWPA3対応にするとは素晴らしいですね。

本記事執筆時点で既に1ヶ月以上使っていますが、設定画面が英語のみであるものの(※)、EAP-TLS認証他特段の問題なく使えています。ちなみに電源についてはACアダプタとPoEでの動作に対応しているものの、ACアダプタは別売だったので、PoE給電に対応したL2スイッチである、同じくネットギア製のGS308Pも併せて購入しました。(※: 購入したのはAmazon.co.jpが販売・発送する正規品で日本の技適はもちろん取得しており、製品にも技適マークがついています。)

なおWAC505の設定ですが、認証方法をWPA2 Enterprise認証に設定し、外部RADIUSサーバーのIPアドレスを設定するだけなので、設定作業は簡単です。ちなみに外部RADIUSサーバーのIPアドレスはプライマリーとセカンダリーの2種類を指定できるようになっており、これに触発されてしまってラズパイを追加購入の上、自宅内RADIUSサーバーを2台にしました。(「自宅内ネットワーク機器は原則冗長化しているから」ということもあります。ルーターはRTX830をメインで使いつつ、以前使っていたFWX120に同じconfigを入れてコールドスタンバイさせていますし、L2スイッチもコールドスタンバイの予備がありますし。脱線しました。)

13. 自宅Wi-FiでEAP-TLS認証を運用しての感想

毛流麦花が自宅Wi-FiをWPA2 Enterprise認証化(EAP-TLS認証化)しようと考えた理由は、以下の通りです。

(1)WPA2 Personal(PSK)はパスワード総当たりでWi-Fi接続しようとする攻撃に対して、無防備である。MACアドレスフィルタリングは根本的な解決策にならないし、WPA2 Personal(PSK)からWPA3 Personal(SAE)になることで軽減されるかもしれないものの、根本的な解決策にはならないものと考えられる。

(2)上記(1)の問題があるため、WPA2 Personal(PSK)のパスワードを定期的かつ頻繁に変更しているが、パスワードの変更だけでなく、変更後のパスワードを端末(スマホ、タブレット、パソコン等)に設定していく作業が(そこそこの台数があるため)とても面倒である。

ということで「自宅Wi-FiをWPA2 Enterprise認証化するしかない!」と決断するに至りました。コロナ禍で自宅Wi-Fiの利用頻度が増加したという状況にも後押しされて、FreeRADIUSとOpenSSLのドキュメントを読むことから始めました。

WPA2 Enterpriseで使えるEAP認証には、EAP-TLSだけでなく、EAP-PEAPやEAP-TTLSなどもありますが、セキュリティ向上のためにやるわけであり、EAP-TLS以外を選択する考えは最初からありませんでした。

EAP-TLS認証は、クライアント証明書を端末(Supplicant)にインストールする必要があるため「運用が非常に面倒」というイメージがありますが、自宅で運用する際は、端末(Supplicant)の総数は多くてもせいぜい10数台程度ですし、クライアント証明書も端末毎ではなく端末を利用する人毎に発行すれば十分と考えられ(場合によっては、家族全員で同じクライアント証明書を共用するという運用もありです)、電子証明書の更新も、サーバー証明書は2年に1回程度、ルート証明書とクライアント証明書はもう少し長い周期で十分と考えられ、そんなに面倒とは思えません。FreeRADIUSサーバーの運用についても、ラズパイで運用すれば十分ですし、ラズパイ2台で冗長化しておけば問題なく運用できるはずです。

CRLのことを考えずに運用できるようにするのであれば、2年に1回、ルート証明書・サーバー証明書・クライアント証明書を総入れ替えする運用もありです。Supplicantの台数が多いオフィス等とは違って、台数が限られている自宅であれば、このような運用でもいけてしまうのが、EAP-TLS認証をオフィス等ではなく自宅で運用する際のメリットです。

ということで、実際に運用を開始して1ヶ月程度経過した現時点での感想は以下のようになります。
(1)WPA2 Personal(PSK)/WPA3 Personal(SAE)でパスワードを頻繁に変更するよりもWPA2 Enterprise認証(EAP-TLS認証)で運用する方が、電子証明書のインストール・更新の手間、RADIUSサーバーのメンテナンス・維持を考えてもラクである。
(2)WPA2 Personal(PSK)利用時の「自宅Wi-Fiを無断利用・悪用されたらどうしよう」という不安から解消された。
(3)上記(1)(2)のメリットが非常に大きいので、WPA2 Personal(PSK)認証やWPA3 Personal(SAE)認証での運用にはもう戻れない。

14. (追記)Debian 11(bullseye,64bit)環境でのビルド

Raspberry PiのOSを64bit版に更新したのに伴い、FreeRADIUSをビルドし直したので、その際の作業手順をメモします。Raspberry PiのOSのバージョンは、Release date:April 4th 2022, 64bit, Linux kernel 5.15, Debian 11(bullseye)です。本章執筆時(2022/5/5)の最新バージョンは、FreeRADIUSは3.2.0、tallocは2.3.3で、インストールしたのもこれらのバージョンとなります。


【Debian 11(bullseye,64bit)環境でのビルド】
(1)tallocのビルドとインストール
$ wget https://www.samba.org/ftp/talloc...
$ tar xvzf (ダウンロードしたファイル名).gz
$ sudo apt-get install python3-dev
$ cd (Makefileのあるディレクトリ)
$ ./configure
$ make
$ sudo make install

(2)FreeRADIUSのビルドとインストール
$ wget ftp://ftp.freeradius.org/...
$ tar xvzf (ダウンロードしたファイル名).gz
$ sudo apt-get install libssl-dev
$ cd (Makefileのあるディレクトリ)
$ ./configure --build=arm
$ make
$ sudo make install

FreeRADIUSをビルドする際、buildオプションでアーキテクチャを指定する必要があり、Makefileを調べた上でarmでビルドしました。出来上がったバイナリを調べると、以下のようにELF 64-bitと表示されているので、これで間違いなさそうです。

pi@raspberrypi:~ $ file `which radiusd`
/usr/local/sbin/radiusd: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, ...

15. 参考情報

毛流麦花は、以下のサイトの情報および標準化文書(RFC、IEEE)を参考にFreeRADIUSの設定作業を行いました。読んでいただくとわかりますが、どれも丁寧に記述されており、非常にわかりやすいです。これらの情報がなければFreeRADIUSの設定作業をここまでスムーズに行うことはできず、結果として本記事をまとめることもなかった(できなかった)と思います。これらの記事を執筆された方々にあらためて感謝申し上げます。

Getting Started

A very basic (but functional) eduroam configuration

FreeRADIUS Documentation

FreeRADIUS and CRLs

[RFC 5216] “The EAP-TLS Authentication Protocol”

[RFC 3748] “Extensible Authentication Protocol (EAP)”

[IEEE 802.1X] “Port-Based Network Access Control” (EAPOL(EAP over LAN)の詳細はこれに載っています。)

[RFC 3579] “RADIUS (Remote Authentication Dial In User Service) Support For Extensible Authentication Protocol (EAP)”

[RFC 2685] “Remote Authentication Dial In User Service (RADIUS)”

[RFC3580] “IEEE 802.1X Remote Authentication Dial In User Service (RADIUS) Usage Guidelines”

スポンサーリンク
error: Content is protected !!