この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
はじめに
おつかれさまです、第三システム部の稲村です。
要件としてEC2をRADIUSサーバとして利用すること、そして多要素認証を取り入れなければいけないという事なので、まずはともあれ検証していきたいと思います
ざっくりRADIUSサーバとは
RADIUS(Remote Authentication Dial In User Service)という認証プロトコルを利用して「このユーザは通ってOKだね」「このユーザは知らないのでNGだね」のように、認証作業を行うコンピュータのこと
参考URL:IT用語辞典 e-Words
参考URL:「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
ハンズオン
1.EC2作成
設定項目 | 内容 |
---|---|
OS | Amazon Linux 2 |
インスタンスタイプ | t2.micro |
セキュリティグループ | SSH接続(Port22)のみ可能 |
インストールされているパッケージのバージョンを最新にしておく
$ 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 -)から下記コマンドを入力する
$ amazon-linux-extras install -y epel
2.2.必須のパッケージ3つをインストールする
$ yum -y install freeradius freeradius-utils google-authenticator
3.RADIUSサーバ(EC2)で利用する事前設定
設定するもの | 内容 |
---|---|
グループ作成 | RADIUS経由の認証を許可するためのグループ作成 |
ホスト名設定 | google-authenticator で登録する際に利用のため作成 |
※グループに所属するユーザは後述「5.RADIUSサーバで認証するユーザの設定」で登録をしていきます
3.1.RADIUS経由の認証を許可するグループの作成
$ groupadd radius-enabled
下記コマンドでグループが作成されているかを確認できる
$ cat /etc/group | grep radius-enabled
3.2.ホスト名設定
$ hostnamectl set-hostname radius.(ドメイン名)
↓
(例)
$ hostnamectl set-hostname radius.mfa.example
下記コマンドでホスト名を確認できる
$ hostnamectl
3.3.hostsファイルに記載
$ vi /etc/hosts
vi の インサートモードで自身のプライベートIPアドレス、3.2.ホスト名設定で入力したドメイン名を最終行に追加する
自身のプライベート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ユーザで動作させるため設定を下記のように変更します
$ vi /etc/raddb/radiusd.conf
変更前
user = radiusd
group = radiusd
変更後
user = root
group = root
4.2.clients.confの編集
RADIUSサーバがプロトコルを受け付けるRADIUSクライアント(「ざっくりRADIUSとは」の図におけるAD Connecter部分)の設定をします
$ vi /etc/raddb/clients.conf
末尾にRADIUSクライアントのIPアドレスレンジ、secret(今回はスコープ外になるDirectoryServiceとの連携に必要となるシークレットコード)をに入力する
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認証されるように設定
$ vi /etc/raddb/users
末尾に追加する内容
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
PAMを利用するため/etc/raddb/sites-available/default
ファイルの変更
$ vi /etc/raddb/sites-available/default
変更前
# Pluggable Authentication Modules.
# pam
変更後
# Pluggable Authentication Modules.
pam
4.5.GoogleAuthenticator利用設定
RADIUS認証の際に、GoogoleAuthenticatorが使われるよう設定を変更及び追記
$ vi /etc/pam.d/radiusd
変更後
・既存で記述されている部分をコメントアウトに変更する(2-6行目)
・認証の際に、GoogoleAuthenticator利用の旨を追記する(7-9行目)
#%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モジュール)を有効化するため、シンボリックリンクを追加する
$ ln -s /etc/raddb/mods-available/pam /etc/raddb/mods-enabled/pam
4.7 RADIUSサーバを起動
# サービスの自動起動を設定
$ systemctl enable radiusd
# サービスの起動
$ systemctl start radiusd
# サービスの状態確認
$ systemctl status radiusd
サービスが正常に起動している際のプロンプト画面
5.RADIUSサーバで認証するユーザの設定
5.1 RADIUSサーバで認証するユーザを登録
$ useradd -g radius-enabled (ユーザー名)
追加したユーザ権限で、google-authenticatorを起動する
$ 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コード画面を表示させる
各手持ちのデバイスで上記QRコードを読み取り、ワンタイムパスワードを発行する
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 の利用
URL:【APN Ambassadors ブログシリーズ第三弾】Amazon WorkSpaces で多要素認証(MFA)を利用する場合でもユーザは AD だけで管理したい
URL:Serverworks RADIUSサーバーを構築して、WorkSpacesを多要素認証で運用する