« 2014年10月のAWS Black Belt Tech Webinarのご案内 | メイン | 2014年11月のAWS Black Belt Tech Webinarのご案内 »

Google Authenticator を使って Amazon WorkSpaces に多要素認証ログイン

Google Authenticator を使って Amazon WorkSpaces に多要素認証ログイン

ソリューションアーキテクトの辻 (@tsuzy_) です。

8/26 に東京リージョンで Amazon WorkSpaces が使えるようになりました。さらに少し前の 8/11 には、WorkSpaces で Multi-Factor Authentication (多要素認証:MFA) が使えるようになっています(紹介Blog記事)。WorkSpaces は操作端末にはデータが保管されないなどセキュアな環境を実現できるサービスですが、MFA によりさらにセキュアに使って頂けるようになりました。

MFA というのは、本人確認(認証)する方法として複数の手段を使う事です。認証にパスワードを使用する事が多いかと思いますが、これは本人だけが知っているはずの情報を確認して、認証を行います。MFA を使用する場合は、このパスワードに加えてトークン等が生成するワンタイムパスワード(OTP)も確認する事で、本人しか持っていないはずのトークン(物)も持っている事を確認して認証できます。

WorkSpaces での認証は、フルマネージド型のディレクトリサービスである WorkSpaces Cloud Directory で行うか、既存の Active Directory で認証するための WorkSpaces Connect が選べます。MFA は後者の WorkSpaces Connect を利用する場合にご利用頂けるようになっています。お客様は MFA で使用するワンタイムパスワードを認証できる RADIUS サーバを別途用意する必要があります。RADIUS サーバはオンプレミスにあっても、AWS 上にあっても構いません。現在お使いの MFA ソリューションがそのまま使える可能性もあります。

今日は、WorkSpaces の MFA をオープンソースのソフトウェアのみを利用して、無料で実現できる方法を手順も含め紹介します。

IAM アカウントでの MFA のように、ワンタイムパスワードを生成するトークンにはスマホアプリの Google Authenticator を使用します。RADIUS サーバには FreeRADIUS を使用します。


ユーザから見た認証の流れ

ユーザ名・パスワードを入力します。

ユーザ名・パスワードの入力

スマホアプリ Google Authenticator を見てワンタイムパスワードである6桁の数値を入力します。数字は30秒ごとに新しく生成され、それまでの数値は無効になります。

OTP の入力 Google Authenticatorの画面

RADIUS サーバ構成

今回は以下のソフトを利用しています。

FreeRADIUS と Google Authenticator を繋いでいるのが、Linux の PAM (Pluggable Authentication Modules) という仕組みです。FreeRADIUS は RADIUS プロトコルで確認依頼があったワンタイムパスワードを OS に投げると、PAM 側の仕組みで Google Authenticator の PAM モジュールに連携されて正しいワンタイムパスワードか確認できます。

RADIUSサーバ構成

RADIUS サーバ構築手順

1. 環境の確認

既に以下の環境となっている事を確認して下さい。

  • WorkSpaces 環境が構築済みで、利用するディレクトリは WorkSpces Connect となっている。
  • 既に Active Directory のユーザで WorkSpace にログインできるようになっている。

2. EC2 インスタンスの作成

EC2 インスタンスを Amazon Linux で起動します。

  • WorkSpaces と同じ VPC 内に作成して下さい
  • WorkSpaces Connect が VPC 内に作成するコントローラから RADIUS で通信できるようにして下さい (セキュリティグループ d-XXXXXX_controllers から UDP 1812 ポートを許可)
  • パッチ適用、RPM パッケージがインストールできるようにして下さい
  • 管理者が SSH で接続できるようにして下さい

3. 必要なパッケージのインストール

EC2 インスタンスにSSHを使って ec2-user でログインして、以下のコマンドを実行します。(残りの手順も同様に ec2-user で実行して下さい。)

sudo yum -y update
sudo yum -y install freeradius freeradius-utils git gcc pam-devel \
qrencode qrencode-libs qrencode-devel

4. Google Authenticator をソースからインストール

git clone https://code.google.com/p/google-authenticator/  
cd google-authenticator/libpam/  
make  
sudo make install  

5. OS設定

RADIUS 経由の認証を許可するグループを作成します。また、スマホアプリ Google Authenticator では登録内容の説明として「ユーザ名@ホスト名」が表示されるため、ホスト名には分かりやすい名前を付けておきます。
※設定内容は環境に応じて必ず変更するようにして下さい。 「hogehoge.example.com」にはホスト名を指定して下さい。DNS サーバ等で名前解決できる必要はありません。「172.31.XX.XX」には構築している EC2 インスタンスのプライベート IP アドレスを指定して下さい。

sudo groupadd radius-enabled

/etc/sysconfig/network を以下の通り変更(差分を diff -u 形式で記載)

