freeRadiusでWPA2エンタープライズ認証
前回、hostapdとUSBWi-Fiアダプタを付けて古いPCをWi-Fiアクセスポイント化しました。その際インストールしたWi-Fiサーバーアプリhostapdは、WPA2エンタープライズ認証にも対応していますので、今回はそれに挑戦します。ユーザー名とパスワードで認証するPEAPと、証明書を使うTLSの両方を試しています。合わせてPCやAndoroid系スマホに証明書をインストールする方法や、証明書の失効についても触れています。
hostapdの設定をEAP-PEAPに
現在hostapdでWPA-PSK(パーソナル)の運用をしていると仮定しています。hostapdのPSK設定では、ユーザーとパスワードはhostapd(Wi-Fi AP)が管理しています。これをEAP-PEAPに変更すると、それらのの管理を別のサーバー(freeRadius)に任せることになります。これにより多くの拠点(Wi-Fi AP)があった場合でもユーザーとパスワードの管理を一元化できます。freeRadiusについては次の項目で紹介するとして、ここでは先にhostapdの設定をします。
まず、証明書認証よりは簡単なユーザー名とパスワードによる認証(PEAP)に設定します。
前回作成したhostapdの設定ファイル(/etc/hostapd/hostapd.conf)の次の部分をコメントアウトします。
#auth_algs=1 #wpa_psk_file=/etc/hostapd/psk #wpa_key_mgmt=WPA-PSK
wpa_key_mgmt=WPA-EAP ieee8021x=1 nas_identifier=test own_ip_addr=192.168.1.20 radius_client_addr=192.168.1.20 auth_server_addr=172.16.1.100 auth_server_port=1812 auth_server_shared_secret=secret
追加した部分の説目は次の通りです。
- pa_key_mgmt=WPA-EPA
WPAの認証方式をWPA-PSKからWPA-EPAに変更します。
- ieee8021x=1
IEEE802.1X認証を有効化します。
- nas_identifier=test
Radiusサーバーに接続しに行く際のIDです(Radiusクライアント名)。ここでは特に利用しませんので自由に名付けて下さい。
- own_ip_addr=192.168.1.20
Wi-Fi AP(hostapdサーバー)のIPアドレスです。
- radius_client_addr=192.168.1.20
RadiusクライアントのIPアドレスを設定します。ここでは自ら確認しに行きますのでown_ip_addrと同値です。
- auth_server_addr=172.16.1.100
Radiusサーバーのアドレスです。
- auth_server_port=1812
Radiusサーバー接続時のポート番号です。
- auth_server_shared_secret=secret
Radiusサーバー接続時のパスワードです。
Radiusのインストール
ユーザー認証のためのRadiusサーバーはhostapdサーバー(Wi-Fi AP)にインストールすることもできます。しかし、概念として別のものになりますので、わかりやすいようにここでは別のPCにfreeRadiusをインストールします。もし同じサーバーにインストールを考えている場合は、ここでは紹介しませんがhostapdの機能としてRadiusが提供されていますのでそちらの利用もご検討ください。
別のDebianPCを用意して、hostapdサーバー(Wi-Fi AP)と同じネットワークに所属させてください。この時IPアドレスは固定にします。DHCPが配布するアドレスとは重ならないように注意してください。そのPCにfreeRadiusをインストールします。
#apt install feeradius freeraius-utils
インストールが終わったらまず挙動を確認してみましょう。/etc/freeradius/3.0/mods-config/files/authorize のテスト用エントリーを有効化します。
# nano /etc/freeradius/3.0/mods-config/files/authorize
にある次の部分の#を除去してください。
bob Cleartext-Password := "hello" Reply-Message := "Hello, %{User-Name}"
Radiusサーバー再起動させ、radtestコマンドでテストをしてみます。radtestはfreeraius-utilsをインストールすると使えるようになります。
書式は radtest user password radius-server nas-port-number secretとなっています。
# systemctl restart freeradius # radtest bob hello 127.0.0.1 0 testing123
テストの結果は「Sent Access-Request」として送信したデータが示され、「Recived Access-Accept」で戻り値が表示されます。この場合Reply-MessageとしてHello,bobが戻ってきていれば成功です。
書式の中にpasswordとsecretがあります。passwordはユーザー毎のパスワード、secretはRadiusクライアントがサーバーに問い合わせに行く際のパスワードとなります。
もう少し詳しく書くとRadiusの構造は、ユーザーのIDとパスワードをチェックする「認証サーバー」と、そのサーバーに問い合わせに行くRadiusクライアント(オーセンティケータ)と、実際に認証を受けたい機器(サプリカント)の3種で構成されます。
サプリカントはスマホだったり、ノートPCだったりしますが、それらはWi-Fi APだったりスイッチだったりするオーセンティケーターにユーザーIDとパスワードを渡して認証を依頼します。オーセンティケーターは受けっとたIPとパスワードで認証サーバーに確認しにいき、認証が通ればサプリカントへアクセス許可を出します。
secretの方はそのオーセンティケータが認証サーバーにアクセスする際に利用するパスワードです。
その設定は/etc/freeradius/3.0/clients.confにあります。そこにsecretとしてtesting123が設定されています。
またクライアントの設定はIPアドレスまたは、ネットワーク毎に持つことができます。ここではファイルの最後に、172.16.1.0/24ネットワークに対して、clienttestという名前でRadiusクライアントのパスワードを設定をしています。
client clienttest { ipaddr = 172.16.1.0/24 secret = secret }
これでPEAPの設定は完了です。Wi-Fiの設定でEAP-PEAPを選択し、ユーザー名とパスワードを設定すれば接続可能です。Radiusクライアント(オーセンティケータ)とのパスワードの混同だけ注意すればさほと難しくはないと思います。
EAP-TLS
今度は、証明書を用いた相互認証であるEAP-TLSの設定をします。まず、openSSLでCA(証明書発行母体)、Radiusサーバーの秘密鍵と証明書、サプリカント(利用端末)用の証明書と秘密鍵を作成します。それらの方法はリンク先をご確認ください。
証明書をRadiusサーバーに配布
Radiusサーバー側に作成したCAの証明書、サーバー用の証明書と秘密鍵をコピーします。CA.plで作成したCA証明書はdemoCA(実行時に作成されたディレクトリ)の中の、cacert.pemです。他の証明書・秘密鍵はopenssl caコマンドで指定した場所に出力されています。
それらを/etc/freeradius/3.0/certsへ移動させます。所有権をfreerad(Radiusサーバーの起動ユーザー&グループ)にします。
ここではCA証明書をca.crt、Radiusサーバー用の証明書をradius.crt、秘密鍵をradius.keyとしています。
#mv ca.crt radius.key radius.crt /etc/freeradius/3.0/certs #chown freerad:freerad ca.crt radius.key radius.crt
freeradiusの設定を変更します。/etc/freeradius/3.0/mods-available/eapという設定ファイルを編集しますが、編集前にバックアップを取っておきましょう。
eap{}でかこまれた中のdefault_eap_typeをmd5からtlsに変更します。
tls-config tls-commonの{}でかこまれた中の次の項目を設定します。
- private_key_password="radius用の秘密鍵のパスワード"
- private_key_file=/etc/freeradius/3.0/certs/radius.key
- certificate_file=/etc/freeradius/3.0/certs/radius.crt
- ca_file=/etc/freeradius/3.0/certs/ca.crt
/etc/freeradius/3.0/mods-enabled/eapに/etc/freeradius/3.0/mods-available/eapのシンボリックリンクが存在しない場合は作成します。
freeradiusを再起動します。
TLSの設定をしてもPEAP(ユーザー名とパスワードの認証)は生きたままです。これを停止するには、/etc/freeradius/3.0/mods-available/eap内のPEAP{}のエントリーを全部コメントアウトするか、削除します。すべての設定を終えたら実施しておきましょう。
証明書をサプリカント(利用端末)に配布
今度はサプリカント(利用端末)側に必要なファイルを配布します。CAの証明書、個別の証明書と秘密鍵が必要なのはRadiusサーバーと同様ですが、WindowsやAndoroidにインストールする場合にはそれら3つをまとめたpkcs12形式のファイルを使います。
この作業もopensslを使います。CAの証明書をca.crt、サプリカントの証明書をpc.crt サプリカントの秘密鍵をpc.keyとした場合次のコマンドで.pkcs12ファイルを作成できます。
#openssl pkcs12 -in pc.crt -inkey pc.key -certfile ca.crt -out 出力ファイル名.p12 -export -name P12ForBob
-nameオプションで内部で用いられる名前を設定しています。なくても出力できますが、長いランダムな文字列になってしまいますので、わかりやすいように名前を指定します。
pkcs12ファイルができてら各端末にコピーしてインストールします。
まず、WindowsPCでの証明書のインストールの方法です。10を前提にしていますが、7、8でもほぼ同じ内容だと思います。
- .p12ファイルコピーしてダブルクリック
- ローカルコンピューターを選択して次へ
- ファイルの場所を確認して次へ
- .p12キー作成時に設定したパスワードを入力して次へ
- 「証明書の種類に基づいて、自動的に証明書ストアを選択する」を選択して次へ
- 完了
証明書がインストールできたら今度はWi-Fiの接続設定を入力します。
- コントロールパネル
- ネットワークと共有センター
- 新しい接続またはネットワークのセットアップ
- 「ワイヤレスネットワークに手動で接続します」
- ネットワーク名にSSIDを入力
- セキュリティの種類にWPA2-エンタープライズ
- 接続の設定を変更しますをクリック
- セキュリティタブに移動
- ネットワークの認証方法の選択で、「スマートカードまたはその他の証明書」を選択
- ログオンするたびに、この接続用の資格情報を使用するのチェックは外す
- 右側にある「設定」をクリック
- 「単純な証明書の選択を使う」のチェックを外す
- 「証明書を検証してサーバーのIDを検証する」のチェックを外す
以上で、WindowsPCの設定は終了です。
続いてAndroidスマホです。端末によって操作方法が変わってくるかもしれませんが筆者の端末での紹介をします。
.p12ファイルをインストールします。
- 設定
- ロック・セキュリティ
- 情報セキュリティ
- 証明書のインストールで証明書をクリックします
- .p12ファイルに設定したパスワードを入力します
- 端末情報の使用を「Wi-Fi」にします
Wi-Fi接続の設定します。
- 設定
- Wi-Fi・Bluetooth
- 対象のSSIDを選択します
- EAP方式を「TLS」に
- CA証明書をインストールした証明書に
- ユーザー証明書をインストールした証明書に
- IDにradiusに設定してあるユーザーを入力してください
ここではIDの欄が存在します。ここでは先にテストで使ったbobを入力してありますが、Radiusに登録してあるユーザー名を入力してください。ユーザーに設定されているパスワードは無視されますので問題ないです。
筆者の環境だけかもしれませんが、AndroidでWi-Fiの接続設定を削除すると.p12ファイルのインストールからやり直しになりました。
証明書の取り消しとRadiusへの反映
証明書の取り消しをするには、まずRadiusに対して取り消しされた証明書を通知するディレクトリを作ります。ここでは/etc/freeradius/3.0/certにcrlディレクトリを作りました。所有権を変えた後、CAの証明書のコピーををcrlディレクトリの中に入れます。
# cd /etc/freeradius/3.0/certs # mkdir crl # chown freerad:freerad crl # cp ca.crt crl/ca.crt
次に証明書の取り消しをします。証明書はCA(OpenSSL)で管理していますのでそちらから操作します。
CAで発行した証明書を取り消したい場合はまず対象の証明書を探す必要があります。なにもしなければCAディレクトリのnewcertsディレクトリに発行したすべての証明書入っています。長い名前なのでここでは仮にxxx.pemとします。
各証明書の内容確認は次のようにします。
#openssl x509 -noout -text -in xxx.pem
CAのディレクトリのindex.textファイルからもCommon Nameを頼りにファイル名の検索ができます。
取り消したい証明書ファイルが見つかったら、CAディレクトリの一つ下の階層でrevokeコマンドを実行します。
#openssl ca -revoke demoCA/newcerts/xxx.pem
取り消しをすると、index.txtの中の該当の行の証明書情報の1文字目がVからRに変わります。
続いて、freeRadiusに取り消した情報を渡します。先ほど作成したcrlディレクトリにCRLファイルをを出力します。その後CRLディレクトリ内の証明書をc_rehashコマンドでハッシュ化します。c_rehashで、freeRadiusが読み込めるファイル名に変換しています。
# openssl ca -gencrl -out /etc/freeradius/3.0/certs/crl/crl.pem # c_rehash /etc/freeradius/3.0/certs/crl/
freeRadiusの設定をCRLのチェックをするように変更します。/etc/freeradius/3.0/eapのtls-config tls-commonの項目中盤に「check_crl=yes」がコメントアウトされていますのでそれを解除します。「ca_path」という行がありますのでcrlをセットするディレクトリへのパスを入力します。
tls-config tls-common { ... check_crl=yes ... ca_path=/etc/freeradius/3.0/certs/crl ... }
設定を入力したらfreeRadiusを再起動させます。CRLの反映には必ずfreeRadiusの再起動が必要になります。
CRLチェックの運用を始めた場合は、CRLファイルが存在しないとエラーになります。またOpenSSLの設定で、CRLの有効期限を設定できるのですが、これが切れるとすべての認証ができなくなります。有効期限が切れたCRLも有効にするには、先ほどeapのca_path設定をした数行下にallow_expired_crlの項目がありますので、これをyesにします。
CRLファイルを出力し、c_rehashを実行し、再起動したのに接続できてしまうという場合は、無線アクセスポイント(hostapd)側の問題かもしれません。一度認証が通ると一定期間はRadiusサーバーにチェックしに行きません。無線アクセスポイントを再起動してみてください。
他、認証がどうなっているか確認したい場合は、/etc/freeradius/3.0/radiusd.confにある、authの項目をyesにして下さい。/var/log/freeradius/radius.logに認証ログが出力されるようになります。
トップ画像のネットワークアイコンはcman:無料素材サービスを利用させていただきました。ありがとうございました。