一般のご家庭向けEAP-SIM認証Wi-Fi

一般のご家庭向けEAP-SIM認証Wi-Fi

一般のご家庭向けEAP-SIM認証Wi-Fi
eap-sim 802.1x sim

ご家庭のWi-Fi、まだパスワード認証ですか?

こんにちは。陽炎型航洋直接教育艦 晴風の艦長、岬明乃です。 昨日開催されたカーネル/VM探検隊で、晴風の艦内無線LANの構築をした話をしてきました。

Subscriber Identity Module from Yuki Mizuno

発表枠は手軽な20分だったこともあり、聞いていて飽きてしまうであろう詳細な構成方法などを省いたため、構築についての手順を書き記しておきます。

実習期間中の艦内無線LAN事情

晴風クラスに限らず、横須賀女子海洋学校の1年次の実習では30人前後の船員を乗せて航海に出ます。 艦の仲間のネットワークアクセスを管理するため、艦内無線LANでは802.1XによるWPA2エンタープライズ認証を設けるのがルールとなっています。 802.1X認証の方法は特に学校からの指定はなく、みんな好きなRADIUSサーバを建てて認証基盤を構築しています。 これも実習の一環というわけです。

晴風では、FreeRADIUSを採用し、EAP-TLSでみんなのユーザ名とパスワードをセットして使ってもらうつもりでした。 しかしです。このご時世、パスワードなる脆弱なものを利用するのは少数派なのです。 そこで主計科の子たちと一緒に考えた末、EAP-SIMによるパスワードレス認証を導入することとなりました。

晴風艦内EAP-SIM認証Wi-Fi構築

さて、実際に構築した手順を説明していきます。

SIMカードの読み込み下準備

ここで必要になるハードウェアは、PC/SCカードリーダとICカードアダプタ、SIMカード変換アダプタです。

必要なソフトウェアは、

です。よしなにインストールしてくれればいいのですが、依存関係がごにょっとしてるのでDebianでのセットアップ例を挙げておきます。

$ sudo apt-get install pcscd pcsc-tools libccid libpcsclite-dev
$ sudo apt-get install python python-setuptools python-serial python-dev swig git curl
$ mkdir -p ~/.cache/
$ cd ~/.cache/
$ curl -O http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt
$ git clone https://github.com/LudovicRousseau/pyscard /tmp/pyscard
$ cd /tmp/pyscard
$ sudo python setup.py build_ext install
$ git clone https://github.com/mzyy94/pysim ~/pysim && cd ~/pysim

SIMへのアクセスの確認

スライドで発表した通り、SIMにはいろいろな情報が詰まっています。 ICCIDやIMSIを確認してみたい場合は、pySIMのpySim-read.pyを実行してみてください。情報がだばぁっとでてこれば成功です。 このとき、上記のGemaltoのICカードリーダを使っている場合は、-p 0オプションをつけることでリーダから読み込むことができます。

FreeRADIUSのEAP-SIM設定

発表スライドでは、simtriplets.datに認証情報を書き込む方法を記しました。 この方法は、Debianでapt-get install freeradiusで入るバージョンやFreeRADIUSの標準ビルド設定では無効化されています。 晴風では多くの艦員のSIM認証情報を書き込むため、FreeRADIUSをソースからビルドしてsimtripletsの読み込みを有効化していました。

しかし、ご家庭では30を超える認証情報を追加することはほとんどないだろうということで、一般的なFreeRADIUSのユーザ設定と同じ方法を紹介します。

EAP-SIM有効化

EAP-SIMは標準では無効化されているので、これを有効化します。 有効化といっても大層なことはせず、設定ファイル/etc/freeradius/eap.confに2行追加するだけですけどね。

