FreeRadius
radius serverのOSS。linuxでradius server動かすならほぼコレ一択。
実際のところradiusだけではなく、DHCPやVMPS、LDAPも利用可能。
現行だとversion3が最新。
Document
Configuration files
FreeRadiusは/etc/raddbまたは/etc/freeradiusを見る。その下にあるconfigrationfileを読み込む。
基本的には各ファイルのコメントがドキュメントの全てらしいのでそれらを地道に読むしかない。
code:=main configuration construct
radiusd.conf: radius server自体の設定。検証用ならいじる必要はない。
clients.conf: clientへのアクセス許可や許可ネットワークの設定を行う。RAIDUSの共通鍵もここに記述。
modes-enabled: moduleごとの設定ファイルが並ぶディレクトリ。mode-availableのsymbolic linkファイル群
sites-enabled: siteごとの設定をファイルがディレクトリ。site-availbeのsymbolic linkファイル群
proxy.conf: raidus proxyに関する設定
policy.d
module
free radiusの認証機能はモジュールで提供されている。モジュール単位で機能の読み込みできる。
モジュールの有効無効はmodes-availablemodes-enabledで管理している。apacheのsites-availableと同様の仕組みで有効化する場合はmodes-enableからmodes-availableへのシンボリックリンクを張っているだけである。
code:=module file
これらのファイルはモジュールごとの設定ファイルだがよく使われるファイル。
users: rlm_files moduleの設定ファイル。ネットに転がっている認証設定例はrlm_filesでよくやっているね。
hints: 特定の属性値に対してどのような動作をするかを規定するファイル。
huntgroups
例えばrlm_papではRadius Access-Reuqestパケットの処理についての動作を提供している。
radiusd.conf
コンテナ運用するならログは標準出力、または標準エラー出力にしたほうが取り回しはしやすい。
またデフォルトだとユーザーが入力したパスワードがそのままログに出力されてしまう。
これは非常によくないので最低パスワード部分だけはログにでるのを止めたい。
その場合logセクションのauth_goodpass,auth_badpass,authの値をnoに設定すれば出力が抑制される。
code:=radiusd.conf
// docker container運用なら次のような感じか。
log {
// defaultはfileだがdocker containerなら標準出力ないしは標準エラー出力に出力かえたほうが無難
// 起動オプションに-Xを渡すとここのdestination設定を無視してstdoutにログを出力するようになる。
destination = stdout
stripped_names = no
auth = no
auth_badpass = no
auth_goodpass = no
}
virtual server
freeradius2からvritual server機能がある。
この機能により1台のfree radiusで複数台の独立したradius serverを疑似的に稼働できる。
あんまり使わないかな。
PAP
PAP認証時にCleartext-Passwordでファイルにベタにパスワードを書くのは実運用ではありえない。
たとえばローカルの設定ファイルにはMD5のハッシュ値、ないしはSH256等のハッシュ値を書いてハッシュ値で認証したい。
ハッシュ比較といってもPAPなので共通鍵で暗号化するものの暗号化されたパスワードはネットワークを流れる点は注意。
どういうことかというと共通鍵によって暗号化されたパスワードを認証サーバー側で複合化&ハッシュ化、そのハッシュ値を設定ファイルに記録されたハッシュ値と比較するという意味である。暗号化されたハッシュ値をクライアント直接送ってくるわけではない。なのでネットワーク上には暗号化されたパスワードが流れている。
次のように記述することでハッシュ値での比較&認証をできる。
code:authorize file
// {md5},{sha256}はhint用のヘッダーである。それぞれmd5,sha256をハッシュ関数に用いたことを示す。
// password "test1234"のmd5 hash valueをbase64 encodeしたものを記述
bob Password-With-Header := "{md5}Ftek/KdELdo62TyacmWX5A=="
// password "test1234"のsha256 hash valueをbase64 encodeしたものを記述
tom Password-With-Header := "{sha256}k36NX7tIvUlJU2zWW401xCa4DS+DDFwwjizexCKuIkQ="
認証で使うrlm_pap moduleで使えるハッシュ関数は下記を参照するとよい。saltを使うパターンもある。
authorize fileに記述する文字列は次のように生成できる。
code: md5 hash value
// test1234をmd5 hashを得てbase64 encode
echo -n test1234 | openssl dgst -md5 -binary | openssl enc -base64
// test1234をsha256 hashを得てbase64 encode
echo -n test1234 | openssl dgst -sha256 -binary | openssl enc -base64
python実装で上記のこちらも参考になる。
EOS,IOS,NXOSのenable時の認証
enable時のパスワードでRAIDUS認証する際に使うユーザー名は$ena15$。
Ciscoはところどころ情報が見つかるが、Aristaは仕様がどこに書いてあるかわからないが、実際そのユーザー名つかってくる。
参考
usersで使うオペランドやCleartext-Passwrodについて書いてる
古い資料で2系の話だが大雑把にまとまっていてよい。