Free RADIUSを使ったWiFiユーザー認証システムの構築

Linux

WiFiアクセスポイントの導入規模が数十台~数百台になると、現地調整で対処することができないため、LinuxのFree RADIUSを使って導入先と同等の模擬環境を作り、事前検証する必要があります。

本記事では、RADIUSサーバー構築、WiFiアクセスポイントやワイヤレスコントローラ(WLC)との連携、携帯端末を使った確認方法について記載します。

システム環境

本記事のシステム環境は以下のとおりです。最上位のルーターは以前の記事で紹介したUbiquitiのDream Machineです。

  • RADIUSサーバー:NEC Versapro (2016年製の古いPCです)
  • OS:Rocky Linux 9 (Ubuntuでも動くらしいですが、ファイルシステムの配置が若干異なるため、手間がかかります。やはりCentOS系がいいです。)
  • RADIUSソフト:Free RADIUS 3.0
  • 適合するWiFiアクセスポイント:RADIUS認証に対応する製品(Cisco 9100series, aruba 505series, furuno systems ACERA1310, NETGEAR WAX/WACシリーズ)※注意:ほとんどの家庭用WiFiルータはRADIUS認証に対応していません。
  • 接続検証用端末:iphone 6以降, Android 11以降, Windows10 PC

認証方式はPEAP(MSCHAPV2)一択

本記事では実際に現場で使われる以下設定とします。

  • 使用する認証方式はパスワード認証方式である「PAP」と「PEAP」のみとします。
  • PAP認証はWiFiアクセスポイントで使えなくなっているため、動作確認まではしていません。(古いルーターやスイッチはPAP認証がサポートされているようですが未確認です)
  • TLS認証(RADIUS証明書を端末にインストールする方式)は動作確認まではしていません。本記事のTLS認証はFree RADIUSデフォルト値で設定しています。
  • RaduisサーバーとWiFiアクセスポイントは同一セグメントにしています。実際はRADIUSサーバーを別セグメントに配置することになることがほとんどですが、ルーターを挿入することで対処できますので本記事では割愛します。

Free RADIUSのインストール

Free RADIUSのインストールは、RedHat系のパッケージ管理コマンド「yum」で行います。

[falcon@localhost ~]$ su
パスワード:
[root@localhost falcon]# yum -y update
[root@localhost falcon]# yum -y install freeradius freeradius-utils

Linux PCがインターネットにさえ繋がっていれば簡単にできます。

基本動作設定+PAPの設定

インストール後、「/etc/raddb」が生成されていることを確認します。

root@localhost falcon]# cd /etc/raddb/
[root@localhost raddb]# ls
README.rst    hints           mods-enabled  radiusd.conf     trigger.conf
certs         huntgroups      panic.gdb     sites-available  users
clients.conf  mods-available  policy.d      sites-enabled
dictionary    mods-config     proxy.conf    templates.conf

Free RADIUSは、/etc/raddb配下にある2つの設定ファイルで動作設定を行います。

  • /etc/raddb/users
  • /etc/raddb/clients.conf

Free RADIUSは、基本的にこの2ファイルに設定追記・修正・コメントアウトするだけで、システム制御ができます。

/etc/raddb/usersの編集

usersファイルには、接続を許可するユーザーアカウント情報を記載します。

「ユーザー名:falcon-radius、パスワード: falcon-admin」を設定したい場合は、以下のように記述します。

# falcon-test
falcon_radius Cleartext-Password := "falcon_admin"

# 複数userは行をつけたしていく
falcon_radius1 Cleartext-Password := "falcon_admin"
falcon_radius2 Cleartext-Password := "falcon_admin"
falcon_radius3 Cleartext-Password := "falcon_admin"

# MACアドレスで認証する場合は以下の通りに記述する
c16b55ac52c9 Cleartext-Password := "c16b55ac52c9"
# MACアドレスの表記形式はWiFi側の仕様に合わせます。
# Cisco機器は通常すべてアルファベットは小文字で区切り、-や:の文字は入れません。
# -,:で区切る場合はCLI経由でのオーセンティケーターの設定変更が必要です
# MACアドレス認証は端末側のランダムMACがONになっていると認証できないので注意

MACアドレス認証は、WiFiのメーカーによってMACアドレスの記述フォーマットが異なるため、WiFiアクセスポイント(オーセンティケーター)の仕様に合わせて記述する必要があります。

Ciscoの場合は、MACアドレスの区切り文字無しがデフォルトとなります。「-」や「:」での区切りもできますが、CLIから設定が必要ですので少々大変です。

/etc/raddb/clients.confの編集

clients.confには、RADIUSへの接続を許可するWiFiアクセスポイント(またはWirelessコントローラ)をIPアドレスで指定します。

