無線LAN(Wi-Fi)接続認証をパスワードからLDAP認証に切替えた話(FreeRADIUS+OpenLDAP連携)

概要

f:id:tsunokawa:20151015184527p:plain

無線LANにLDAP接続出来ないかと試した備忘録です。
結果FreeRADIUS+OpenLDAPの組み合わせで実現出来ました。

無線LANパスワードの問題点と課題

無線LANのパスワード運用は以下の問題や課題があるなーと思っています。

  • パスワードは変更しないまま放置
  • パスワード定期変更後パスワードが分からなくてネットワークに繋がらなくてイライラ
  • アクセスポイント機器が増えるとパスワード変更を行う度に台数分行わなければいけない

などなど

解決策

そこで上記図のように

  • FreeRadius
  • OpenLDAP
  • YAMAHA WLX302(無線LAN AP)

これらを組み合わせて無線LANアクセスを共有パスワードではなく
個別のLDAPユーザとパスワードで無線LANに接続出来るように認証基盤を整えました。

環境

RADIUSサーバー
OS CentOS 7.0.1406
RADIUSバージョン freeradius-3.0.1-6.el7.x86_64, freeradius-ldap-3.0.1-6.el7.x86_64
IPアドレス 10.0.0.1


LDAPサーバー
OS CentOS 6.2
LDAPバージョン openldap-servers-2.4.23-20.el6.x86_64
IPアドレス 10.0.0.3


無線LAN AP
製品名 YAMAHA WLX302
認証方式 WPA-EAP/WPA2-EAP
SSID radius
IPアドレス 192.168.0.1


前提

本エントリは以下が前提となっています。

  • LDAPサーバーが構築済であること
  • RADIUS認証が可能なWifiAPを購入済みであること(今回の例ではYAMAHA WLX302)


RADIUSインストール

yum install freeradius.x86_64
yum install freeradius-ldap.x86_64
yum install freeradius-utils.x86_64

freeradius-utils.x86_64はこれを入れておかないとradtestコマンド等が使えない為インストールしておきます。

FreeRADIUS設定

事前準備(SSL証明書作成)

暗号化通信を行うにあたってSSL証明書が必要になるため作成しておきます。
SSL証明書作成手順は以下エントリを参考にしてください。
SSL自己署名証明書作成メモ - tsunokawaのはてなダイアリー
SSL証明書作成はRADIUSサーバー上で行ってください。
作成した秘密鍵と証明書は/etc/raddb/certs/に保存します。


証明書ファイル(/etc/pki/tls/cert.pem)を/etc/raddb/certs/にコピーします。

cp -p /etc/pki/tls/cert.pem /etc/raddb/certs/


次に設定ファイルを変更していきます。
変更箇所のみ記載していきます。

/etc/raddb/clients.conf
client 192.168.0.1 {
       secret          = radiuspassword
       shortname       = radius
       }

上図にも記載してありますが192.168.0.1は無線LAN APのIPです。
secretは無線LAN APがRADIUSサーバーに接続する際のパスワードです。

/etc/raddb/dictionary

以下を追記します。

VALUE           Auth-Type               LDAP    5


/etc/raddb/users

以下を追記します。
適宜環境に合わせて読み変えてください。

DEFAULT         Auth-Type = LDAP
                Fall-Through = 1

上記部分以外は全てコメントアウトします。


FreeRADIUSのLDAPライブラリを有効にするためシンボリックリンクを張ります。

cd /etc/raddb/mods-enabled/
ln -s ../mods-available/ldap ldap


