Amazon Linux2022でFreeRadiusの構築

今回は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になるという仕組みです。

仕組み（シーケンスイメージ）
![Radius_認証.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/0615a088-1ecd-c958-8e0a-d4187c54df43.png)

【参考】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接続できないので、キーペアを使い回している方は新規キーペアを作成してください。
![Radius_キーペア.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/e9aedf52-9003-1855-eea3-7912e2a0e92d.png)


## ②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