(旧)OpenWrtでWPA2-Enterprise(EAP-PEAP/MSCHAPv2)の構築

FreeRADIUSをDebianに導入するのは容易ですがOpenWrt (Chaos Calmer 15.05.1)にインストールする場合はいくつか問題があります。EAP-TLSをセットアップしてみたところ次のようなエラーがありました。

Unknown TLS version [length 0002]

調べてみるとFreeRADIUSがopensslのTLSv1.2を理解できないことが原因のようです。OpenWrtでFreeRADIUSを使うことは不可能かというとそうでもありません。以前、EAP-PEAPをセットアップしたところCA証明書なしに接続できました。つまりユーザー/パスワードだけでTLS認証なしに接続できます。実際、EAP-PEAPでセットアップするとTLSも必要になるのですが、うまく回避して接続できるようです。

今回、バッファローのwmr300にインストールしてみました。この機種は携帯用に便利ですがフラッシュメモリが8MBと制約あります。それ以外は特に問題はありません。

FreeRADIUSのセットアップに必要なパッケージ

まず、FreeRADIUSのパッケージをインストールします。

# opkg update
# opkg install freeradius3 freeradius3-common freeradius3-democerts freeradius3-mod-always freeradius3-mod-attr-filter freeradius3-mod-attr-rewrite freeradius3-mod-chap freeradius3-mod-detail freeradius3-mod-eap freeradius3-mod-eap-mschapv2 freeradius3-mod-eap-peap freeradius3-mod-eap-tls freeradius3-mod-exec freeradius3-mod-expiration freeradius3-mod-expr freeradius3-mod-files freeradius3-mod-logintime
# opkg install freeradius3-mod-mschap freeradius3-mod-passwd freeradius3-mod-preprocess freeradius3-mod-radutmp freeradius3-mod-realm freeradius3-utils freeradius3-mod-digest freeradius3-mod-unix

次にopensslコマンドを使えるようにパッケージをインストールします。またWPAエンタープライズを使用するにはwpadが必要なので入れ替えます。

# opkg install openssl-util libopenssl
# opkg remove wpad-mini
# opkg install wpad

秘密鍵と証明書のインストール

opensslの使い方は過去の記事にいくつか書きましたが、今回は検索したサイトを参考に作成してみました。

# openssl ecparam -out ecca.param -name secp384r1
# openssl req -nodes -newkey ec:ecca.param -days 3650 -x509 -sha256 -keyout ecca.key -out ecca.crt
# openssl req -nodes -newkey ec:ecca.crt -days 3650 -sha256 -keyout serverec.key -out serverec.csr

# mkdir ./demoCA/
# mkdir ./demoCA/newcerts
# touch ./demoCA/index.txt
# echo 01 > ./demoCA/serial

# openssl ca -extensions v3_ca -days 3650 -out serverec.crt -in serverec.csr -cert ecca.crt -keyfile ecca.key
# cat serverec.crt serverec.key > serverec.pem
# openssl dhparam -out dhparam.pem 2048
# mkdir /etc/freeradius2/certs
# cp ecca.crt serverec.pem dhparam.pem /etc/freeradius2/certs

秘密鍵と証明書をインストールしたら証明書のテストをしてみます。

# openssl x509 -in serverec.crt -text
# openssl verify -CAfile ecca.crt serverec.pem

Freeradiusの設定

OpwnWrtのFreeRADIUSパッケージはいくつか足りないものがあり設定で補います。

/etc/freeradius2/eap.conf

