Google Authenticator 連携した多要素認証のRADIUSサーバ(EC2)構築ハンズオン

## はじめに
要件としてEC2をRADIUSサーバとして利用すること、そして多要素認証を取り入れなければいけないという事なので、まずはともあれ検証していきたいと思います

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

![](https://cloud5.jp/wp-content/uploads/2022/10/スクリーンショット-2022-10-08-19.02.38-640x240.png)

参考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)

## ハンズオン
### 1.EC2作成
| 設定項目  |  内容 |
| ------------ | ------------ |
| OS  |  Amazon Linux 2 |
| インスタンスタイプ  |  t2.micro |
|セキュリティグループ|SSH接続（Port22）のみ可能|

インストールされているパッケージのバージョンを最新にしておく
```bash
$ sudo yum -y update
```

※インスタンスタイプは検証環境のため`t2.micro`を選定

※AD Connector運用の際は、AD Connectorの所属するサブネットから、 **UDP 1812**からのインバウンドルールを追加しなければ接続できない（今回は赤枠のスコープのため設定はしていない）

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


### 2.EC2をRADIUSサーバとしてインストールする必須パッケージ
| パッケージ名  |  内容 |
| ------------ | ------------ |
| google-authenticator  |  二段階認証設定パッケージ |
| freeradius |  RADIUSを実現させるオープンソースソフトウェアパッケージ |
|freeradius-utils|radtest（ローカルで動作テストをする）が入っているパッケージ|

#### 2.1.google-authenticator インストールの準備
google-authenticatorはyumでインストール出来ないため、サーバにSSH接続後、rootユーザへ切り替えて(sudo su -)から下記コマンドを入力する

```bash
$ amazon-linux-extras install -y epel
```
#### 2.2.必須のパッケージ3つをインストールする
```bash
$ yum -y install freeradius freeradius-utils google-authenticator
```

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


### 3.RADIUSサーバ（EC2）で利用する事前設定
| 設定するもの  |  内容 |
| ------------ | ------------ |
| グループ作成  |  RADIUS経由の認証を許可するためのグループ作成|
| ホスト名設定 | google-authenticator　で登録する際に利用のため作成 |

※グループに所属するユーザは後述「5.RADIUSサーバで認証するユーザの設定」で登録をしていきます

#### 3.1.RADIUS経由の認証を許可するグループの作成
```bash
$ groupadd radius-enabled
```
下記コマンドでグループが作成されているかを確認できる
```bash
$ cat /etc/group | grep radius-enabled
```
#### 3.2.ホスト名設定
```bash
$ hostnamectl set-hostname radius.(ドメイン名)
 　↓
（例）
$ hostnamectl set-hostname radius.mfa.example
```
下記コマンドでホスト名を確認できる
```bash
$ hostnamectl
```
#### 3.3.hostsファイルに記載
```bash
$ vi /etc/hosts
```
vi の　インサートモードで自身のプライベートIPアドレス、3.2.ホスト名設定で入力したドメイン名を最終行に追加する
```bash
自身のプライベートIPアドレス radius.(ドメイン名)
　↓
（例）
192.168.10.83 radius.mfa.example
```

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


### 4.FreeRADIUSの設定
|ファイルパス |  設定内容|
| -------- | --------|
|/etc/raddb/radiusd.conf| Free-RADIUSの基本設定|
|/etc/raddb/clients.conf| 認証するネットワーク|
|/etc/raddb/users        |RADIUS認証ユーザ|
|/etc/raddb/sites-available/default|PAM有効化|
|/etc/pam.d/radiusd|GoogleAuthenticator利用設定|

#### 4.1.radiusd.confの編集
rootユーザで動作させるため設定を下記のように変更します
```bash
$ vi /etc/raddb/radiusd.conf
```
変更前
```bash
        user = radiusd
        group = radiusd
```
変更後
```bash
        user = root
        group = root
```

#### 4.2.clients.confの編集
RADIUSサーバがプロトコルを受け付けるRADIUSクライアント（「ざっくりRADIUSとは」の図におけるAD Connecter部分）の設定をします
```bash
$ vi /etc/raddb/clients.conf 
```
末尾にRADIUSクライアントのIPアドレスレンジ、secret（今回はスコープ外になるDirectoryServiceとの連携に必要となるシークレットコード）をに入力する
```bash
client new {
  ipaddr = 0.0.0.0/0
  secret = XXXXX(※任意の値を入力)
}
```
※IPアドレスレンジは上記のような 0.0.0.0/0にすることで何処からでも受付をすることが可能（検証環境及びスコープ外のため、上記 0.0.0.0/0 の値としています）

#### 4.3.users の編集
radius-enabledのグループに所属しているユーザーがradius認証されるように設定
```bash
$ vi /etc/raddb/users
```
末尾に追加する内容
```bash
DEFAULT    Group != "radius-enabled", Auth-Type := Reject
       Reply-Message = "Your account has been disabled."
DEFAULT        Auth-Type := PAM
```
`radius-enabled`に**所属していない場合**は、`"Your account has been disabled(アカウントは無効です)."`が表示される

`radius-enabled`に**所属している場合**は、`PAM(pluggable authentication module)`を利用する

