Radius

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