無線LAN APに802.1X 認証を導入する
MMA Advent Calendar 2024 15日目の記事です
はじめに
最近新しいアクセスポイントを調達し,802.1X認証ができるようになりました.
802.1X認証を導入することで,Wi-Fiをつなげるための事前共有鍵を教える必要がなくなり,利便性が向上することが期待できます.
というわけでせっかくなので,構築してみました.
今回の環境
サブネット | IPアドレス | FQDN | 備考 | |
---|---|---|---|---|
ゲートウェイ | 192.168.0.0/24 | 192.168.0.1 | - | ソフトウェアルーター |
LDAPサーバー | 同上 | 192.168.0.2 | ldap.example.com | OS: Ubuntu 24.04 LTS |
RADIUSサーバー | 同上 | 192.168.0.3 | radius.example.com | OS: Ubuntu 24.04 LTS |
AP | 同上 | 192.168.0.4 | - | Cisco Aironet 3800 Series |
すでにLDAPサーバーが構築済みである前提で進みます.
LDAPには,MS-CHAPv2認証のために,Samba用パスワードのフィールドが必要です.
RADIUSサーバーの構築
802.1X認証には,RADIUSサーバーの構築が必要です.
今回はLinuxに構築できるFreeRADIUSを使います.
FreeRADIUSのインストール
まず,aptから必要なパッケージをインストールします.
$ sudo apt install freeradius freeradius-ldap freeradius-utils
証明書の作成
EAP-PEAP通信に必要な証明書を準備します.オレオレ証明書で構いません.
freeradiusがアクセスできるように,UIDをfreerad
に変更しておきます.
$ mkdir /etc/ssl/freeradius
$ cd /etc/ssl/freeradius
$ cp <秘密鍵のパス> privkey.pem
$ cp <公開鍵のパス> cert.pem
$ chown -R freerad:root .
$ chmod 700 .
設定ファイルの編集
任意のシークレットパスワードを決めてclients.conf
に書き込みます.
シークレットパスワードはAPに設定する際に使います.
# 以下を追記
client private-wifi {
ipaddr = 192.168.0.0/24
secret = (secretパスワード)
}
LDAP認証をするために各設定ファイルを編集します.
# 以下を追記
VALUE Auth-Type LDAP 5
users
にも追記します.ほかの項目はコメントアウトしてください.
# 以下を追記して,他の項目をコメントアウト
DEFAULT Auth-Type = LDAP
Fall-Through = 1
シンボリックリンクを配置し,LDAPモジュールを有効にします.
$ cd /etc/raddb/mods-enabled/
$ ln -s ../mods-available/ldap ldap
LDAP認証をするための設定です.NT-Password
は,LDAPのSambaパスワードが代入されているフィールド名を設定します.
19c19
< server = 'localhost'
---
> server = 'ldap.example.com'
28,29c28,29
< #identity = 'cn=admin,dc=example,dc=org'
< #password = mypass
---
> identity = 'cn=admin,ou=example,c=com' # BINDユーザーのDN
> password = <BINDユーザーのパスワード>
33c33
< base_dn = 'dc=example,dc=org'
---
> base_dn = 'ou=People,ou=example,c=com'
130c130
< #control:NT-Password := 'ntPassword'
---
> control:NT-Password := 'sambaNTPassword'
615c615
< #start_tls = yes
---
> start_tls = yes
617c617
< #ca_file = ${certdir}/cacert.pem
---
> ca_file = /etc/ssl/certs/ca-certificates.crt
証明書のパスは所定のものに読み替えてください.
27c27
< default_eap_type = md5
---
> default_eap_type = peap
200,201c200,201
< private_key_password = whatever
< private_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
---
> #private_key_password = whatever
> private_key_file = /etc/ssl/freeradius/privkey.pem
237c237
< certificate_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
---
> certificate_file = /etc/ssl/freeradius/cert.pem
452c452
< -ldap
---
> ldap
597,599c597,599
< #Auth-Type LDAP {
< # ldap
< #}
---
> Auth-Type LDAP {
> ldap
> }
877c877
< #ldap
---
> ldap
34c34
< ipaddr = 127.0.0.1
---
> ipaddr = *
154c154
< -ldap
---
> ldap
271,273c271,273
< #Auth-Type LDAP {
< # ldap
< #}
---
> Auth-Type LDAP {
> ldap
> }
344c344
< # ldap
---
> ldap
最後に,freeradiusを再起動して設定を反映します.
$ systemctl restart freeradius.service
ファイアーウォールの設定
UFWが有効であれば,RADIUSで使うポートの通信は許可するようにします.
$ sudo ufw allow from 192.168.0.0/24 to any port 1812
$ sudo ufw allow from 192.168.0.0/24 to any port 1813
APの設定
Cisco Aironet 3800 Seriesの設定例です.
WebUI上で設定します.先に右上のボタンから「エキスパートビュー」に切り替えてください.
RADIUSサーバーの登録
「管理」→「管理アカウント」→「RADIUS」を開きます.
下にスクロールし,「RADIUS認証サーバーを追加する」と書かれたボタンを押します.
「サーバIPアドレス」にRADIUSサーバーのアドレスを,
「共有秘密」に,先にFreeRADIUS側で設定したシークレットパスワードを入れます.
入力したら「適用」しましょう.
WLANの設定
「ワイヤレス設定」→「WLAN」に戻ります.
「新規WLAN/RLANの追加」のボタンを押します.
「SSID」に,設定したいSSIDを入力します.
「WLANセキュリティ」に移動し,セキュリティタイプをWPA2Enterprise
に変更します.
下にスクロールし,「RADIUS認証サーバを追加する」ボタンを押します.
先ほど追加したRADIUSサーバーのIPアドレスを選択し,「適用」を押します.
無事追加されていることが確認出来たら,「適用」を押します.
追加されました.
接続
Windowsの場合
普段通り,Wi-FiのSSID一覧から設定したSSIDのWLANをクリックします.
「ユーザー名」と「パスワード」が求められるので入力して接続します.
Androidの場合
普段通り,Wi-FiのSSID一覧から設定したSSIDのWLANをタップします.
「CA証明書」を「初回使用時に信頼する」を選びます.
「ID」に「ユーザー名」を,「パスワード」にパスワードを入力します.
「匿名ID」はそのままです.
おわりに
これで,無事クライアントからLDAP認証に使われるユーザー名とパスワードだけで接続できるようになりました.
また,MS-CHAP v2が脆弱であることは周知のとおりですが,便利さゆえに依存性を脱却できないのがよくわかりました😅
追記
PEAP認証に使う証明書は,オレオレ証明書を使うだけでなく,公的なCA機関から認証された証明書を使う手段もあります.それどころか,ドメイン認証ができるため,中間者攻撃に対してより耐性が強くなりそうです.
ただ,Windowsだと証明書が正規のものか確認している感じがしなかったので,セキュリティ向上が期待できるのはAndroidぐらいといったところでしょうか.
いずれにせよ,PEAP (MS-CHAP v2)は使うのは避けるべきであることに変わりはないですが...
参考
Discussion