今回はAmazon Linux2022でFreeRadiusを構築していきます。ちょっとした検証でRadius認証環境が必要になったので作ってみました。Amazon Linux2022も今回初めて使ってみます。FreeRadiusはOSSなのでソフトライセンス費用がかからないのはありがたいです。ただ如何せん最近の為替レートが超円安なのでAWS自体のコストが...
今回のゴール
FreeRadius単体で、ユーザIDとPWを使ってRadius認証できる環境にする
前提環境
・利用するEC2のAMIはAmazon Linux2022
・ソースからDL、コンパイルして構築する
・FreeRadiusのバージョンは3.2.1
・DB連携はせず、FreeRadius単体でユーザID、PWを管理する構成
・Radiusクライアント(NW機器)は用意せず、認証テストはRadiusサーバの単体で実施(radtestコマンド)
Radiusとは?
そもそもRadiusとは何なのか
RADIUSとは、Remote Authentication Dial In User Serviceの単語の頭文字をつなぎ合わせた略称で、AAAを構成するネットワーク上のユーザー認証プロトコルの1つです。古くからダイアルアップ回線やISPのサーバーとして利用されてきたもので、ユーザー認証だけでなくネットワークの接続時間やデータ量の情報も収集することができます。現在では無線LANや有線LANでのネットワーク接続時のユーザー認証プロトコルとしても利用されており、セキュリティ強化に役立っています。
【出典】https://locked.jp/blog/what-is-radius/
ざっくりと無線LAN接続などに必要なユーザID、PWを一括管理でき、認証に利用できる仕組みです。
ユーザがRadiusクライアント(ルータ等)に接続要求をした際に、ユーザへUserID/PWの入力を要求し、入力されたID/PWが正しいかをRadiusサーバで評価します。評価結果をRadiusクライアントに返し、問題なければユーザは接続OKになるという仕組みです。
【参考】https://www.designet.co.jp/faq/term/?id=UkFESVVT44K144O844OQ
今回Radiusクライアントは手持ちのNW機器がなかったので、Radiusサーバ単体で自分自身にID/PWの認証を聞きにいく形でテストします。
構築の流れ
①VPCとEC2のデプロイ
②Amazon Linux2022の環境設定
③FreeRadiusのソースDLとコンパイル
④FreeRadiusの設定ファイルの変更
⑤systemdにサービス登録
⑥認証テスト
⑦認証ログ確認
実際にやってみた
①VPCとEC2のデプロイ
VPCのデプロイについてはいつものようにEC2へSSHできる環境であればOKです。EC2ですが一点だけAmazon Linux2とは違う設定が必要になります。それはキーペアのタイプを「ED25519」にする必要があるところです。Amazon Linux2はどっちでもいけましたたがAmazon Linux2022では「ED25519」でしかSSH接続できないので、キーペアを使い回している方は新規キーペアを作成してください。
②Amazon Linux2022の環境設定
日本語化
#日本語化
localectl set-locale LANG=ja_JP.UTF-8
タイムゾーン変更
#タイムゾーンをUTMからJSTへ変更
timedatectl set-timezone Asia/Tokyo
反映のためサーバ再起動
#再起動
reboot
③FreeRadiusのソースDLとコンパイル
ネット上の構築情報ではインストールは「yum install freeradius freeradius_utils」で、あとは設定ファイルを変更すればOK!的な情報ばっかりですが、それはCentOSやRedhatの場合です。残念ながらAmazon Linux2022のレポジトリにはFreeRadiusは入ってないです...(AWSさん、どうして...)仕方ないのでソースDLして、コンパイルしていきましょう。
必要なパッケージ、モジュールのインストール
コンパイルするのに以下パッケージ、モジュールが必要なので事前にインストールしておきます。
#wgetのインストール
dnf -y install wget
#gccのインストール
dnf -y install gcc-c++
#libtalloc-develのインストール
dnf -y install libtalloc-devel
#openssl-develのインストール
dnf -y install openssl-devel
ソースデータのDL
#ソースデータ用のディレクトリを作成
mkdir /usr/local/freeradius
#ソースデータ用ディレクトリに移動
cd /usr/local/freeradius
#公式サイトからソースをwgetコマンドでDL
wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-3.2.1.tar.gz
#tarコマンドで解凍
tar xzfv freeradius-server-3.2.1.tar.gz
コンパイル
#解凍したディレクトに移動
cd freeradius-server-3.2.1
#Configureを実行し、環境に合わせたMakeFileの作成
./configure --prefix=/usr/local/freeradius/
最終行で以下のように表示が出ていればOKです
configure: creating ./config.status
config.status: creating all.mk
#make実行
make
#make install の実行
make install
これでコンパイルは完了です。
/usr/local/freeradius配下に各設定ファイルが作成されています。/usr/local/freeradius/sbin下のradiusdというファイルがFreeRadiusの実体ファイルです。
④FreeRadiusの設定ファイルの変更
続いてデフォルト状態の各設定ファイルに変更を加えていきます。
#設定ファイルのあるディレクトに移動
cd /usr/local/freeradius/etc/raddb
radiusd.confの変更
#下記箇所を修正
328行目(認証時のログ出力設定)
auth = no →[yes]に変更
352行目(認証失敗時のログ出力)
auth_badpass = no →[yes]に変更
353行目(認証成功時のログ出力)
auth_goodpass = no →[yes]に変更
usersの変更
#ファイルの最上部に下記を追記
hoge Cleartext-Password := "hogepass"
認証にID=hoge, Password=hogepassを追記します。
今回はRadiusサーバ自身(localhost)からテストコマンドでID、PWを認証しにいくのでclients.confは変更しません。アクセス制御をしたい場合は修正していください。
ちなみにlocalhostのキーはtesting123がデフォルトです。clients.confにsecretと記載されている部分です。
⑤systemdにサービス登録
dnfやyumでインストールしたわけではないので、systemctl start "サービス名"と入力してもコマンドが通らない状態です。/usr/local/freeradius/sbinに移動して、"./radiusd"と実行しても起動はしますが、面倒なのでsystemctlコマンドで起動・停止ができるようにサービスユニットファイルを作成して登録してやりましょう。
#/etc/systemd/systemに移動して、サービスユニットファイル名=freeradius.serviceを作成
cd /etc/systemd/system
touch freeradius.service
#freeradius.serviceのアクセス権修正
chmod -R 644 freeradius.service
#freeradius.serviceの中身に以下を記述
[Unit]
Description=Freeradius
After=network.target
[Service]
ExecStart=/usr/local/freeradius/sbin/radiusd
Type=forking
[Install]
WantedBy=default.target
#設定反映
systemctl daemon-reload
#サービス起動確認
systemctl start freeradius
systemctl status freeradius
以下のように表示されればOKです。
● freeradius.service - Freeradius
Loaded: loaded (/etc/systemd/system/freeradius.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2022-10-24 09:37:21 JST; 8s ago
ついでにサーバ起動時のサービス自動起動設定もしておきます
systemctl enable freeradius
あと一応freeradiusのデフォルトポート:1812が空いているかも確認してみましょう。
lsof -i:1812
以下の表示がでればOKです。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
radiusd 2136 root 7u IPv4 17499 0t0 UDP *:radius
radiusd 2136 root 9u IPv6 17501 0t0 UDP *:radius
これで設定もOKです。
⑥認証テスト
FreeRadiusにはradtestというテストコマンドがあります。ただ環境変数にradtestのファイルのパスを通していないのでそのままだとコマンドが通らないです。なのでradtestがあるディレクトまで移動してからコマンド実行します。
#ディレクトリ移動
cd /usr/local/freeradius/bin
ls -l でradtestがあることを確認する
#radtestコマンド実行
./radtest hoge hogepass localhost 1812 testing123
以下のように認証結果が表示されます。
[認証OKの場合]
Sent Access-Request Id 218 from 0.0.0.0:50688 to 127.0.0.1:1812 length 74
User-Name = "hoge"
User-Password = "hogepass"
NAS-IP-Address = 10.0.0.81
NAS-Port = 1812
Message-Authenticator = 0x00
Cleartext-Password = "hogepass"
Received Access-Accept Id 218 from 127.0.0.1:1812 to 127.0.0.1:50688 length 20
[認証NGの場合]
Sent Access-Request Id 161 from 0.0.0.0:50910 to 127.0.0.1:1812 length 78
User-Name = "hogehoge"
User-Password = "hoge"
NAS-IP-Address = 10.0.0.81
NAS-Port = 1812
Message-Authenticator = 0x00
Cleartext-Password = "hoge"
Received Access-Reject Id 161 from 127.0.0.1:1812 to 127.0.0.1:50910 length 20
(0) -: Expected Access-Accept got Access-Reject
⑦認証ログ確認
実際の認証ログを確認します。ログファイルは[/usr/local/freeradius/var/log/radius]にあります。
ログファイルに下記のように出ていればOKです。
認証OK → Auth: (0) Login OK: [hoge/hogepass] (from client localhost port 1812)
認証NG → Auth: (0) Login incorrect (No Auth-Type found: rejecting the user via Post-Auth-Type = Reject): [hogehoge/hoge] (from client localhost port 1812)
おわりに
DB連携すればRadiusサーバをGUIで管理できるようするdoloRadiusというソフトが利用できたり、ユーザ管理が楽になったりするようです。また時間があれば、DB連携版も検証してみます。本記事のいいね数次第かな(笑)
参考にしたサイト
https://beyondjapan.com/blog/2020/05/radius-radtest-global/
https://tex2e.github.io/blog/linux/create-my-systemd-service
https://genchan.net/it/server/2211/
https://qiita.com/ohmori7/items/57913c7063b731aa2347