ここのsecretは、WiFiアクセスポイントがRADIUSサーバーに接続するときのパスワードです。WiFi接続時のユーザー・パスワードではありませんので注意してください。

=== localhostのsecret設定
client localhost { 
# secret = testing123
  secret =falconsecret

===ネットワーク経由のsecret設定
#  You can now specify one secret for a network of clients.
#  When a client request comes in, the BEST match is chosen.
#  i.e. The entry from the smallest possible network.
#
client private-network-1 {
  ipaddr		= 0.0.0.0/0 #全端末のアクセス許可をする場合
  secret		= falconsecret # "-"は使えないので注意!
}

#client private-network-2 {
#  ipaddr		= 192.168.51.0/24 #192.168.51.0-254をアクセス許可する場合
#  secret		= falconsecret # "-"は使えないので注意!
#}

WiFiシステムをアクセスポイントに内蔵されるEWC(仮想コントローラ)で構築する場合は、代替EWCコントローラとなる可能性のある、WiFiアクセスポイントのIPアドレス範囲も許可しておくようにします。

PEAP(=MSCHAPV2)の設定

次にPEAP認証の設定を行います。PEAP認証とは、RADIUSサーバーの証明書を端末にダウンロードし、証明書を持つ端末のみアクセス許可する方式です。

パスワードだけのPEPに比べて強固なセキュリティとなり、証明書は初回接続時に自動でダウンロードされて個別に配布する必要がないため、利便性が高く、学校や企業などで主に使われている認証方式となります。

Free RADIUSでのPEAP認証設定は、以下手順でセットアップを進めます。

  1. /etc/raddb/certs/ca.cnfの設定 :ca証明書の設定ファイル
  2. /etc/raddb/certs/client.cnfの設定 :クライアント証明書の設定ファイル
  3. /etc/raddb/certs/server.cnfの設定 :サーバー証明書の設定ファイル
  4. 証明書の作成(make all)
  5. RADIUSの起動(radiusd -X)
  6. localhostでの動作テスト
/etc/raddb/certs/ca.cnfの編集

ca.cnfは、default daysを60日では短すぎるので1,000日に拡張します。

[ CA_default ]
default_days		= 1000 # 60を1000に変更
default_crl_days	= 30
/etc/raddb/certs/client.cnfの編集

client.cnfは、ca.cnfと同じようにdefault daysの修正と、client情報の修正をします。

[ CA_default ]
default_days		= 1000 # 60を1000に変更
default_crl_days	= 30

[client]
emailAddress		= falcon@falconblog.org # 端末にインストールされる証明書のファイル名
commonName		= falcon@falconblog.org # peap認証ログに表示されるユーザー名
/etc/raddb/certs/server.cnfの編集

server.cnfは、default daysを60日から824日へ修正します。

824日にするのはiphoneがこれ以上長いと不適正としてリジェクトするとの情報から設定しているのですが、筆者は試してないので真偽は不明です。

[ CA_default ]
default_days		= 824 # 60を824に変更
default_crl_days	= 30
証明書の生成(make all)

各cnfファイルの修正が終わりましたら、証明書の作成をします。

証明書の作成といっても「make all」コマンドで一括作成できます。

証明書の生成は、opensslを使った計算処理がありますので、非力なマシン(core i3-5005)の場合は5分程度かかりました。(core i7-10700だと数秒でした)

# make all

証明書類を作り直しする場合、make destroycertsで一括消去できます。

# make destroycerts
rm -f *~ dh *.csr *.crt *.p12 *.der *.pem *.key index.txt* \
      serial*  *\.0 *\.1 ca-crl.pem ca.crl

またca, client, serverは個別に証明書を生成することもできます。

設定ファイルの修正を行った場合は個別に再生成することで時短になります。

[root@localhost certs]# make ca.pem
[root@localhost certs]# make client.pem
[root@localhost certs]# make server.pem

RADIUSのテスト起動

証明書を生成すると、ようやくRADIUSを起動することができるようになります。

Free RADIUSは証明書を作るまではエラーとなって起動しませんので注意が必要です。

テスト起動はスーパーユーザーで「radiusd -X」と入力するだけです。

radiusdを起動すると、大量のログとともに最終行にReady to process requestsが表示され、認証要求待ちになります。

# radiusd -X

(中略)
Listening on auth address * port 1812 bound to server default
Listening on acct address * port 1813 bound to server default
Listening on auth address :: port 1812 bound to server default
Listening on acct address :: port 1813 bound to server default
Listening on auth address 127.0.0.1 port 18120 bound to server inner-tunnel
Listening on proxy address * port 56403
Listening on proxy address :: port 60386
Ready to process requests

この状態で、WiFiアクセスポイントからRADIUSサーバーに認証要求が到来すると、認証状況のログが表示されます。

端末が認証エラーでアクセスできない場合は、ここのログをみてどのフェーズでFailしているか確認することができます。

ローカルでの動作テスト

radiusdが起動できたら、まずはRADIUSサーバーのコンソールからローカルでradtest, eap_testというツールを使って自己認証テストをします。

PAPの動作テスト

PAPは、radtestというツールでコマンド一括で簡単に認証テストができます。

具体的には、radtestコマンドを発行して、Received Access-Acceptとレスポンスがあれば正常稼働です。

$ radtest -t pap falcon falcon localhost 0 falconsecret
Sent Access-Request Id 82 from 0.0.0.0:41604 to 127.0.0.1:1812 length 76
  User-Name = "falcon"
  User-Password = "falcon"
  NAS-IP-Address = 127.0.0.1
  NAS-Port = 0
  Message-Authenticator = 0x00
  Cleartext-Password = "falcon"
Received Access-Accept Id 82 from 127.0.0.1:1812 to 127.0.0.1:41604 length 20
  Reply-Message = "Hello, falcon"

PAPは実際のWiFi認証ではもう使われていませんが、RADIUSサーバーの動作テストとしては、とても便利ですので、システム構築直後はよく使います。

PEAP(MSCHAPV2)の動作テスト

PEAP認証は、RAIDIUSサーバーで作成した証明書が必要とする認証方式であるため、PAPのようにユーザーとパスワードを含んだコマンド一発でテストはできません。

そのため、最初に証明書(/etc/raddb/certs/ca.pem)を、superuser権限で自フォルダにコピーする作業を行います。またユーザーで読み取れるよう権限の変更も行います。

# cp /etc/raddb/certs/ca.pem ./
# chmod 666 ./ca.pem

PEAP認証テストをする際のパラメータ入力は、コマンドラインで入力すると長くなるため、設定ファイル(./peap-test.conf)をnanoやgedit等のテキストエディタで作成します。

[root@localhost falcon]# more peap-test.conf 
network={
key_mgmt=WPA-EAP
eap=PEAP
identity="falcon"
password="falcon"
phase2="autheap=MSCHAPV2"
ca_cert="ca.pem"
}

設定ファイルが完成したら、eapol_testというツールで認証テストを行います。

eapol_testを実行すると、大量のログが表示されて圧倒されますが、最終行にSUCCESSと表示されたら動作テストは成功です。

[root@localhost falcon]# eapol_test -a 127.0.0.1 -c peap-test.conf -s falcon-secret

(中略)
eapol_sm_cb: result=1
EAPOL: Successfully fetched key (len=32)
PMK from EAPOL - hexdump(len=32): 71 05 70 00 76 80 04 96 73 9d 08 28 61 4a e6 ed b0 c2 cb 7c 18 bb b9 5a 2c 39 d5 83 db 6b 64 c8
No EAP-Key-Name received from server
WPA: Clear old PMK and PTK
EAP: deinitialize previously used EAP method (25, PEAP) at EAP deinit
ENGINE: engine deinit
MPPE keys OK: 1  mismatch: 0
SUCCESS

ただし、PEAP認証はそこそこのネットワーク専門知識も必要であり、設定項目もたくさんありますので、なかなかSUCCESSまで到達できません。

うまく行かない場合は、radiusdのログを手がかりにデバッグ作業が必要です。

筆者は3回ほどシステム構築しましたが、大抵のミスは以下パターンであることが多かったので、根気よく探してみてください。

  • clients.conf, usersのユーザー名、パスワードが間違っている
  • clients.conf, usersをデフォルトのままで何も修正していない→絶対動きません
  • clients.confのオーセンティケーター受付アドレス設定が間違っている、もしくは複数設定している場合、受付アドレス範囲が重複していてどちらかが無効になっている
  • clients.conf, usersを編集したあとに、radiusdを再起動していない
  • 既にdeamonでradiusdが動いていて、radiusd -Xが起動しない
  • ローカルに落としたca.cnfが古い

(補足)radiusdがdeamonで動いてしまっている場合は、radiusdのpidを調べて、killすることで起動できるようになります。

root@localhost certs]# ps -aux |grep radiusd
radiusd    44474  0.4  4.7 133196 85712 ?        Ssl  16:36   0:00 /usr/sbin/radiusd -d /etc/raddb
root       44485  0.0  0.1 221676  2336 pts/1    S+   16:36   0:00 grep --color=auto radiusd
[root@localhost certs]# kill -9 44474
[root@localhost certs]# ps -aux |grep radiusd
root       44502  0.0  0.1 221676  2348 pts/1    S+   16:36   0:00 grep --color=auto radiusd

