この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
はじめに
Google Authenticator 連携した多要素認証のRADIUSサーバ(EC2)構築ハンズオンを踏まえ、MFAを発行する際に作成されるユーザを情報を、それぞれのRADIUSサーバに保存するのではなく、EFSを利用して1カ所に保存するようにしていきます。
ユーザ情報を共有することで、RADIUSサーバを冗長化した際でも発行されるトークン(QRコード)を同じにすることが可能です。
ざっくりRADIUSサーバとは
RADIUS(Remote Authentication Dial In User Service)という認証プロトコルを利用して「このユーザは通ってOKだね」「このユーザは知らないのでNGだね」のように、認証作業を行うコンピュータのこと
参考URL:IT用語辞典 e-Words
参考URL:「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
構成図
ハンズオン
構築のながれ
=====ここから前回のブログ参照=====
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)構築ハンズオン
ハンズオン 手順 1.部分参照
※今回は冗長化した際の挙動を確認するため 2台構築する
2.EC2(RADIUS)インスタンスの設定(SSH接続)
Google Authenticator 連携した多要素認証のRADIUSサーバ(EC2)構築ハンズオン
ハンズオン 手順 4.部分参照
※今回は冗長化した際の挙動を確認するため 2台構築する
3.EFS構築(マネジメントコンソール)
3.1.ファイルシステムの設定
EFS > 『ファイルシステムの作成』 > 『カスタマイズ』を押下
・赤枠に名前を入力、その他はデフォルトの設定で次へを押下
3.2.ネットワークおよびSGを設定(手順3.3でSG修正)
・対象とするVPC及び サブネットを選択、SGはデフォルトを利用して次へを押下し、EFS作成
3.3.EFS作成後、SG修正
・EFSのSGに、RADIUS(EC2)にアタッチされているSGからの2049
ポートの通信許可を追加
4.EC2(RADIUS)インスタンスのEFS設定(SSH接続)
※今回は冗長化した際の挙動を確認するため 2台とも同じ設定をする
4.1.マウントツールをインストール
sudo su -
yum install amazon-efs-utils
4.2.マウント先を作成
mkdir /mnt/home
4.3.マウントコマンドを実行
4.3.1.マネジメントコンソール(EFS)ページのアタッチを押下
・赤枠部分をコピーし 末尾のマウント部分を修正
4.3.2.下記マウント部分を修正したコマンドを実行
mount -t efs -o tls fs-【各自ポイント先】:/ /mnt/home/
### 例)
mount -t efs -o tls fs-06ef02b6dbb3d392f:/ /mnt/home/
・マウントされているか確認コマンド
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
・マウントを解除するコマンド
umount /mnt/home
4.4.EFS 自動マウント設定
4.4.1./etc/fstab
の末尾に、再起動後も自動でマウント設定を追加
参考:EFS マウントヘルパーを使用して EFS ファイルシステムを自動的に再マウントする
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
4.4.2.設定の確認
・umount
を実施して、/mnt/home
をアンマウント
・次に、mount /mnt/home
を実行して、/etc/fstab
で設定したマウントが実行されるか確認
umount /mnt/home
df -k
# アンマウントされていることを確認
mount /mnt/home
df -k
# マウントされていることを確認
5.EC2(RADIUS)へユーザ追加(SSH接続)
5.1.RADIUSサーバにユーザ追加(1号機)
・useradd
コマンドオプション-m
の ユーザのホームディレクトリがない場合はホームディレクトリを作成すると、-d
の ホームディレクトリを指定するより、/mnt/home
配下にホームディレクトリを作成する
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
5.2.Google Authenticatorの設定(1号機)
5.2.1.Google Authenticatorのオプション
Google Authenticatorの設定を行う
※コマンドラインオプションを付けなければ対話的に設定が可能ですが、今回はこちらで指定
オプション | 意味 |
---|---|
-t | 時刻ベースのワンタイムパスワードを生成 |
-d | 一度利用したワンタイムパスワードの再利用を禁止 |
-f | 確認なしでユーザーホームディレクトリの設定ファイルを上書き |
-r -R | ログインを 「-rで指定した秒」ごとに 「-Rで指定した回数」 に制限 |
-S | トークンの更新間隔 |
-w | サーバーとクライアントの時刻ズレを許容 |
5.2.2.Google Authenticatorのコマンド実行
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
【表示されるQR画面】
※何度か作成しているため画像でのシークレットキーと、後続で説明しているシークレットキーは値が異なります(参考としての画像です)
### .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
5.2.3.QRコードを再表示するためのURL
###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
5.2.4.ログインテスト
radtest
コマンドを実施し、レスポンス末尾にAccess-Accept
と記載があれば設定がされている
### ログインチェックコマンド
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
5.4.RADIUSサーバのユーザ確認(2号機)
5.4.1.ユーザ確認
###ユーザ情報確認
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
5.2.4.ログインテスト
radtest
コマンドを実施し、レスポンス末尾にAccess-Accept
と記載があれば、RADIUS1号機とRADIUS2号機は同じユーザ設定ファイルでの設定がされている
### ログインチェックコマンド
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
さいごに
問題なく冗長化したRADIUSサーバから、ユーザ情報をEFSで共有することができました。
ただしユーザが増えるたびに、RADIUSにユーザを作成していかないといけないのは辛いなと構築しながら思いました。
RADIUSサーバをADに参加させれば、ユーザの管理はADに任せられるという記事を見たので、次はそちらの検証をしていきたいと思います。