#### 4.4.PAM(pluggable authentication module)を有効化
>##### ざっくりPAM(pluggable authentication module)とは？
Linuxのアプリケーションが共通して利用（認証方式を統一化）できる認証のシステムのこと
参考URL：[LinuC Linux豆知識087](https://linuc.org/study/knowledge/417/)

PAMを利用するため`/etc/raddb/sites-available/default`ファイルの変更
```bash
$ vi /etc/raddb/sites-available/default
```
変更前
```bash
        #  Pluggable Authentication Modules.
#        pam
```
変更後
```bash
        #  Pluggable Authentication Modules.
        pam
```

#### 4.5.GoogleAuthenticator利用設定
RADIUS認証の際に、GoogoleAuthenticatorが使われるよう設定を変更及び追記
```bash
$ vi /etc/pam.d/radiusd
```
変更後　
・既存で記述されている部分をコメントアウトに変更する(2-6行目)
・認証の際に、GoogoleAuthenticator利用の旨を追記する（7-9行目）
```bash
#%PAM-1.0
#auth       include     password-auth
#account    required    pam_nologin.so
#account    include     password-auth
#password   include     password-auth
#session    include     password-auth
auth requisite pam_google_authenticator.so
account required pam_permit.so
session required pam_permit.so
```
#### 4.6.GoogleAuthenticator利用設定を有効化するためシンボリックリンク追加
4.5.での設定（PAMモジュール）を有効化するため、シンボリックリンクを追加する
```bash
$ ln -s /etc/raddb/mods-available/pam /etc/raddb/mods-enabled/pam
```

#### 4.7 RADIUSサーバを起動
```bash
# サービスの自動起動を設定
$ systemctl enable radiusd

# サービスの起動
$ systemctl start radiusd

# サービスの状態確認
$ systemctl status radiusd

```
サービスが正常に起動している際のプロンプト画面
![](https://cloud5.jp/wp-content/uploads/2022/10/スクリーンショット-2022-10-09-6.31.29-640x140.png)

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


### 5.RADIUSサーバで認証するユーザの設定
#### 5.1 RADIUSサーバで認証するユーザを登録
```bash
$ useradd -g radius-enabled (ユーザー名)
```
追加したユーザ権限で、google-authenticatorを起動する
```bash
$ sudo -u (ユーザー名) /usr/bin/google-authenticator
```
認証トークンをタイムベースにするかを質問されるので、yを押下
```
Do you want authentication tokens to be time-based (y/n) y
```
上記 押下後、画面上にQRコードを表示するURL及び、QRコードが表示される
```
Warning: pasting the following URL into your browser exposes the OTP secret to Google:
  https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user01@radius.mfa.example%3Fsecret%XXXXXXXXXX%26issuer%3Dradius.mfa.example
```
その後に続く質問に対して、yを押下する

#### 5.2 QRコードからワンタイムパスワードを発行する
表示されたURLをブラウザに入力し、QRコード画面を表示させる
![](https://cloud5.jp/wp-content/uploads/2022/10/スクリーンショット-2022-10-09-7.06.06.png)

各手持ちのデバイスで上記QRコードを読み取り、ワンタイムパスワードを発行する
![](https://cloud5.jp/wp-content/uploads/2022/10/スクリーンショット-2022-10-09-7.10.21-1.png)

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


### 6.接続テスト
`radtest`コマンドで下記ユーザの認証が可能か確認する
```
$ radtest user01 【ワンタイムパスの数字】 localhost 1812 testing123
```
※自身から自身へのテストのため、`localhost`と設定する。もしクライアントからの確認の場合は、RADIUSサーバのIPを入力する

※`localhost`のパスワード`testing123`は`/etc/raddb/clients.conf (4.2で編集したファイル)`に記載されているデフォルトの設定値を利用しています

(例)ワンタイムパス 有効時間内に押下した場合の画面：成功
```
[root@radius ~]# radtest user01 826611 localhost 1812 testing123
Sent Access-Request Id 94 from 0.0.0.0:40033 to 127.0.0.1:1812 length 76
	User-Name = "user01"
	User-Password = "826611"
	NAS-IP-Address = 192.168.10.83
	NAS-Port = 1812
	Message-Authenticator = 0x00
	Cleartext-Password = "826611"
Received Access-Accept Id 94 from 127.0.0.1:1812 to 0.0.0.0:0 length 20
```
(例)ワンタイムパス 有効時間外に押下した場合の画面：失敗
返ってくるメッセージの文末2行部分に、認証が弾かれた旨が記載されている

```
[root@radius ~]# radtest user01 826611 localhost 1812 testing123
Sent Access-Request Id 61 from 0.0.0.0:39468 to 127.0.0.1:1812 length 76
	User-Name = "user01"
	User-Password = "826611"
	NAS-IP-Address = 192.168.10.83
	NAS-Port = 1812
	Message-Authenticator = 0x00
	Cleartext-Password = "826611"
Received Access-Reject Id 61 from 127.0.0.1:1812 to 0.0.0.0:0 length 20
(0) -: Expected Access-Accept got Access-Reject
```

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


## おわりに
ここからAD Connecterと紐付けしていく後半戦がありますが、一度ここまでで区切ります。熱が冷める前に、さっさとAD Connecterと紐付けして挙動の検証を進めていきたいと思います。




## 参考URL
URL:[BlackBelt 多要素認証による Amazon WorkSpaces の利用](https://www.slideshare.net/AmazonWebServicesJapan/amazon-workspaces-86568155)
URL:[【APN Ambassadors ブログシリーズ第三弾】Amazon WorkSpaces で多要素認証（MFA）を利用する場合でもユーザは AD だけで管理したい](https://aws.amazon.com/jp/blogs/psa/apn-ambassadors-blog-003/)
URL:[Serverworks RADIUSサーバーを構築して、WorkSpacesを多要素認証で運用する](https://blog.serverworks.co.jp/tech/2020/01/21/workspaces-use-radius-mfa/)