🙆

無線LAN APに802.1X 認証を導入する

2024/12/14に公開

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に設定する際に使います.

/etc/freeradius/3.0/clients.conf
# 以下を追記
client private-wifi {
       ipaddr          = 192.168.0.0/24
       secret          = (secretパスワード)
}

LDAP認証をするために各設定ファイルを編集します.

/etc/freeradius/3.0/dictionary
# 以下を追記
VALUE           Auth-Type               LDAP    5

usersにも追記します.ほかの項目はコメントアウトしてください.

/etc/freeradius/3.0/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パスワードが代入されているフィールド名を設定します.

/etc/freeradius/3.0/mods-enabled/ldap
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

証明書のパスは所定のものに読み替えてください.

/etc/freeradius/3.0/mods-enabled/eap
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
/etc/freeradius/3.0/sites-enabled/default
452c452
< -ldap
---
> ldap
597,599c597,599
< #Auth-Type LDAP {
< #        ldap
< #}
---
>  Auth-Type LDAP {
>          ldap
>  }
877c877
< #ldap
---
>  ldap
/etc/freeradius/3.0/sites-enabled/inner-tunnel
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機関から認証された証明書を使う手段もあります.それどころか,ドメイン認証ができるため,中間者攻撃に対してより耐性が強くなりそうです.

https://hgot07.hatenablog.com/entry/2022/07/07/163703\

ただ,Windowsだと証明書が正規のものか確認している感じがしなかったので,セキュリティ向上が期待できるのはAndroidぐらいといったところでしょうか.

いずれにせよ,PEAP (MS-CHAP v2)は使うのは避けるべきであることに変わりはないですが...

参考

https://qiita.com/miyuki_samitani/items/b19aa5ac3b3c6e312bd5

https://heartbeats.jp/hbblog/2021/09/openssl3.html

https://tsunokawa.hatenablog.com/entry/2015/10/23/153943

Discussion