ネットワーク経由での動作テスト

次にネットワーク経由で動作テストしますが、最初にファイアウォールを停止します。

これを忘れるとRADIUSが全く応答できず、延々と悩むことになりますので必ず行います。

Fire Wallは、自動起動がデフォルトとなっているため、同時に自動起動も外しておくと良いでしょう。忘れていると、Linuxに不慣れな方が検証で使うときでも「動かない助けて」と騒がれてしまいます。

firewall サービス停止
# systemctl stop firewalld

firewalld自動起動停止
# systemctl disable firewalld
PAPのネットワーク経由の動作テスト

次はネットワーク経由で別のLinux端末からPAPのradtestをします。

このテストは、別のLinux端末が必要となるだけでなく、radius utilsもインストールしておかないといけないため、端末が準備できない場合は、割愛してもいいと思います。

$ radtest -t pap falcon falcon 192.168.0.107 0 falconsecret
(中略)
Received Access-Accept Id 230 from 192.168.0.107:1812 to 192.168.50.130:38224 length 35
  Reply-Message = "Hello, falcon"
PEAPのネットワーク経由の動作テスト

PEAPもネットワーク経由で動作テストすることもできます。

PEAP認証テストを外部Linux端末から行うには、RADIUSサーバーの/etc/raddb/certs/ca.pemを自端末にコピーする必要がありますので、以下のコマンドで入手します。

