*Radius [#w590415c]
[[FreeRADIUS:+http://freeradius.org/]]
OSSのRadiusServerとしては、多分一番シェアが高い物。
~
*インストール [#of8b6c87]
&size(16){&font(b){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
~
&size(16){&font(b){2. FreeRADIUSのコンパイル};};
[[OpenSSL:http://www.ns-lab.org/wiki/?cmd=read&page=Linux%2FSource%2FOpenSSL]]も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を打ったりする。
~
&size(16){&font(b){3. インストール後処理};};
ログディレクトリを作成したり、FreeRADIUS用にユーザ・グループの作成。
 # 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
 # chgrp -R radius /etc/radius/raddb/*
~
&size(16){&font(b){4. コンフィグ};};
大規模システムならradiusのデータをMySQLへ流すのだろうが、
今回は小規模な仕組みかつ平常時のメンテナンス性を重視する為、プレーンテキストで情報を保存する。
下記では、変更した部分のみ記載する。
~
&font(b){# 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_valnerable_openssl = yes   #OpenSSLのHeartBeatチェックを行わない
     #上記オプションを入れないと、yumで入れた修正済みOpenSSL"1.0.1e+hoge"に対しても反応してしまう。
 }
~
&font(b){# 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識別名
 }
~
&font(b){# 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を経由させる
 }
~
&font(b){# vi users};
 ###Radius認証用のユーザ名とパスワード
 #"ユーザ名"  Cleartext-Password := "ログインパスワード"
 #    Reply-Message = "Hello, %{User-Name}"
 
 ###『ユーザ名=hoge / パスワード=bar』だとこんな感じ
 "hoge" Cleartext-Password := "bar"
     Reply-Message = "Hello, %{User-Name}"
~
&font(b){# vi certs/ca.cnf};
 ###RadiusServerの証明書を作成するMakefileを変更
 DH_KEY_SIZE = 2048   #Diffie-Hellmanの鍵長を"2048"bitに変更
~
&font(b){# 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
~
&font(b){# 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 = ""
~
&font(b){# 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 = ""
~
&font(b){# 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 = ""
~
&font(b){# 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
     }
 }