家の認証基盤を統一させよう

仕事と資格とイベントと、なんやかんややっているうちに年を越してしまった。(年内の資格はことごとくダメだったが……)
年越ししてからも電気通信主任技術者だったり(合格した、やった~!)、ついに通い始めた自動車学校で心のゆとりがない日々が続いていた。
車(狭義)の運転はなかなかむつかしく、日々咎められが発生している。悲しい。
自動車学校は車を運転するために予約が必要なのだが、いくつかの予約(例えば高速道路での実習)は通常の予約枠とは別に設定されており、その予約が一日にわずかな枠しか設定されていない。そのため、予約が空くのを狙うために一日中張り付く、なんてことをする必要があるのだが、休日なんかはなかなか空かない。(というのを監視用のツールを作って監視していた)

そんなこんなで予約をとれなかった週末が発生してしまったのである。どうやって過ごそうかと迷っていたら、そういえば家の認証ってそれぞれの装置で管理されててイケてないなと感じたことを思い出した。
折角の機会だし、ちょっとやってみるか、と重い腰を上げて取り組んだのがこの記事である。

目標

とりあえず認証・認可をどこかに持っていけたらいいので、RADIUS サーバを立ててそこで認証をしてもらうことにした。認証を切り替える装置は VPN 接続を担っていた IX2215 と Wi-Fi を担っていた Aruba7030 とした。
(そういえば、うちのルータや SW、サーバとかも認証を Radius にやってもらうことってできるのかな?)

FreeRADIUS のインストール

以前からいろいろなサービス動かしていた Debian サーバがあるので、そこにとりあえずインストール[2]。

$ sudo apt install freeradius freeradius-utils

インストール先は Debian 系(/etc/freeradius)と RHEL 系(/etc/raddb)で、デバッグで起動するときも freeradius -X と radiusd -X で異なるので気を付けてください(1敗)。

とりあえず [1] に従って、ユーザの登録とパスワードの登録を試してみる。

# ./clients.conf
client localhost {
  ipaddr = 127.0.0.1
  proto = *
  secret = testing123
}
# ./users
testing Cleartext-Password := "password"

登録した後はターミナルを2つ立てて、片方はデバッグ用に -X で動かし、 もう片方は freeradius-utils の中にある radtest を動かす。

// radius server
# freeradius -X 
// radius client
$ radtest testing password 127.0.0.1 0 testing123

server 側のターミナルでいろいろ出てきて問題なく動いていそう。とりあえずよし。
radtest の第5引数(”testing123″)が radius サーバ(”127.0.0.1″)に対する認証(clients.conf にかかれてるやつ)、第1引数(”testing”)と第2引数(”password”)がユーザに対する認証(usersにかかれてるやつ)と理解すればいいのだろうか。

root@srv:/etc/freeradius/3.0# radtest -h
Usage: radtest [OPTIONS] user passwd radius-server[:port] nas-port-number secret [ppphint] [nasname]
        -d RADIUS_DIR       Set radius directory
        -t <type>           Set authentication method
                            type can be pap, chap, mschap, or eap-md5
        -P protocol         Select udp (default) or tcp
        -x                  Enable debug output
        -4                  Use IPv4 for the NAS address (default)
        -6                  Use IPv6 for the NAS address

Aruba7030 への設定

GUI でしか設定を投げたことがないので GUI でやる。(いつか CLI で書けるようになりたいね)
wlan を新しく追加するため、 Security まではいい感じに進める。
Security まで来たら Auth servers: のところで先に構築した RADIUS サーバを指定する。
Shared Key は clients.conf に書かれてる testing123 みたいなものである。

# ./clients.conf
client requesting {
ipaddr = 172.16.0.1
proto = *
secret = hogehuga
}

みたいに書いていれば、aruba 7030 の IP アドレスが 172.16.0.1, 先ほどの Shared Key が hogehuga だと認証が通ると思う(通った)。 あとは users に今回払い出したいユーザとパスワードをべた書きすれば完成である。

Wi-Fi を実際につないでみるとちゃんと繋がる。ちょっと嬉しい。

