FreeRADIUS
OSSのRadiusServerとしては、多分一番シェアが高い物。
1. 前書き
ソースから入れるなら、3.0.xを入れるべきなのだろうが、CentOS6.5+FreeRADIUS3.0.3で構築を試みた結果、
libtallocとの連結やOpenSSLの組み込みとかで転けて大変だったので2.2.xで構築。
という事で、今回は以下の構成を前提にメモ。
OS : CentOS 6.5 x86_64 FreeRADIUS : 2.2.5 認証方式 : EAP-TTLS & PEAP
2. FreeRADIUSのコンパイル
OpenSSLもmakeでインストールしている事を前提。
yumなりapt-getなりでOpenSSLを入れた場合は、./configureのオプションを削ればOK
# mkdir /usr/local/src/radius # cd /usr/local/src/radius # wget "ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-2.2.5.tar.gz" # tar zxvf freeradius-server-2.2.5.tar.gz # cd freeradius-server-2.2.5 # ./configure --prefix=/usr/local/radius-2.2.5 \ --with-openssl-lib-dir=/usr/local/openssl/lib \ --with-openssl-include-dir=/usr/local/openssl/include # make && make install
後は事後処理として、FreeRADIUSへPATHを通したり、ldconfigを打ったりする。
3. インストール後処理
ログディレクトリを作成したり、FreeRADIUS用にユーザ・グループの作成。
"/etc/radius/raddb/*"内のファイルには生パスワードを書き込む為、パーミッションとグループは特に注意する。
# mkdir /var/run/radiusd # mkdir -p /var/log/radius/radacct # groupadd radiusd # useradd -g radiusd -d /var/log/radius -s /sbin/nologin radiusd # cd /usr/local # ln -s /usr/local/radius-2.2.5 ./radius # ln -s /uar/local/radius /etc/radius # chown -R radiusd.radiusd /var/log/radius # chmod -R 755 /var/log/radius # chgrp -R radius /etc/radius/raddb/* # chmod -R o-rwx /etc/radius/raddb/*
4. コンフィグ
大規模システムならradiusのデータをMySQLへ流すのだろうが、
今回は小規模な仕組みかつ平常時のメンテナンス性を重視する為、プレーンテキストで情報を保存する。
下記メモでは変更した部分のみ記載。他はメモ注釈を参照。
# vi radiusd.conf
prefix = /usr/local/radius #インストールディレクトリ localstatedir = /var #PIDやログ保存ディレクトリの親 user = radiusd #FreeRADIUSの実行ユーザ group = radiusd #FreeRADIUSの実行グループ ###Radius認証用の待ち受け設定 listen { type = auth #認証設定 ipaddr = * #認証の許可IPアドレス port = 1812 #認証待ち受けポート } ###アカウンティングの待ち受け設定 listen { type = acct #アカウンティング設定 ipaddr = * #アカウンティング許可IPアドレス port = 1813 #アカウンティング待ち受けポート } ###ログ設定 log { auth = yes #認証時のログを保存する auth_badpass = no #認証失敗時のパスワードを記録しない auth_goodpass = no #認証成功時のパスワードを記録しない } ###RadiusServerセキュリティ security { allow_vulnerable_openssl = yes #OpenSSLのHeartBeatチェックを行わない #上記オプションを入れないと、yumで入れた修正済みOpenSSL"1.0.1e+hoge"に対しても反応してしまう。 }
# vi clients.conf
###localhostのクライアント設定を全部コメントアウト #client localhost { # ipaddr = 127.0.0.1 # netmask = 32 # secret = PASSWORD # require_message_authenticator = no # nastype = other #} ###RadiusServerへの接続を許可するクライアント情報 client 192.168.1.0/24 { #認証を許可するネットワーク secret = RadiusServerPassword #クライアント用RadiusServer認証パスワード shortname = RadiusServerName #クライアント用RadiusServer識別名 }
# vi eap.conf
###EAP認証の設定 eap { default_eap_type = ttls #デフォルトでEAP-TTLSを使用する ###EAP-MD5を無効化する #md5 { #} ###EAP-LEAPを無効化する #leap { #} ###EAP-TLS認証の設定 tls { private_key_password = "KeyPASSWORD" #private.keyのパスワード # cipher_list = "DEFAULT" #TLS認証局のサイトリストを参照しない } ###EAP-TTLS認証の設定 ttls { default_eap_type = mschapv2 #EAPトンネリング方式にMS-CHAPv2を使用する # copy_request_to_tunnel = no #EAPトンネル内への属性コピーを無効化 # use_tunneled_reply = no #EAPトンネル内ユーザ名による属性値返答を無効化 # virtual_server = no #トンネル内の認証要求はVirtualServerを経由させる }
# vi users
###Radius認証用のユーザ名とパスワード #"ユーザ名" Cleartext-Password := "ログインパスワード" # Reply-Message = "Hello, %{User-Name}" ###『ユーザ名=hoge / パスワード=bar』だとこんな感じ "hoge" Cleartext-Password := "bar" Reply-Message = "Hello, %{User-Name}"
# vi proxy.conf
###下記RadiusProxyの設定以外は全てコメントアウトする ###RadiusProxyの設定 proxy server { default_fallback = yes #Radiusフォールバック機能を使う }
# vi certs/ca.cnf
###RadiusServerの証明書を作成するMakefileを変更 DH_KEY_SIZE = 2048 #Diffie-Hellmanの鍵長を"2048"bitに変更
# vi certs/bootstrap
###DHパラメータの鍵長を"2048"bitに変更 if [ ! -f dh ]; then openssl dhparam -out dh 2048 || exit 1 if [ -e /dev/urandom ] ; then dd if=/dev/urandom of=./random count=10 >/dev/null 2>&1; else date > ./random; fi fi
# vi certs/ca.cnf
###認証鍵のパスワードを変更 [ req ] input_password = "" #"eap.conf"内の[private_key_password]と同じ値にする output_password = "" #"eap.conf"内の[private_key_password]と同じ値にする ###作成するCA証明書のパラメータを設定(ここでは説明省略) [certificate_authority] countryName = "" stateOrProvinceName = "" localityName = "" orgnaizationName = "" emailAddress = "" commonName = ""
# vi certs/client.cnf
###認証鍵パスワードを変更 [ req ] input_password = "" #"eap.conf"内の[private_key_password]と同じ値にする output_password = "" #"eap.conf"内の[private_key_password]と同じ値にする ###作成するCA証明書のパラメータを設定(ここでは説明省略) [client] countryName = "" stateOrProvinceName = "" localityName = "" organizationName = "" emailAddress = "" commonName = ""
# vi certs/server.cnf
###認証鍵パスワードを変更 [ req ] input_password = "" #"eap.conf"内の[private_key_password]と同じ値にする output_password = "" #"eap.conf"内の[private_key_password]と同じ値にする ###作成するCA証明書のパラメータを設定(ここでは説明省略) countryName = "" stateOrProvinceName = "" localityName = "" organizationName = "" emailAddress = "" commonName = ""
# vi sites-enabled/default
###コンフィグが下記の状態になる様にコメントアウト&アンコメントする ###(-> 下記以外は全てコメントアウトする) ###EAPトンネル内で許可する認証方式 authorize { preprocess mschap suffix eap { ok = return } files expiration logintime } ###接続を許可する認証タイプ authenticate { Auth-Type MS-CHAP { mschap } eap } ###アカウンティングの接続ログ書式 accounting { detail exec } ###認証が通った時の設定 post-auth { Post-Auth-Type REJECT { attr_filter.access_reject } }
5. 起動準備
最初にinitスクリプトの編集
# cp /usr/local/src/radius/freeradius-server-2.2.5/redhat/freeradius-radiusd-init /etc/init.d/radiusd # chown root.root /etc/init.d/radiusd # chmod 755 /etc/init.d/radiusd # chkconfig --add radiusd # chkconfig radiusd on # vi /etc/init.d/radiusd exec=${exec:=/usr/local/radius/sbin/$prog} config_dir=${config_dir:=/etc/radius/raddb} config=${config:=$config_dir/radiusd.conf} pidfile=${pidfile:=/var/run/$prog/$prog.pid} lockfile=${lockfile:=/var/lock/subsys/radiusd}
次にlogrotateスクリプトの編集
# cp /usr/local/src/radius/freeradius-server-2.2.5/redhat/freeradius-logrotate /etc/logrotate.d/radiusd # chown root.root /etc/logrotate.d/radiusd # chmod 644 /etc/logrotate.d/radiusd
1. 初回起動(テスト起動)
初回起動時はRadiusServerで使用する証明書やDHパラメータの作成処理が実行される。
その為、1回目の起動は失敗するのでテストモードで起動をしてから、initスクリプトで通常起動する。
また、初回起動前にいらないファイルの全消しもしておく
# cd /etc/radius/raddb/certs # rm -f *.pem *.der *.csr *.crt *.key *.p12 serial* index.txt* ###1回目の起動(必ず失敗する) # radiusd -X ###2回目の起動(テストモードで実行) # radiusd -X # [Ctrl]+[C] ###initスクリプトでRadiusServerを起動 # /etc/init.d/radiusd start
2. テスト認証
今回の設定で認証が通るのかテストする。テストにはradtestコマンドを使用する。
RadiusServerをテストモード[radiusd -X]で起動するか、
RadiusServerのログを[tail -f]した状態でradtestを実行するとログが見れる。
radtestコマンドの書式は以下の通り(詳細はman見る事)。
# radtest "ユーザ名" "ユーザパスワード" "RadiusServerのIPアドレス":"認証待ち受けポート番号" "NAS番号(0)" "RadiusServer自体のアクセスパスワード"
RadiusServerのIPアドレスが[192.168.200.1]と仮定すると、以下の様になる
# radtest hoge bar 192.168.200.1:1812 0 RadiusServerPassword
RadiusServer側はログを見ればOK。radtest側は認証結果が標準出力へ流れてくる
###radtestに成功した場合は以下の様なreplyが来る rad_recv: Access-Accept packet from host 192.168.200.1 port 1812, id=001, length=20 Reply-Message = "Hello, hoge" ###radtestに失敗した場合はこちら rad_recv: Access-Reject packet from host 192.168.200.1 port 1812, id=002, length=19