[falcon@localhost ~]$ scp falcon@192.168.0.107:~/ca.pem ./
falcon@192.168.0.107's password: 
ca.pem                                        100% 1785   180.9KB/s   00:00    

ca.pemが入手できたら、RADIUSサーバーに向けてeapol_testを行い認証テストができます。

$ eapol_test -a 192.168.0.107 -c peap-test.conf -s falcon-secret

しかし、筆者はこの確認を割愛することにしています。

理由としては、対向するLinuxマシンが手元にないので、Windows10上のVMwareで仮想環境で動かして動作させてみることにするのですが、VMwareのNATでは外部からの通信が遮断さてしまい、対処方法が思いつかなかったので諦めてしまいました。(外付けNICがあれば簡単だと思いますが、あいにく持っていません。)

またWiFi認証でRADIUSを使う場合は、証明書が初回認証時に自動的にダウンロードされるため、証明書コピーという行為はそもそも不要です。

eapol_testがSUCCESSになればセルフテストは完了です。

WiFiアクセスポイントのRADIUS設定

RADIUSサーバーが構築できましたので、次はWiFiアクセスポイントにRADIUS認証の設定をします。

WiFiアクセスポイントへの設定は、以下の2つの設定をするだけでよく、ものすごく簡単です。

  • RADIUSサーバーのアドレスとパスワードを設定
  • SSIDの認証設定を「WPA2 Professional」に設定

ここではNETGEAR WAC505での設定例を示します。

ほとんどのWiFiアクセスポイントは、これでRADIUSに認証設定が完了です。

Cisco Catalistの場合は、大量のWiFiアクセスポイントを管理できるように工夫されているため、AAAとタグ付け設定が必要となり、概ね5手順ほどが必要です。

端末接続テスト

最後にiPhone, Android端末から接続する方法を紹介します。

WiFi接続テストは、ノートPCからでも接続はできますが、スマホでのテストがお手軽で便利です。

iPhoneの場合

設定→WiFi→ネットワークからSSIDを選択します。

自動でWPA2 Enterpriseが選択されるので、ユーザー名とパスワードを入力します。

証明書が表示されるので「信頼」をタップすれば、証明書が自動でダウンロードされ、WiFiに接続できます。

証明書の有効期限は1,000日で設定していますので、期限を超えた場合はRADIUS側で再度証明書を作り直しが必要です。

Androidの場合(Android12)

設定→インターネット→WiFiでSSIDを選択すると以下の設定画面になります。

EAP方式はPEAP、認証はMSCHAPV2、CA証明書は検証しないを選択し、ユーザー名とパスワードを入力すれば接続できます。IDと匿名IDは、同じ値を入れます。

WiFi接続が確立して、スマホからインターネットにアクセスできるようになれば、構築完了です。

RADIUS導入は少々難易度が高い

今回は仕事でFreeRADIUSを使う必要性に迫られたので、構築方法を記事にすることができました。

しかし実際に構築をしてみると、Linuxとネットワークに精通しておく必要がありますし、WiFiは動かすこともそこそこ大変なシステムですから、難易度はかなり高いように思います。

FreeRADIUS自体は、Windows10上のVMwareなどでも構築できると思いますが、NAT超えがなんともうまくいかないため、まだ構築に至っていません。

VMwareを使う場合は、NIC(LANモジュール)を増設したほうが、トラブル時の切り分けが容易になり、時短につながると思います。

この記事がみなさまのお役に立てれば幸いです。