IX2215 への設定

[4] を見ながらやる。NECいつもありがとう。
最初は clients.conf に IX2215 の IP アドレスと Shared Key を設定して……

……
動かない。なんで動かないんだ。

もともと IX2215 単体の機能で認証を行っていたので、その config と見比べても特段違和感がない。freeradiux -X を見てるとそもそも RADIUS サーバまでリクエストが飛んでないように見える。困り果てたので ChatGPT とバトル(噓を言う ChatGPT から本当のような気がするヒントを探し出すこと)をしてみた。

とりあえず、IX2215 では l2tp/IPSec な VPN をやるにあたって、 local 認証と Radius 認証が併存するのは無理みたいである。今まで使ってた local 認証を消さないと、l2tp セッションを張る際に ユーザ名・パスワードが local 認証に当てられて RADIUS サーバまでいかないみたい(考えてみれば当たり前の挙動である)。実際、消してみるとサーバへリクエストが飛ぶようになった。

リクエストが飛んでもまだ何か動かない要素があるみたい。
RADIUS サーバ側と ix2215 側の log を ChatGPT に食わせてみると、サーバ側からのレスポンスに属性が足りてない旨のエラーが出てることがわかる。

AAA.006: NETWORK authorization failed, user=hoge,svr=huga,cause=radiusAV-invalid(svc)

ChatGPT が続けて、users に以下の属性を追加すればいいことまで教えてくれた。

# ./users
testing Cleartext-Password := "password"
  Service-Type = Framed-User,
  Flamed-Protocol = PPP

こういうパラメータは明示的に書かないといけないんだなぁ。ChatGPT ありがとう。

これでもまだ動かない。ほかには……と ChatGPT を問い詰めると、IPアドレスの払い出しをしてないことに起因するエラーがあるらしい。そういえば、前のVPN の設定の時も DHCP での払い出しが書かれていたなということを確認し追記してみる。(これもユーザごとに紐づけてRADIUSサーバ側で固定で払い出すことはできるみたい。[4]に書かれているように、Framed-IP-Address = 172.16.0.136 のように users に記載すればいけそう。)

ppp profile lns
  accounting list ...
  ... 
  ipcp ip-compression
  ipcp provide-remote-dns 8.8.8.8
  ipcp provide-ip-address range 172.16.0.128 172.16.0.135

動いた。ちゃんと接続できた。喜びすぎて深夜に叫んでいた(オタク特有の誇張表現)。
本当によかった~

今後やりたいこと

今回パスワードがべた書きになってるのが気に食わない。何かうまいやり方がほしい。(せめてハッシュ化して保存したい)

あと、アカウント情報はSQLサーバで管理するのがかっこいい気がする(ユーザは一人なのに?)。[3]はそのやり方が書かれているので、それを見て作ってしまいたい。

あと、今回は ID/Password でやってるが、証明書を入れて認証するというのもやってみたい。かっこいいので。
ついでに証明書を払い出すサーバも立ててみたい。ここまでくるとある種のサービスだが、一体誰向けのサービスなんだろうか。

それとそれと、実は Wi-Fi の VLAN の設定が適当になっているので、いい加減きれいにしたい。

あとはね、Juniper の SRX が家に飾ったままになってるのでその動作確認とかも……

ちょっと困ったこと

IX2215 くん、 Cisco みたいに debug コマンドがないので、毎回 VPN 接続後にタイミングよく show logging last 30 を実行させられていた。これ何とかならない?

あとなんか知らんけど家の中からVPNを張ろうとしてもなぜか張れない。仕方ないのでテザリングしてデバッグしていたが、なんとかならないものだろうか。多分 Firewall 周りが悪さをしてると思うんだけど……

参考文献

  1. https://wiki.freeradius.org/guide/Getting%20Started
  2. https://pansetech.net/freeradius/
  3. https://qiita.com/Shakapon/items/a8439631fb3f87704810
  4. https://jpn.nec.com/univerge/ix/Support/l2tp_ipsec/radius.html

投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です