diff --git a/eap.conf b/eap.conf
index 797130d..435f7e6 100644
--- a/eap.conf
+++ b/eap.conf
@@ -15,6 +15,8 @@
 #  See experimental.conf for documentation.
 #
        eap {
+               sim {
+               }
                #  Invoke the default supported EAP type when
                #  EAP-Identity response is received.
                #

有効化ついでにsecretも変えておくとわかりやすくていいですね。

diff --git a/clients.conf b/clients.conf
index d5b1f74..036e053 100644
--- a/clients.conf
+++ b/clients.conf
@@ -98,7 +98,7 @@ client localhost {
        #  The default secret below is only for testing, and should
        #  not be used in any real environment.
        #
-       secret          = testing123
+       secret          = eap-sim

        #
        #  Old-style clients do not send a Message-Authenticator

EAP-SIM認証情報の設定

発表でも述べた通り、SIMの仕様書にあるコマンドを送ってチャレンジする認証情報を生成しなければいけません。 加えて、得た情報をFreeRADIUSのusersファイルの書式にしたがって編集する必要があります。 EAP-SIMのリクエストの仕様上、IMSIからHNIを推定してMCCとMNCを特定してユーザ名を作り上げるのは正直言って面倒です。

なのでコマンド一発でusersファイルが作成できるツールをhttps://github.com/mzyy94/pysim/に同梱してあります。 ./pySim-gen-eapsim-user.pyをバシっと叩いて一瞬でusersファイルを作れます。

~/pysim$ ./pySim-gen-eapsim-user.py -p 0 | sudo tee -a /etc/freeradius/users
# IMSI: 440103152044102
# NTT DoCoMo Kansai Inc.
1440103152044102@wlan.mnc010.mcc440.3gppnetwork.org  Auth-Type := EAP, EAP-Type := SIM
        EAP-Sim-Rand1 = 0x6d58e5afebffe3f480738f104a74afb8,
        EAP-Sim-SRES1 = 0xbd952f43,
        EAP-Sim-KC1 = 0x610f35c9208e1448,
        EAP-Sim-Rand2 = 0xc22413df2efea1e70197ea58519a72f0,
        EAP-Sim-SRES2 = 0x90f003a1,
        EAP-Sim-KC2 = 0x095001424f8fb62a,
        EAP-Sim-Rand3 = 0x60a5dc16de844884dea914cd41113477,
        EAP-Sim-SRES3 = 0xff0444b3,
        EAP-Sim-KC3 = 0xcff6d25c04ab4474,

無線LAN APの設定

ここはみんな自前の無線LAN環境があると思うので、一例としてEAP-SIM認証が最低限動作するhostapdの構成を記しておきます。 詳しい設定項目などは、Hostapd - Gentoo Wiki をご参照ください。 また、WLX 202など、 お手持ちの無線LAN APで外部RADIUSサーバに対応しているものをお持ちであれば、FreeRADIUSのアドレスの指定とsecretの設定をすることで利用できるでしょう。

hostapdの設定

必要なツールのインストールapt-get install hostapd bridge-utils。 そして、/etc/network/interfacesをこんな感じに。

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet manual

auto br0
iface br0 inet dhcp
bridge_ports eth0

で、/etc/hostapd/hostapd.confをこう。

interface=wlan0
bridge=br0
driver=nl80211

ctrl_interface=/var/run/hostapd
ctrl_interface_group=0

ssid=EAP-SIM_AP

hw_mode=g
channel=8

eap_server=0 # Disable embedded eap server

# WPA2 Enterprise
wpa=2
ieee8021x=1
wpa_key_mgmt=WPA-EAP
rsn_pairwise=CCMP

# RADIUS authentication
auth_algs=1
auth_server_addr=127.0.0.1
auth_server_port=1812
auth_server_shared_secret=eap-sim

自宅EAP-SIM無線LANアクセスポイントへの接続

あとはhostapdを立ち上げて接続するだけ!とお思いでしょうが、残念ならがクライアント側にAPの登録が必要となることがあります。 iOSでは、WPA2 EnterpriseのアクセスポイントをデフォルトでEAP-TLSとして認識し、加えてiPhone/iPad側でEAP-SIMとして接続させる方法がありません。 立ち上げたAPがEAP-SIM認証であることを教え込むために、構成プロファイルを作成する必要があります。

apple configurator2

macOSが動く環境をお持ちの方は、Apple Configurator 2で上図のように作成するか、 もしくはEAP-SIM_AP向けに作った以下の構成プロファイル(XMLファイル)のAP名を変更したものをiOSデバイスにインストールして準備完了です。

EAP-SIM_AP.mobileconfig

最後にお待ちかね、hostapd /etc/hostapd/hostapd.confで起動させて接続してみましょう!

$ sudo hostapd /etc/hostapd/hostapd.conf
Configuration file: /etc/hostapd/hostapd.conf
Using interface wlan0 with hwaddr dc:fb:02:9b:11:ef and ssid "EAP-SIM_AP"
wlan0: RADIUS Authentication server 127.0.0.1:1812
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED
wlan0: STA f4:0f:24:ea:95:13 IEEE 802.11: authenticated
wlan0: STA f4:0f:24:ea:95:13 IEEE 802.11: associated (aid 1)
wlan0: CTRL-EVENT-EAP-STARTED f4:0f:24:ea:95:13
wlan0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=1
wlan0: STA f4:0f:24:ea:95:13 WPA: pairwise key handshake completed (RSN)
wlan0: AP-STA-CONNECTED f4:0f:24:ea:95:13
wlan0: STA f4:0f:24:ea:95:13 RADIUS: starting accounting session 57F9E33F-00000000
wlan0: STA f4:0f:24:ea:95:13 IEEE 802.1X: authenticated - EAP type: 18 (SIM)

まとめ

海の仲間は家族だから!

このエントリーをはてなブックマークに追加
mzyy94
mzyy94
Sun
Mon
Tue
Wed
Thu
Fri
Sat