freeradius2でEAP-PEAPな認証無線LANを構築した。
自宅で使っているWHR-HP-GNはDD-WRT化してあり、WPA2エンタープライズが使えるようになっている。あとはRADIUSサーバと然るべき設定が使える。で、チャレンジしてみた。
1.認証方式の選定 EAPにはいくつか種類があって、セキュリティが強力なものではEAP-TLS、EAP-PEAP、EAP-TTLSだ。
EAP-TLS:サーバ・クライアント相互で電子証明書で認証する。セキュリティ強度は最強クラス。
EAP-TTLS:クライアント証明書は不要ながらEAP-TLSと同等のセキュリティ強度。ただWindows標準サプリカントでは非対応で別途サプリカントが必要。
EAP-PEAP:セキュリティ強度はEAP-TLS/TTLSに譲るが、Windows標準サプリカントで対応、サーバ認証は電子証明書、クライアント認証はIDとパスワード。
となっている。別途サプリカントが必要な時点でEAP-TTLSは却下(汎用性重視)。EAP-TLSはクライアントに電子証明書を突っ込まされるのが性に合わない。汎用性が高く、サーバ側の電子証明書だけあればOKなEAP-PEAPで行くことにした。ちなみにうちの会社の社内無線LANもEAP-PEAPだ。
2.電子証明書の取得 RADIUSサーバを外向きのgungnir.mythril.ne.jpで運用するのはリスクがあるので、内向きのmjolnir.mythril.ne.jpで運用する。この関係で、電子証明書は
www.mythril.ne.jp のものの流用ができない。今更自己署名証明書(いわゆる『オレオレ証明書』)で構築するのは論外だ。超円高なのでもう一枚買うか……と思ったのだが、調べてみると
StartSSLで無料取得できることが判明。これで行くことにした。取得手順については本論から外れるので省略。FQDNをsecgw.mythril.ne.jpにして取得。中間証明書が必要なことをお忘れなく。
3.freeradius2のインストールと設定 インストールは「yum install freeradius2 freeradius2-utils」で完了。設定は以下。
1)radius.conf
実はデフォルトのままでOKだったりする。
2)client.conf
radiusクライアントとなる無線LANルータのIPアドレス、共有シークレット、shortnameを追記する。共有シークレットとshortnameは任意の文字列でOK。
> client
{
> require_message_authenticator = yes
> secret = xxxxxxxxxxxxxxxxx
> shortname = xxxxxxxxxxxxxxxxx
> }
3)users
radius的にはUNIXユーザ(/etc/passewd)やMySQL+OpenLDAPでの認証でも行けるそうだが、今回はライトにradius用のユーザファイルで管理することにした。以下を追記。
> <ユーザ名> Cleartext-Password := "<パスワード>"
> Service-Type = Framed-User,
> Framed-Protocol = PPP
4)eap.conf
今回の山場。
・default_eap_typeはpeapにする。
・PrivateKeyとCertificateはフツーに指定すればOK。/etc/pki/tls以下へのシンボリックリンクでも可。
・StartSSLは中間証明書必須だが、freeradius的にはCAは単一ファイルしか指定できないので、
cat CA.pem 中間証明書.pem > 結合した証明書.pem
で、単一ファイル化する。StartSSLのルート証明書、中間証明書はここ。pem形式で。
・randomファイルは/dev/urandamを指定する。
システム的にはランダムデバイスは/dev/randomと/dev/urandomの2つあり、eap.conf的にはここから作りこんだrandomファイルを設定で想定しているが、/dev/randomと/dev/urandomから作りこんだファイルではradiusdが起動せず、/dev/urandomを直接指定することで解決した。
あとはfreeradiusを/usr/sbin/radiusd -Xでデバッグモード起動させ、クライアントからの接続を試みる。
4.Windows7で設定、接続
Windows7側の設定はこんな感じ。
セキュリティの種類は「WPA2エンタープライズ」、暗号化の種類は「AES」、認証の種類は「Microsoft:保護されたEAP(PEAP)」をそれぞれ選択。終わったら「詳細設定」を押す。
認証モードは「ユーザー認証」で指定。今回はWindowsユーザー/パスワードで認証する仕組みにしてあるので、シングルサインオンを有効にしておく。必須ではないが無線LANへの接続がWindowsログオンとシームレスになる。
RADIUSサーバの認証をするので設定はこんな感じ。CAはStartSSLのルートであるStartComにチェックを入れる。認証方式はEAP-MSCHAPv2を選択。終わったら「構成」を押す。
デフォルトだとここにチェックが入っているので外す。これをチェックを入れたままにしておくと、PC名\ユーザー名でRADIUS認証が実行されてしまい、うちの環境では上手く認証できない。ここはfreeradius側のレルム設定に依存するようだが、前段のシングルサインオンを行うこともあり、ここは不要。
ここまでやって、ようやく成功。
ささっと書いているが、大体二ヶ月くらいちびちびやっての結果である。
認証無線LANということで、セキュリティレベルが上がったことになる。
DD-WRTと仮想サーバというインフラで、自宅で安価に高セキュリティな無線LANが組めるのは素晴らしい。
freeradius、他にも活用の用途はあるので、
・ServersMan@VPSをバックアップRADIUSサーバ化
・OpenVPNのRADIUS認証導入
・MySQL+OpenLDAP認証化
あたりを追々やってみるつもり。