MACアドレス認証だけをするRADIUSサーバ程度ならErlang覚えたてでも書けるんじゃないの?
とか、思ってしまうFreeRADIUS 2.0.5の設定の面倒さ、というか、こなれてない感じに、ちょっとげんなり。
(検索でたどり着いてしまった方へ:せめてもの罪滅ぼしにb:id:kgbu:t:RADIUSをごらんください)
一番ハマッたのは、users設定ファイルで、User-Password
someone User-Password == "passwordxxxx" Reply-Message = "OK"
だと"cleartext-password使え"というWARNINGが出て認証も失敗したが、Cleartext-Passwordを使うだけではダメで、
someone Cleartext-Password := "passwordxxxx" Reply-Message = "OK"
という風に、':=' という指定子(?)を使わないとだめだったこと。
確かに意味は違うんだけど。
Attribute := Value Always matches as a check item, and replaces in the configuration items any attribute of the same name. If no attribute of that name appears in the request, then this attribute is added. As a reply item, it has an identical meaning, but for the reply items, instead of the request items. Attribute == Value As a check item, it matches if the named attribute is present in the request, AND has the given value. Not allowed as a reply item.
'=='を使うと、Requestにこの属性が無ければチェックされないということで、ちょっと認証条件として弱いのかな?それでデフォルトの条件との一致のほうが強くなるのかな?とか思ってしまうが、どーも納得できない。
以下、いくつかテストしてみた結果。
usersの設定内容 you User-Password := "12:34:00:ab:cd:ef" Reply-Message = "Hello, %{User-Name}" me Cleartext-Password := "12:34:00:ab:cd:ef" Reply-Message = "Hello, %{User-Name}" guys Cleartext-Password == "12:34:00:ab:cd:ef" Reply-Message = "Hello, %{User-Name}" guys2 User-Password == "12:34:00:ab:cd:ef" Reply-Message = "Hello, %{User-Name}" 実行してみた結果は youのケース:認証OK、でもradiusd側では、Cleartext-Passwordを使ってね、というメッセージが出る。 User-Name = "you" Password = "12:34:00:ab:cd:ef" rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=254, length=32 Reply-Message = "Hello, you" meのケース:認証OK:これが推奨される記述なんだろう。 Sending Access-Request of id 63 to 127.0.0.1 port 1812 User-Name = "me" Password = "12:34:00:ab:cd:ef" rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=63, length=31 Reply-Message = "Hello, me" guysのケース:認証失敗 Sending Access-Request of id 12 to 127.0.0.1 port 1812 User-Name = "guys" Password = "12:34:00:ab:cd:ef" rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=12, length=20 guys2のケース:認証失敗、でもメッセージが帰ってくる。radiusd側では「"man rlm_pap嫁!」という警告メッセージが出ている。 Sending Access-Request of id 157 to 127.0.0.1 port 1812 User-Name = "guys2" Password = "12:34:00:ab:cd:ef" rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=157, length=34 Reply-Message = "Hello, guys2"
そんならradiusd -Xで起動した時点で何か文句垂れてくださいとか思うのだが。(実際には、userファイルは、requestがあるたびに読みこんでいるのかもしれない)
ついでに、man rlm_papのマニュアルの英文も"known good" passwordがどういう意味なのか、英語力が足りなくて困る。このあたり、互換性の問題でこうなっているのだろうか?正直わけがわかりません。
(追記するかも)
やりたいことは、安価な無線LANアクセスポイントのMACアドレス認証の肩代わりだけなのにな。
認証相手の制限とかはiptablesでやれるだろうし、受け取るメッセージの形式が決め打ちなほうが脆弱性の問題少なげだし。
とりあえずRFC2865読んで、パケットのフォーマットがわかれば、あとはradclientやアクセスポイント実機でビシバシテストしまくるのみだったりするのではないか?まぁ、ゼロからそんな半端モノを作るよりは、テスト済みのコードの極く一部の機能を使うように設定するほうが正しい道なのだと思うが。
(追記:2008/July/1
No "known good" passwordの警告は、usersファイルを更新して、radiusdを再起動していない状態でも起きるので注意。新しいユーザを登録したら、再起動。
)
2008/July/12追記 MACアドレスのパターンと、RADIUSのほかのポートについて
MACアドレス認証をする場合、ルータやスイッチから送られてくるMACアドレスのパターンは、上記のようなコロン区切りではなく、'-'ハイフンで区切られていることもある。というか、アライドテレシスのスイッチ(CentreCOM8xxxとか)だとハイフン区切りだった。
また、機器によっては、RADIUSサーバとの通信を1812以外のポート、たとえば1813(radius-account)などでも行うことがある。iptablesなどのファイアウォール設定で、このポート(udp)を開けておかないといけないことがあるようだ。1814も一応RADIUSがらみのポートだが、ここにアクセスしているのを見たことは、まだ無い。