eap {
    default_eap_type = peap
    timer_expire = 60
    ignore_unknown_eap_types = no
    cisco_accounting_username_bug = no
    max_sessions = ${max_requests}
    tls {
        certdir = ${confdir}/certs
        cadir = ${confdir}/certs
        private_key_file = ${certdir}/serverec.pem
        certificate_file = ${certdir}/serverec.pem
        CA_file = ${cadir}/ecca.crt
        dh_file = ${certdir}/dhparam.pem
        CA_path = ${cadir}
        cipher_list = "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA256:ECDHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;"
        ecdh_curve = "secp384r1"
        cache {
            enable = no
            lifetime = 24 # hours
            max_entries = 255
        }
        verify {
            tmpdir = /tmp/radiusd
            client = "/usr/bin/openssl verify -CApath ${..CA_path} %{TLS-Client-Cert-Filename}"
        }
        ocsp {
            enable = no
            override_cert_url = yes
            url = "http://127.0.0.1/ocsp/"
       }
    }
    peap {
        default_eap_type = mschapv2
        copy_request_to_tunnel = yes
        use_tunneled_reply = yes
        virtual_server = "inner-tunnel"
    }
    mschapv2 {
        send_error = no
    }
}

/etc/freeradius2/sites/default

authorize {
    preprocess
    chap
    mschap
    suffix
    eap {
        ok = return
    }
    expiration
    logintime
}
authenticate {
     Auth-Type CHAP {
        chap
    }
    Auth-Type MS-CHAP {
        mschap
    }
    eap
}
preacct {
    preprocess
    acct_unique
    suffix
    files
}
attr_filter.accounting_response
    session {
    radutmp
}
pre-proxy {
}
post-proxy {
    eap
}

/etc/freeradius2/sites/inner-tunnel

server inner-tunnel {
    listen {
       ipaddr = 127.0.0.1
       port = 18120
       type = auth
    }
    authorize {
        chap
        mschap
        suffix
        update control {
            Proxy-To-Realm := LOCAL
        }
        eap {
            ok = return
        }
        files
        expiration
        logintime
    }
    authenticate {
        Auth-Type CHAP {
            chap
        }
        Auth-Type MS-CHAP {
            mschap
        }
        eap
    }
    session {
        radutmp
    }
    post-auth {
        Post-Auth-Type REJECT {
            attr_filter.access_reject
        }
    }
    pre-proxy {
    }
    post-proxy {
        eap
    }
}

/etc/freeradius2/radiusd.conf

listen {
    type = auth
    ipaddr = 127.0.0.1
    port = 0
    interface = lo
}

...
$INCLUDE proxy.conf
...
$INCLUDE policy.conf

/etc/freeradius2/policy.conf: policy {}の中に追加します。

 acct_unique {
    update request {
        Acct-Unique-Session-Id := "%{md5:%{User-Name},%{Acct-Session-ID},%{NAS-IP-Address},%{NAS-Identi$
    }
 }

/etc/freeradius2/modules/mschap

mschap {
    use_mppe = yes
    require_encryption = yes
    require_strong = yes
    with_ntdomain_hack = no
}

/etc/freeradius2/clients.conf

client localhost {
    secret = secret123
    ipaddr = 127.0.0.1
    shortname = localAP
    require_message_authenticator = yes
    nastype = other
}

/etc/freeradius2/users

"testuser" Cleartext-Password := "pass123"

テストを行います。

# mkdir -p /tmp/radiusd
# radiusd -X

起動が確認できたら実行スクリプトを編集します。ルータをAPとして使うためにローカルホストで使えるようにします。

/etc/init.d/radiusd

...
TMP_D=/tmp/radiusd

start() {
    [ -f $DEFAULT ] && . $DEFAULT
    mkdir -p $TMP_D
    mkdir -p $LOG_D
    mkdir -p $RUN_D
    mkdir -p $RADACCT_D
    radiusd $OPTIONS
}

OpenWrtの設定

/etc/config/wireless

config wifi-iface
    option device 'radio0'
    option mode 'ap'
    option network 'lan'
    option ssid '<YOUR_SSID>'
    option encryption 'wpa2+ccmp'
    option auth_server '127.0.0.1'
    option auth_secret 'secret123'

ネットワークを再起動してアクセスします。

この設定例でアクセスするユーザー/パスワードはtestuser/pass123です。

参考: