FreeRADIUSの構築

概要

世の中にはさまざまな認証方法がありますが、今回はRADIUS (Remote Authentication Dial In User Service)プロトコルを使用するFreeRADIUSについてご紹介したいと思います。

RADIUSは主にネットワークアクセスを制御するための認証プロトコルとして利用されており、主にAuthentication(認証)・Authorization(認可)・Accounting(会計)の3つの機能を提供しており、AAAプロトコルとも呼ばれます。

Authentication(認証)

ユーザが入力した認証情報とサーバに登録されている認証情報を照合し、ユーザを検証すること。

Authorization(認可)

「Authentication(認証)」時に入手したユーザの情報をもとに、そのユーザに対してどのような権限を与えるかを決定すること。

Accounting(会計)

ユーザがネットワークを利用している際の使用されたシステム時間や送信されたデータ量などといった消費したリソースに関する情報を記録すること。

構築

ではそんなRADIUSプロトコルを実装しているFreeRADIUSの構築を行っていきたいと思います。

今回はコミュニティが提供する公式リポジトリからパッケージのインストールを行います。

# rpm --import 'https://packages.inkbridgenetworks.com/pgp/packages.networkradius.com.asc'
# cat <<'EOF' >/etc/yum.repos.d/networkradius.repo
[networkradius]
name=NetworkRADIUS-$releasever
baseurl=http://packages.inkbridgenetworks.com/freeradius-3.2/rocky/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://packages.inkbridgenetworks.com/pgp/packages.networkradius.com.asc
EOF
# ls /etc/yum.repos.d/
almalinux-appstream.repo         almalinux-plus.repo
almalinux-baseos.repo            almalinux-resilientstorage.repo
almalinux-crb.repo               almalinux-rt.repo
almalinux-extras.repo            almalinux-sap.repo
almalinux-highavailability.repo  almalinux-saphana.repo
almalinux-nfv.repo               networkradius.repo
# dnf install freeradius freeradius-utils
# rpm -qa | grep radius
freeradius-config-3.2.7-1.el9.x86_64
freeradius-3.2.7-1.el9.x86_64

FreeRADIUSのインストールが完了したので、デバッグモードで起動してみます。

# radiusd -X
~ 略 ~
Listening on auth address * port 1812 bound to server default
Listening on acct address * port 1813 bound to server default
Listening on auth address :: port 1812 bound to server default
Listening on acct address :: port 1813 bound to server default
Listening on auth address 127.0.0.1 port 18120 bound to server inner-tunnel
Listening on proxy address * port 51548
Listening on proxy address :: port 58611
Ready to process requests

「Ready to process requests」と出力されたので起動成功です。

次にBasic認証を行ってみます。まずは特に設定をいれないデフォルトでの動作を確認します。

尚、「radtest」コマンドは引数で以下のような情報をRADIUSサーバに送っています。

ユーザ名testing
ユーザのパスワードpassword
接続先RADIUSサーバのIPアドレス127.0.0.1
NASのポート番号 (TCPやUDPのポート番号ではない)0
NASのパスワードtesting123

NASとはNetwork Access Serverのことであり、RADIUSクライアントを指します。

ユーザがネットワークへのアクセスを試みる際にはこのNASがユーザとRADIUSサーバの間で認証情報のやりとりを仲介する役割を担っており、ネットワークスイッチや無線アクセスポイントなどが該当します。

FreeRADIUSのドキュメントではRADIUSサーバとの混同を防ぐため基本的にNASと表記されています。

# radtest testing password 127.0.0.1 0 testing123
Sent Access-Request Id 84 from 0.0.0.0:35369 to 127.0.0.1:1812 length 77
        User-Name = "testing"
        User-Password = "password"
        NAS-IP-Address = 10.15.1.15
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "password"
Received Access-Reject Id 84 from 127.0.0.1:1812 to 127.0.0.1:35369 length 38
        Message-Authenticator = 0x1edfbdbd2a661cd22dee99d2b8d49102
(0) -: Expected Access-Accept got Access-Reject

今回はユーザ情報が登録されていないため「Access-Reject」と出力され、認証されていないことがわかります。

では次に、ユーザ情報の設定ファイルである「/etc/raddb/users」を編集しテスト用のユーザ情報をサーバに追加します。

# ls -l /etc/raddb
合計 160
-rw-r-----  1 root radiusd 20754  1月 31 21:36 README.rst
drwxrwx---  3 root radiusd  4096  4月 29 19:18 certs
-rw-r-----  1 root radiusd 12167  4月 29 19:32 clients.conf
-rw-r-----  1 root radiusd 12103  1月 31 21:36 clients.conf.org
-rw-r--r--  1 root radiusd  1420  1月 31 21:36 dictionary
lrwxrwxrwx  1 root radiusd    30  1月 31 21:36 hints -> ./mods-config/preprocess/hints
lrwxrwxrwx  1 root radiusd    35  1月 31 21:36 huntgroups -> ./mods-config/preprocess/huntgroups
drwxr-x---  2 root radiusd  4096  4月 29 19:16 mods-available
drwxr-x--- 10 root radiusd   140  4月 29 19:16 mods-config
drwxr-x---  2 root radiusd  4096  4月 29 19:16 mods-enabled
-rw-r-----  1 root radiusd    52  1月 31 21:36 panic.gdb
drwxr-x---  2 root radiusd   205  4月 29 19:16 policy.d
-rw-r-----  1 root radiusd 30442  1月 31 21:36 proxy.conf
-rw-r-----  1 root radiusd 40953  1月 31 21:36 radiusd.conf
drwxr-x---  2 root radiusd  4096  4月 29 19:16 sites-available
drwxr-x---  2 root radiusd    41  4月 29 19:16 sites-enabled
-rw-r-----  1 root radiusd  3470  1月 31 21:36 templates.conf
-rw-r-----  1 root radiusd  8536  1月 31 21:36 trigger.conf
lrwxrwxrwx  1 root radiusd    29  1月 31 21:36 users -> ./mods-config/files/authorize

「/etc/raddb/users」ファイルは「/etc/raddb/mods-config/files/authorize」のシンボリックリンクであるため、バックアップを作成し編集します。

# cp -p /etc/raddb/mods-config/files/authorize /etc/raddb/mods-config/files/authorize.org
# ls -l /etc/raddb/mods-config/files
合計 32
-rw-r----- 1 root radiusd  836  1月 31 21:36 accounting
-rw-r----- 1 root radiusd 6594  1月 31 21:36 authorize
-rw-r----- 1 root radiusd 6594  1月 31 21:36 authorize.org
-rw-r----- 1 root radiusd 5225  1月 31 21:36 dhcp
-rw-r----- 1 root radiusd 1030  1月 31 21:36 pre-proxy
# cd /etc/raddb
# vi users
# diff -u /etc/raddb/mods-config/files/authorize.org /etc/raddb/mods-config/files/authorize
--- /etc/raddb/mods-config/files/authorize.org  2025-01-31 21:36:52.000000000 +0900
+++ /etc/raddb/mods-config/files/authorize      2025-04-29 19:27:22.683663065 +0900
@@ -1,3 +1,5 @@
+testing Cleartext-Password := "password"
+
 #
 #      Configuration file for the rlm_files module.
 #      Please see rlm_files(5) manpage for more information.

一旦テスト用にユーザ名が「testing」、パスワードが「password」となるように設定しました。

では先ほど起動したradiusdを再起動し、認証を試してみます。

# radtest testing password 127.0.0.1 0 testing123
Sent Access-Request Id 137 from 0.0.0.0:39074 to 127.0.0.1:1812 length 77
        User-Name = "testing"
        User-Password = "password"
        NAS-IP-Address = 10.15.1.15
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "password"
Received Access-Accept Id 137 from 127.0.0.1:1812 to 127.0.0.1:39074 length 38
        Message-Authenticator = 0xba025385982ca38a35ca5e414345972f

「Received Access-Accept」と出力され、認証されることを確認できました。

続いてRADIUSクライアントの設定と検証を行っていきます。

それではまずクライアント情報を登録していない状況で認証をしてみます。
※プライベートIPを指定することで、接続元のIPが127.0.0.1ではなくなります。

# radtest testing password 10.15.1.15 0 testing123
Sent Access-Request Id 165 from 0.0.0.0:58490 to 10.15.1.15:1812 length 77
        User-Name = "testing"
        User-Password = "password"
        NAS-IP-Address = 10.15.1.15
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "password"
Sent Access-Request Id 165 from 0.0.0.0:58490 to 10.15.1.15:1812 length 77
        User-Name = "testing"
        User-Password = "password"
        NAS-IP-Address = 10.15.1.15
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "password"
Sent Access-Request Id 165 from 0.0.0.0:58490 to 10.15.1.15:1812 length 77
        User-Name = "testing"
        User-Password = "password"
        NAS-IP-Address = 10.15.1.15
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "password"
(0) No reply from server for ID 165 socket 3

Ignoring request to auth address * port 1812 bound to server default from unknown client 10.15.1.15 port 58490 proto udp

このままでは上記のように認証が通りません。
ではクライアントの設定ファイルである「/etc/raddb/clients.conf」を編集しクライアント情報を追加します。

# cp -p clients.conf clients.conf.org
# ls -l
合計 160
-rw-r-----  1 root radiusd 20754  1月 31 21:36 README.rst
drwxrwx---  3 root radiusd  4096  4月 29 19:18 certs
-rw-r-----  1 root radiusd 12103  1月 31 21:36 clients.conf
-rw-r-----  1 root radiusd 12103  1月 31 21:36 clients.conf.org
-rw-r--r--  1 root radiusd  1420  1月 31 21:36 dictionary
lrwxrwxrwx  1 root radiusd    30  1月 31 21:36 hints -> ./mods-config/preprocess/hints
lrwxrwxrwx  1 root radiusd    35  1月 31 21:36 huntgroups -> ./mods-config/preprocess/huntgroups
drwxr-x---  2 root radiusd  4096  4月 29 19:16 mods-available
drwxr-x--- 10 root radiusd   140  4月 29 19:16 mods-config
drwxr-x---  2 root radiusd  4096  4月 29 19:16 mods-enabled
-rw-r-----  1 root radiusd    52  1月 31 21:36 panic.gdb
drwxr-x---  2 root radiusd   205  4月 29 19:16 policy.d
-rw-r-----  1 root radiusd 30442  1月 31 21:36 proxy.conf
-rw-r-----  1 root radiusd 40953  1月 31 21:36 radiusd.conf
drwxr-x---  2 root radiusd  4096  4月 29 19:16 sites-available
drwxr-x---  2 root radiusd    41  4月 29 19:16 sites-enabled
-rw-r-----  1 root radiusd  3470  1月 31 21:36 templates.conf
-rw-r-----  1 root radiusd  8536  1月 31 21:36 trigger.conf
lrwxrwxrwx  1 root radiusd    29  1月 31 21:36 users -> ./mods-config/files/authorize
# diff -u clients.conf.org clients.conf
--- clients.conf.org    2025-01-31 21:36:50.000000000 +0900
+++ clients.conf        2025-04-29 19:32:52.939676607 +0900
@@ -383,3 +383,8 @@
 #              secret = testing123
 #      }
 #}
+
+client new {
+    ipaddr = 10.15.1.15
+    secret = testing123
+}

ではradiusdを再起動し、認証を試してみます。

# radtest testing password 10.15.1.15 0 testing123
Sent Access-Request Id 182 from 0.0.0.0:37616 to 10.15.1.15:1812 length 77
        User-Name = "testing"
        User-Password = "password"
        NAS-IP-Address = 10.15.1.15
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "password"
Received Access-Accept Id 182 from 10.15.1.15:1812 to 10.15.1.15:37616 length 38
        Message-Authenticator = 0xe50c22f3b1ffb3cf337bdee0020972a7

「Received Access-Accept」と出力され認証されることを確認できました。

まとめ

ここまでで、FreeRADIUSのみを利用した簡単認証を試してみました。

次回以降はLDAPなどと連携させた場合の動作を確認していきたいと思います。

お問い合わせ

弊社では様々なサービスを取り扱っております。
詳細はサービス一覧からご覧ください。

お気軽にお問い合わせください。応対時間 9:30-17:30 [ 土・日・祝日除く ]

お問い合わせ