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


この記事は公開されてから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を多要素認証で運用する

Last modified: 2022-10-13

Author