冗長化RADIUSサーバのユーザ情報をEFSで共有ハンズオン

## はじめに
[Google Authenticator 連携した多要素認証のRADIUSサーバ(EC2)構築ハンズオン](https://cloud5.jp/radius-server-for-mfa-authentication/)を踏まえ、MFAを発行する際に作成されるユーザを情報を、それぞれのRADIUSサーバに保存するのではなく、EFSを利用して1カ所に保存するようにしていきます。

ユーザ情報を共有することで、RADIUSサーバを冗長化した際でも発行されるトークン（QRコード）を同じにすることが可能です。

<br>

### ざっくりRADIUSサーバとは
RADIUS(Remote Authentication Dial In User Service)という認証プロトコルを利用して「このユーザは通ってOKだね」「このユーザは知らないのでNGだね」のように、認証作業を行うコンピュータのこと

参考URL:[IT用語辞典 e-Words](https://e-words.jp/w/RADIUS%E3%82%B5%E3%83%BC%E3%83%90.html)
参考URL:[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word12794.html)

<br>

------------

## 構成図
![](https://cloud5.jp/wp-content/uploads/2023/05/スクリーンショット-2023-05-06-9.48.28-640x537.png)

<br>

------------

## ハンズオン
### 構築のながれ
＝＝＝＝＝ここから前回のブログ参照＝＝＝＝＝
#### 1.EC2(RADIUS)インスタンス構築（マネジメントコンソール）
#### 2.EC2(RADIUS)インスタンスの設定（SSH接続）
＝＝＝＝＝ここまで前回のブログ参照＝＝＝＝＝
＝＝＝＝＝ここから今回の構築スコープ＝＝＝＝＝
#### 3.EFS構築（マネジメントコンソール）
#### 4.EC2(RADIUS)インスタンスのEFS設定（SSH接続）
#### 5.EC2(RADIUS)へユーザ追加（SSH接続）

-----------

### 1.EC2(RADIUS)インスタンス構築（マネジメントコンソール）
[Google Authenticator 連携した多要素認証のRADIUSサーバ(EC2)構築ハンズオン](https://cloud5.jp/radius-server-for-mfa-authentication/)
ハンズオン 手順 1.部分参照
※今回は冗長化した際の挙動を確認するため 2台構築する
<br>
### 2.EC2(RADIUS)インスタンスの設定（SSH接続）
[Google Authenticator 連携した多要素認証のRADIUSサーバ(EC2)構築ハンズオン](https://cloud5.jp/radius-server-for-mfa-authentication/)
ハンズオン 手順 4.部分参照
※今回は冗長化した際の挙動を確認するため 2台構築する
<br>

### 3.EFS構築（マネジメントコンソール）
#### 3.1.ファイルシステムの設定
EFS > 『ファイルシステムの作成』　> 『カスタマイズ』を押下
・赤枠に名前を入力、その他はデフォルトの設定で次へを押下
![](https://cloud5.jp/wp-content/uploads/2023/05/スクリーンショット-2023-05-06-8.46.32-640x532.png)

<br>

#### 3.2.ネットワークおよびSGを設定（手順3.3でSG修正）
・対象とするVPC及び サブネットを選択、SGはデフォルトを利用して次へを押下し、EFS作成
![](https://cloud5.jp/wp-content/uploads/2023/05/スクリーンショット-2023-05-06-8.47.13-640x263.png)

<br>

#### 3.3.EFS作成後、SG修正
・EFSのSGに、RADIUS（EC2）にアタッチされているSGからの`2049`ポートの通信許可を追加
![](https://cloud5.jp/wp-content/uploads/2023/05/スクリーンショット-2023-05-06-9.20.17-640x138.png)

<br>

### 4.EC2(RADIUS)インスタンスのEFS設定（SSH接続）
※今回は冗長化した際の挙動を確認するため 2台とも同じ設定をする
#### 4.1.マウントツールをインストール
```shell
sudo su -
yum install amazon-efs-utils
```
<br>

#### 4.2.マウント先を作成

```shell
mkdir /mnt/home
```
<br>

#### 4.3.マウントコマンドを実行
##### 4.3.1.マネジメントコンソール(EFS)ページのアタッチを押下
![](https://cloud5.jp/wp-content/uploads/2023/05/スクリーンショット-2023-05-06-9.07.28-640x329.png)

<br>

・赤枠部分をコピーし 末尾のマウント部分を修正
![](https://cloud5.jp/wp-content/uploads/2023/05/スクリーンショット-2023-05-06-9.07.54-640x176.png)

<br>

##### 4.3.2.下記マウント部分を修正したコマンドを実行
```shell
mount -t efs -o tls fs-【各自ポイント先】:/ /mnt/home/

### 例）
mount -t efs -o tls fs-06ef02b6dbb3d392f:/ /mnt/home/
```
<br>

・マウントされているか確認コマンド
```shell
df -k

###レスポンス 末尾の行にEFSへの接続が確認できる
Filesystem            1K-blocks    Used        Available Use% Mounted on
devtmpfs                 479016       0           479016   0% /dev
tmpfs                    487800       0           487800   0% /dev/shm
tmpfs                    487800     576           487224   1% /run
tmpfs                    487800       0           487800   0% /sys/fs/cgroup
/dev/xvda1              8376300 1905568          6470732  23% /
tmpfs                     97560       0            97560   0% /run/user/0
tmpfs                     97560       0            97560   0% /run/user/1000
127.0.0.1:/    9007199254739968       0 9007199254739968   0% /mnt/home
```

<br>

・マウントを解除するコマンド
```shell
umount /mnt/home
```

#### 4.4.EFS 自動マウント設定
##### 4.4.1.`/etc/fstab`の末尾に、再起動後も自動でマウント設定を追加

参考：[EFS マウントヘルパーを使用して EFS ファイルシステムを自動的に再マウントする](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/automount-with-efs-mount-helper.html)

```shell
vi /etc/fstab

###下記内容を記載
fs-【各自ポイント先】:/ /mnt/efs efs _netdev,nofail,noresvport,tls,iam 0 0

### 例）
fs-06ef02b6dbb3d392f:/ /mnt/home/ efs _netdev,nofail,noresvport,tls,iam 0 0
```

<br>

##### 4.4.2.設定の確認
・`umount`を実施して、`/mnt/home`をアンマウント
・次に、`mount /mnt/home`を実行して、`/etc/fstab`で設定したマウントが実行されるか確認
```shell
umount /mnt/home
df -k
# アンマウントされていることを確認

mount /mnt/home
df -k
# マウントされていることを確認
```
<br>

### 5.EC2(RADIUS)へユーザ追加（SSH接続）
#### 5.1.RADIUSサーバにユーザ追加(1号機)
・`useradd`コマンドオプション`-m`の ユーザのホームディレクトリがない場合はホームディレクトリを作成すると、`-d`の ホームディレクトリを指定するより、`/mnt/home`配下にホームディレクトリを作成する

```shell
useradd -g radius-enabled -m -d /mnt/home/【登録ユーザ】 【登録ユーザ】

###例）
useradd -g radius-enabled -m -d /mnt/home/user01 user01

###ユーザ情報確認
grep user01 /etc/passwd
user01:x:1001:1001::/mnt/home/user01:/bin/bash
```

<br>

#### 5.2.Google Authenticatorの設定（1号機）
##### 5.2.1.Google Authenticatorのオプション
Google Authenticatorの設定を行う
※コマンドラインオプションを付けなければ対話的に設定が可能ですが、今回はこちらで指定

|オプション|意味|
|---|---|
|-t|時刻ベースのワンタイムパスワードを生成|
|-d|一度利用したワンタイムパスワードの再利用を禁止|
|-f|確認なしでユーザーホームディレクトリの設定ファイルを上書き|
|-r -R |ログインを 「-rで指定した秒」ごとに 「-Rで指定した回数」 に制限| 
|-S|トークンの更新間隔|
|-w|サーバーとクライアントの時刻ズレを許容|

<br>

##### 5.2.2.Google Authenticatorのコマンド実行
```shell
sudo -u 【登録ユーザ】 /usr/bin/google-authenticator -tdf -r 3 -R 30 -S 30 -w 5

###例）
sudo -u user01 /usr/bin/google-authenticator -tdf  -r 3 -R 30 -S 30 -w 5
```
<br>

【表示されるQR画面】
※何度か作成しているため画像でのシークレットキーと、後続で説明しているシークレットキーは値が異なります（参考としての画像です）
![](https://cloud5.jp/wp-content/uploads/2023/05/スクリーンショット-2023-05-06-10.38.17-640x604.png)

<br>

```shell
### .google_authenticator設定ファイルの内容
[root@radius ~]# cat /mnt/home/user01/.google_authenticator
UW3DTXWQQ6Z6G26B5EQBGOYRZ4
" RATE_LIMIT 3 30
" WINDOW_SIZE 5
" STEP_SIZE 30
" DISALLOW_REUSE
" TOTP_AUTH
21591213
36337660
33092485
98349799
19859379
```

<br>

##### 5.2.3.QRコードを再表示するためのURL
```sehll
###QR URL
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user01@radius.mfa.example%3Fsecret%3D【Your new secret key】%26issuer%3Dradius.mfa.example

###上記設定ファイルであれば下記URLでQRコード画面が表示
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user01@radius.mfa.example%3Fsecret%3DUW3DTXWQQ6Z6G26B5EQBGOYRZ4%26issuer%3Dradius.mfa.example

```
<br>

##### 5.2.4.ログインテスト
`radtest`コマンドを実施し、レスポンス末尾に`Access-Accept`と記載があれば設定がされている

```shell
### ログインチェックコマンド
radtest user01 【ワンタイムパスの値】 localhost 1812 testing123

### コマンド実行例
radtest user01 387290 localhost 1812 testing123

### レスポンス
Sent Access-Request Id 10 from 0.0.0.0:44851 to 127.0.0.1:1812 length 76
	User-Name = "user01"
	User-Password = "387290"
	NAS-IP-Address = 192.168.10.4
	NAS-Port = 1812
	Message-Authenticator = 0x00
	Cleartext-Password = "387290"
Received Access-Accept Id 10 from 127.0.0.1:1812 to 127.0.0.1:44851 length 20
```
<br>


#### 5.4.RADIUSサーバのユーザ確認(2号機)
##### 5.4.1.ユーザ確認
```shell
###ユーザ情報確認
grep user01 /etc/passwd
user01:x:1001:1001::/mnt/home/user01:/bin/bash

### .google_authenticator設定ファイルの内容を確認
[root@radius ~]# cat /mnt/home/user01/.google_authenticator
UW3DTXWQQ6Z6G26B5EQBGOYRZ4
" RATE_LIMIT 3 30
" WINDOW_SIZE 5
" STEP_SIZE 30
" DISALLOW_REUSE
" TOTP_AUTH
21591213
36337660
33092485
98349799
19859379
```

<br>

##### 5.2.4.ログインテスト
`radtest`コマンドを実施し、レスポンス末尾に`Access-Accept`と記載があれば、RADIUS1号機とRADIUS2号機は同じユーザ設定ファイルでの設定がされている

```shell
### ログインチェックコマンド
radtest user01 【ワンタイムパスの値】 localhost 1812 testing123

### コマンド実行例
radtest user01 561058 localhost 1812 testing123

### レスポンス
Sent Access-Request Id 207 from 0.0.0.0:55429 to 127.0.0.1:1812 length 76
	User-Name = "user01"
	User-Password = "561058"
	NAS-IP-Address = 192.168.20.95
	NAS-Port = 1812
	Message-Authenticator = 0x00
	Cleartext-Password = "561058"
Received Access-Reject Id 207 from 127.0.0.1:1812 to 127.0.0.1:55429 length 20
(0) -: Expected Access-Accept got Access-Reject
```
<br>

------------

## さいごに
問題なく冗長化したRADIUSサーバから、ユーザ情報をEFSで共有することができました。
ただしユーザが増えるたびに、RADIUSにユーザを作成していかないといけないのは辛いなと構築しながら思いました。
RADIUSサーバをADに参加させれば、ユーザの管理はADに任せられるという記事を見たので、次はそちらの検証をしていきたいと思います。