/etc/raddb/mods-enabled/ldap
ldap {
        server = "ldap.example.org"

ldap {
        server = "ldap.example.com"


#       identity = "cn=admin,dc=example,dc=org"
#       password = mypass

identity = "cn=Manager,dc=example,dc=com"
password = testing123


#       base_dn = "dc=example,dc=org"

base_dn = "ou=Users,dc=example,dc=com"


update {
  control:Password-With-Header    += 'userPassword'
# control:NT-Password             := 'ntPassword'

update {
  control:Password-With-Header    += 'userPassword'
  control:NT-Password             := 'sambaNTPassword'


/etc/raddb/mods-enabled/eap
eap {
       default_eap_type = md5

eap {
       default_eap_type = peap



作成したSSL証明書の秘密鍵を指定します。

private_key_password = whatever
private_key_file = ${certdir}/server.pem

private_key_file = ${certdir}/radiustest.key



作成したSSL証明書を指定します。

certificate_file = ${certdir}/server.pem

certificate_file = ${certdir}/radiustest.crt



認証局証明書を指定します。

ca_file = ${cadir}/ca.pem

ca_file = ${cadir}/cert.pem

このcert.pem/etc/pki/tls/cert.pemをそのままコピーしました。
認証を行ったサーバーの/etc/pki/tls/cert.pemを設置すればOKです。

# tmpdir = /var/run/radiusd/tmp

tmpdir = /var/run/radiusd/tmp


# client = "/usr/bin/openssl verify -CApath ${..ca_path} %{TLS-Client-Cert-Filename}"

client = "/usr/bin/openssl verify -CApath ${..ca_path} %{TLS-Client-Cert-Filename}"


/etc/raddb/sites-enabled/default
authorize {
        -ldap

authorize {
        ldap


authenticate {
#       Auth-Type LDAP {
#               ldap
#       }

        Auth-Type LDAP {
                ldap
        }


post-auth {
#       ldap

post-auth {
       ldap


/etc/raddb/sites-enabled/inner-tunnel
listen {
       ipaddr = 127.0.0.1

       ipaddr = *


authorize {
        -ldap

        ldap


authenticate {
#       Auth-Type LDAP {
#               ldap
#       }
|

        Auth-Type LDAP {
                ldap
        }


post-auth {
#       ldap

       ldap


pidディレクトリ作成

FreeRADIUSのインストール時点でpidファイルが保存されるディレクトリが作成されないので作成しておきます。

mkdir /var/run/radiusd/tmp
chown radiusd:radiusd /var/run/radiusd/tmp/

ディレクトリを作成しておかないとデーモン起動時にエラーが出てしまいます。

Tue Jan 27 10:40:51 2015 : Error: Failed changing permissions on /var/run/radiusd/tmp: No such file or directory

以上でFreeRADIUSの設定は完了です。

RADIUSデーモン再起動

設定ファイルの変更が完了したのでRADIUSデーモンを再起動しておきます。

systemctl restart radiusd


無線LAN AP(YAMAHA WLX302)設定

次にWIfi APのYAMAHA WLX302にRADIUS設定を行います。

SSIDの設定でバックエンドのRADIUSに接続するように設定します。
f:id:tsunokawa:20151015185202p:plain
f:id:tsunokawa:20151015185212p:plain

認証方式 WPA-EAP/WPA2-EAP
プライマリRADIUSサーバー 外部のRADIUSサーバーを使用するにチェック, IPアドレスはRADIUSプライマリサーバーのものを入力
プライマリ認証ポート 1812
プライマリRADIUSアカウンティング 使用しない
プライマリアカウントポート 1813
プライマリRADIUSシークレット /etc/raddb/clients.confで設定したパスワード
セカンダリRADIUSサーバー 外部のRADIUSサーバーを使用するにチェック, IPアドレスはRADIUSセカンダリサーバーのものを入力
セカンダリ認証ポート 1812
セカンダリRADIUSアカウンティング 使用しない
セカンダリアカウントポート 1813
セカンダリRADIUSシークレット /etc/raddb/clients.confで設定したパスワード

上記は設定例です。
環境に合わせて読み変えてください。

SSIDごとにLDAP(RADIUS)認証するかどうか設定出来るのでゲスト用はこれまで通りパスワード認証ということも可能です。

各クライアントからアクセス

上記で一通り設定が完了しましたのでこれからいよいよ無線LANクライアントからLDAPパスワードで接続を行います。

MacOS(設定例)

MacOSで接続する手順例です。

f:id:tsunokawa:20151022181333p:plain


f:id:tsunokawa:20151022181622p:plain


f:id:tsunokawa:20151022181633p:plain

ネットワーク名 radius(RADIUS設定したSSID)
セキュリティ WPA/WPA2エンタープライズ
モード 自動
ユーザ名 LDAPアカウント
パスワード LDAPパスワード



f:id:tsunokawa:20151023144440p:plain
初回接続時、証明書に関するメッセージが出ますが続けるを押してください。
これはオレオレ証明書を使っているためです。

以上でLDAPユーザで無線接続が出来るようになったと思います。