--- /etc/sysconfig/network.def     2014-06-11 16:53:44.990251299 +0000
+++ /etc/sysconfig/network     2014-09-01 00:00:00.000000000 +0000
@@ -1,5 +1,5 @@
 NETWORKING=yes
-HOSTNAME=localhost.localdomain
+HOSTNAME=hogehoge.example.com
 NOZEROCONF=yes
 NETWORKING_IPV6=no
 IPV6INIT=no

/etc/hosts を以下の通り変更(差分を diff -u 形式で記載)

-- /etc/hosts.def     2014-06-11 16:53:44.990251299 +0000
+++ /etc/hosts     2014-09-01 00:00:00.000000000 +0000
@@ -1 +1,2 @@
 127.0.0.1   localhost localhost.localdomain
+172.31.XX.XX   hogehoge.example.com

6. FreeRADIUS を設定

PAMを使って認証を行うため、rootユーザーで動作させる必要があります。設定を変更して、rootユーザーで起動するように変更を行います。

/etc/raddb/radiusd.conf を以下の通り変更(差分を diff -u 形式で記載)

--- /etc/raddb/radiusd.conf.def     2014-02-24 16:55:07.000000000 +0000
+++ /etc/raddb/radiusd.conf     2014-09-01 00:00:00.000000000 +0000
@@ -164,8 +164,8 @@
 #  It will join all groups where "user" is a member.  This can allow
 #  for some finer-grained access controls.
 #
-user = radiusd
-group = radiusd
+user = root
+group = root

 #  max_request_time: The maximum time (in seconds) to handle a request.
 #

PAM を使うように設定します。

/etc/raddb/users を以下の通り変更(差分を diff -u 形式で記載)

--- /etc/raddb/users.def    2014-02-24 16:55:02.000000000 +0000
+++ /etc/raddb/users    2014-09-01 00:00:00.000000000 +0000
@@ -67,6 +67,9 @@
 #DEFAULT   Group == "disabled", Auth-Type := Reject
 #      Reply-Message = "Your account has been disabled."
 #
+DEFAULT    Group != "radius-enabled", Auth-Type := Reject
+       Reply-Message = "Your account has been disabled."
+DEFAULT        Auth-Type := PAM

 #
 # This is a complete entry for "steve". Note that there is no Fall-Through

/etc/raddb/sites-available/default を以下の通り変更(差分を diff -u 形式で記載)

--- /etc/raddb/sites-available/default.def     2014-02-24 16:55:03.000000000 +0000
+++ /etc/raddb/sites-available/default     2014-09-01 00:00:00.000000000 +0000
@@ -281,7 +281,7 @@

      #
      #  Pluggable Authentication Modules.
-#     pam
+     pam

      #
      #  See 'man getpwent' for information on how the 'unix'

FreeRADIUS が PAM で認証する際に、Google Authenticator の PAM モジュールを使うように設定します。

/etc/pam.d/radiusd を以下の通り変更(差分を diff -u 形式で記載)

--- /etc/pam.d/radiusd.def     2014-02-24 16:55:07.000000000 +0000
+++ /etc/pam.d/radiusd     2014-09-01 00:00:00.000000000 +0000
@@ -1,6 +1,10 @@
 #%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       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

FreeRADIUS が RADIUS プロトコルでの接続を受け付けるサブネットと接続パスワードを設定します。
※設定内容は環境に応じて必ず変更するようにして下さい。「172.31.0.0/16」としている部分は実際にお使いの VPC ネットワークアドレス等を指定して下さい。「XXXXXXXX」は複雑なパスワードを生成して指定して下さい。

/etc/raddb/clients.conf を以下の通り変更(差分を diff -u 形式で記載)

--- /etc/raddb/clients.conf.def     2014-02-24 16:55:02.000000000 +0000
+++ /etc/raddb/clients.conf     2014-09-01 00:00:00.000000000 +0000
@@ -232,3 +232,7 @@
 #          secret = testing123
 #        }
 #}
+client 172.31.0.0/16 {
+        secret          = XXXXXXXX
+        shortname       = from-vpc
+}

7. FreeRADIUS を起動

sudo chkconfig --level 345 radiusd on
sudo /etc/init.d/radiusd start

ユーザ登録手順

Google Authenticator の PAM モジュールを使う場合は、Active Directory と同名のユーザを作成した上で、Google Authenticatorのユーザ設定を行う必要があります。
※「user001」には実際のユーザ名を指定して下さい。

useradd -g radius-enabled user001
sudo -u user001 /usr/local/bin/google-authenticator

