OpenWRTのFreeRadiusでWPA2-Enterpriseを使う

FreeRadiusは結構大きなアプリケーションなので今までは省エネARMのサーバ等で動かしていましたが、最近のルーターは高性能化しているのでインストールしてもルーター機能を損なわず使えます。OpenWRTでFreeRadiusをインストールしてWPA2-Enterprise機能を自己完結させてみます。

パッケージのインストール

opkg update
opkg install freeradius3 freeradius3-common freeradius3-default \
  freeradius3-democerts freeradius3-mod-always freeradius3-mod-attr-filter \
  freeradius3-mod-chap freeradius3-mod-detail freeradius3-mod-digest \
  freeradius3-mod-eap freeradius3-mod-eap-tls \
  freeradius3-mod-exec freeradius3-mod-expiration \
  freeradius3-mod-expr freeradius3-mod-files \
  freeradius3-mod-logintime \
  freeradius3-mod-passwd freeradius3-mod-preprocess \
  freeradius3-mod-radutmp freeradius3-mod-realm \
  freeradius3-mod-rest freeradius3-mod-unix freeradius3-utils \
  libopenssl1.1 openssl-util
server default {

listen {
        type = auth
        ipaddr = *
        ipv6addr = ::
        port = 0
}

authorize {
        preprocess
        eap {
                ok = return
        }
        expiration
        logintime
}
authenticate {
        eap
}
preacct {
        preprocess
        acct_unique
        suffix
}
session {
        radutmp
}
post-auth {
        exec
        Post-Auth-Type REJECT {
                attr_filter.access_reject
        }
}
pre-proxy {
}
post-proxy {
        eap
}
}

必要ないリンクを消してシンボリックリンクを追加します。

cd /etc/freeradius3/sites-enabled
rm *
ln -s ../sites-available/eap_auth

eapモジュールを変更します。

eap {
	default_eap_type = tls
	timer_expire     = 60
	ignore_unknown_eap_types = no
	cisco_accounting_username_bug = no
	max_sessions = ${max_requests}
	tls-config tls-common {
		private_key_password = whatever
		private_key_file = /etc/freeradius3/ssl/server.pem
		certificate_file = /etc/freeradius3/ssl/Radius_Server_Certificate.crt
		ca_file = /etc/freeradius3/ssl/Radius_Certificate_Authority.crt
		dh_file = /etc/freeradius3/ssl/dh
		ca_path = ${cadir}
		cipher_list = "HIGH"
		cipher_server_preference = no
		tls_min_version = "1.2"
		tls_max_version = "1.2"
		ecdh_curve = "prime256v1"
		cache {
			enable = no
			lifetime = 24 # hours
		}
		verify {
			tmpdir = /tmp/radiusd
			client = "/usr/bin/openssl verify -CApath /etc/freeradius3/ssl %{TLS-Client-Cert-Filename}"
		}
		ocsp {
			enable = no
			override_cert_url = yes
			url = "http://127.0.0.1/ocsp/"
		}
	}
	tls {
		tls = tls-common
	}
}

アクセスするネットワークを指定します。

client host_v4 {
  ipv4addr = 127.0.0.1/8
  secret = <MY PASS>
  shortname = localAP
  require_message_authenticator = yes
}

client host_v4 {
  ipv4addr = 192.168.1.0/24
  secret = <MY PASS>
  shortname = localAP
  require_message_authenticator = yes
}

フィヤーウォールに追加します。

config rule
	option name 'Allow-LAN-radius'
	list proto 'udp'
	option src 'lan'
	option dest_port '1812'
	option target 'ACCEPT'

証明書の作成

opensslのフロントエンドのXCAを使って作成。

ルート証明書

サーバ証明書

ユーザー証明書

証明書の書き出し

ルート証明書

サーバ証明書

ユーザー証明書

サーバー鍵

ユーザー鍵

ルート証明書とサーバ証明書およびサーバー鍵をfreeradiusの/etc/freeradius3/sslに移します。

DH parametersを作成します。

openssl dhparam -out dh 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
....................................................................................................................++*++*++*++*

OpenSSLがアクセスするためにc_rehashで設定します。c_rehashコマンドはOpenWRTにないのでDebian等から持ってきます。Perlスクリプトなのでperlをインストールします。

opkg instlal perl
./c_rehash .
Doing .
WARNING: New_Radius_Server_Certificate.pem does not contain a certificate or CRL: skipping
WARNING: server.pem does not contain a certificate or CRL: skipping
# ls
47caa39b.0                            New_Radius_Certificate_Authority.pem  c_rehash
56b8c321.0                            New_Radius_Server_Certificate.pem     dh
8fe52b24.0                            Radius_Server_Certificate.crt         f4a5b3ee.0

c_rehash: https://mega.nz/file/9aQw2ZTS#0gyJSChqvOZvHaLsYlLfgCRC7pvJStKX92H3TDTj5C4

テストしてエラーがなければサーバー起動します。

# radiusd -X

Wi-Fiの設定

Wi-FiパッケージをWPA-Enterrpriseを使えるように入れ替えます。

opkg remove wpad-basic-wolfssl
opkg install wpad-wolfssl

リブートしてダッシュボードからWi-Fiを設定します。

クライアントの設定

Windows、macOS、AndroidはPKCS#12 Chain形式で証明書を呼び込みます。macOSはApple Comfigulator 2を使います。