コマンドを実行すると、以下の通り幾つか英語で質問が表示されます。全てに y と入力して下さい。コンソール上に表示された QR コードや最初の質問の後に表示される URL をブラウザで開くと表示される QR コードをスマホアプリの Google Authenticator でスキャンして登録して下さい。

  • Do you want authentication tokens to be time-based (y/n)
    (時刻ベースの認証トークンを使用しますか?)
    → y
  • Do you want me to update your "/home/XXXXXX/.google_authenticator" file (y/n)
    ("/home/XXXXXX/.google_authenticator" ファイルを更新しますか? ※更新しなければ表示されているQRコードでログインできません。)
    → y
  • Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n)
    (同じ認証トークンを複数回利用するのを禁止しますか?この制限により、30秒に1回しかログインできなくなりますが、中間者攻撃に気づいたり禁止できる可能性が高まります。)
    → y
  • By default, tokens are good for 30 seconds and in order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of 1:30min to about 4min. Do you want to do so (y/n)
    (デフォルトでは、トークンは30秒ごとになっており、クライアントとサーバの時刻がずれていても対応できるように、現在時刻より1つ前や後のトークンでも許可します。もし、時刻同期の状況が悪く問題があれば、デフォルトの1分半のウィンドウを約4分まで広げることができます。行いますか?)
    → y
  • If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting (y/n)
    (ログインするコンピュータが総当たり攻撃に対して保護されていなければ、認証モジュールで回数制限を行うことができます。この制限ではデフォルトで30秒に3回より多くログインを試すことができないよう制限します。回数制限を実施しますか?)
    → y

google-authenticatorコマンドの結果画面

ユーザその他対応手順

複数台登録 : 同じ QR コードを複数のスマートフォンで登録する事で実現できます。後から追加する場合は、各ユーザのホームディレクトリ直下にある .google_authenticator ファイルに先頭行にある内容が登録に必要なシークレット情報ですので、これを手入力でスマホアプリの Google Authenticator に登録するか、QR コードを生成して読み込ませます。

スマホ紛失時 : 各ユーザのホームディレクトリ直下にある .google_authenticator ファイル削除して下さい。これでワンタイムパスワードが使えなくなります。ファイル名を変えておくことでアクセスが出来なくなるため、スマートフォンを紛失した際にはまずファイルのリネームを行うという運用も良いかと思います。

RADIUS サーバテスト手順

セットアップができた RADIUS サーバを WorkSpaces から使う前に、単体で認証テストを行っておきましょう。 ※「user001」には実際のユーザ名を指定して下さい。「123456」にはスマホアプリの Google Authenticator で表示されたワンタイムパスワードを入力して下さい。「172.31.XX.XX」には RADIUS サーバのプライベート IP を入力して下さい。「XXXXXXXXXXXX」には /etc/raddb/clients.conf に設定したパスワードを入力して下さい。

radtest user001 123456 172.31.XX.XX:1812 10 XXXXXXXXXXXX

WorkSpaces Connect の設定

WorkSpaces Connect を RADIUS サーバを参照するように設定します。AWS Management Console の WorkSpaces を開きます。対象のディレクトリを選択し、[Actions] ボタンをクリックし、[Update Details] を選択します。

Update Details

[Multi-Factor Authentication] をクリックして、設定内容を開きます。以下のように設定し、[Update and Exit] をクリックします。後ほど再度この画面を開き、[RADISU Status] が [Complete] になっている事を確認します。

  • Enable Multi-Factor Authentication: チェックボックスをオンに
  • RADIUS server IP address(es): 構築した RADIUS サーバのプライベート IP アドレスを入力
  • Port: 1812 を入力
  • Shared secret code: /etc/raddb/clients.conf に設定したパスワードを入力
  • Confirm shared secret code: 同上
  • Protocol: PAP を選択
  • Server timeout (in seconds): 例 10
  • Max retries: 例 3

Update Details

導入にあたって気をつけるポイント

  • RADIUS サーバが止まると認証が行えなくなるため、必要に応じて関し運用や冗長化をご検討下さい。
  • 手順の通りですが、ユーザごとにコマンドライン操作や QR コードのスキャンが必要です。
  • WorkSpaces Connect ご利用時のみ、MFA を利用できます。(現状)
  • WorkSpaces では、MFA を有効すると全ユーザで MFA が必須になります。(現状)

冗長構成にする場合のポイント

  • RADIUS サーバを同一構成で 2 台作成して、WorkSpces Connect のディレクトリ設定で RADIUS サーバの IP アドレスを 2 個入力して下さい。
  • OS へのユーザ登録、各ユーザのホームディレクトリ直下にある .google_authenticator が、構築後ユーザ登録する度にサーバ間の差異となります。ユーザ登録は両方のサーバでコマンドを実行して差が無いようにして、.google_authenticator ファイルはサーバ間でコピーします。

訂正

2014.10.12 Security Groupで許可する通信をTCP 1812としていましたが、正しくはUDP 1812でした。

参考

コメント

Twitter, Facebook

このブログの最新情報はTwitterFacebookでもお知らせしています。お気軽にフォローください。

2018年4 月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30