DuoでAWSに2段階認証でシングルサインオンしてみた

まいど、大阪の市田です。
今回は「Duo Security」 というサービスを使って、AWSへのシングルサインオン(SSO)に2段階認証を実装してみたいと思います。

The Trusted Access Company: Duo Security

背景

ここ数年で、クラウドを始めとした様々なサービスが登場したことで、ユーザは異なるサービスやアプリケーションで個別のパスワードを利用することになり、それらのパスワード管理という課題も発生してきました。

そこで、SSOを利用することでパスワード管理を効率化しようという動きが出てきましたが、その一方で、プライマリのパスワードが漏洩した場合、攻撃者によって複数のリソースにアクセスされてしまうという問題が新たに出てきました。

これを2段階認証を利用して保護することが、今回の目的になります。

Duo Securityとは?

「Duo Security(略してDuo)」 は「AWS」や「Cisco SSL VPN」など多くのアプリケーションに対して2段階認証を利用することができるサービスです。携帯電話やPCなど様々なデバイスからアクセスすることが可能です。

利用できる機能に応じて料金体系が決まっていて、フリープランも存在します。プラン内容と料金については下記ページをご確認下さい。

Pricing: Duo Security

今回は30日間無料のトライアルアカウントを作って検証しました。作り方は後で説明致します。

仕組み

まず、オンプレ環境にDuoのSSO製品である「Duo Access Gateway(DAG)」 というものを用意します。
「Duo for AD FS」というものを使うことでAD FSを利用することもできますが、今回は「Duo Access Gateway」を使ってみたいと思います。
(単に「Duo for AD FS」の存在を最初に知らなかっただけなので、時間のある時にこちらも試してみたいと思います。)

Duo Access Gatewayは、SAML(2.0)認証を利用して、Active DirectoryやGoogle Apps等の既存のディレクトリ情報でAWS等のクラウドサービスへのアクセスを保護することが出来るます。今回はActive Directoryを想定して検証してみました。

仕組みの詳細については下記ドキュメントをご確認頂くことにして、ここでは実際に「やってみた」内容を説明させて頂こうと思います。

Duo Protection for Amazon Web Services (AWS): Duo Security

今回の構成

今回の検証構成は下記の通りです。Duo Access GatewayによりActive Directoryの認証を通してAWSにアクセスします。

ドキュメントでは、Duo Access GatewayとActive Directoryはオンプレ環境を想定していますが、オンプレでこれらを用意することができなかったので、AWS上に作成して、これらをオンプレにあるものと仮定して試しました。

dialog

ちなみに、今回は検証目的なのでAWS料金を節約する為に、Active Directory(ドメインコントローラ)とDuo Access Gatewayは同じインスタンスに作成しています。

検証の流れ

検証の主な流れです。

  • Duoのモバイルアプリのインストール
  • Duoにアカウントを登録
  • Active Directory(ドメインコントローラ)の構築
  • Duo Access Gatewayの構築
  • AWS設定
  • 動作確認

ややボリュームが多いですが、早速見ていきましょう。

モバイルアプリのインストール

Duoは「Duo Mobile」 というiPhone、Android用のスマホアプリを公開しています。今回はこのアプリを使ってAWSへ2段階認証を行ってみたいと思います。
ちなみに、モバイルアプリが利用できなくても、SMSを利用した2段階認証が利用可能です。場合に応じて使い分けて頂ければと思います。

モバイルアプリのインストールは特に変わった点はありません。iPhoneならApp Storeで「Duo Mobile」で検索してインストールしておきましょう。

100_duo_mobile

アカウント登録

次にDuoのトライアルアカウントを登録します。
下記のURLにアクセスして「Start Trial」 をクリックします。

Create Your Duo Account

01-duotop

名前、メールアドレス、電話番号や会社名などを入力して「Create My Account」 をクリックして下さい。これでアカウントの作成は完了です。

02-registaccount

続いてアカウント設定です。
Step1で、Duo管理画面にログインする為のパスワードを設定します。

03-password

Step2で、モバイルアプリの「Duo Mobile」をアクティベートします。モバイルアプリを利用できない場合は「Skip this step」をクリックしてスキップして下さい。

04-duomfa

モバイルアプリが利用可能なら、上記のQRコードをアプリでスキャンして下さい。

101_duomobile-addaccount

正常にスキャン出来たら、下記のようにQRコードがクリアされるので「Continue」 をクリックします。

50-duo-activate-duomobile

モバイルアプリを利用せずに、この画面をスキップした場合は携帯電話の電話番号を入力する画面になります。その場合はSMSか電話で送られてくる6桁のログインコードを入力してDuo管理画面にログインします。

SMSだと下記のような感じでログインコードが送られてきます。(今回はモバイルアプリの利用を想定しているので詳細は割愛させて頂きます。)

102_sms_logincode

QRコードをスキャンできると、Step3でバックアップ設定の為に電話番号の入力を求められるので、携帯電話の番号を入力して「Finish」 をクリックして下さい。

51-account-setup-backup

セットアップが完了するとログイン画面に遷移します。
ログイン認証の種類が3種類選べますが「Duo Push」 がモバイルアプリを利用する認証です。「Text me」はSMSでパスコードが送られてきます。「Call me」は電話で送られてきます。

52-account-setup-finish

「Duo Push」 をクリックすると、モバイルアプリにリクエスト通知が来るのでタップしてください。

103-duomobile-request

「Approve」 を選んで許可します。

104-choose-request

許可するとDuoの管理画面にログインすることが出来ました。

53-loggined

とりあえずDuoの管理画面にログインできる事まで確認して下さい。
次からは他の作業をおこないますので、Duoの管理画面はしばらく触りません。

Active Directoryの構築

次に、Duo Access Gatewayの認証元として利用するActive Directory(ドメインコントローラ)を構築します。
Duo Access GatewayはActive Directoryの他にもOpenLDAP等もサポートしていますので、環境に応じて選択して下さい。詳細は下記のドキュメントに記載されています。

Duo Access Gateway for Windows: Duo Security

Active Directory環境の作成について、特別な事はしていないので具体的な構築手順は割愛しますが、今回は「Windows Server 2012R2」を利用しました。 検証用のドメインとユーザを下記のように設定しています。

まず、LDAPクエリが実行できるユーザを作成します。適当なものを作成してください。

  • ドメイン:duotest.local
  • ユーザ:cmadmin
    • AD認証の為の管理ユーザーとして作成

次にSSOログインするユーザを作成します。今回は検証用途なので上記ユーザと同一でもよいかと思います。

  • ドメイン:duotest.local
  • ユーザ:cmuser01
    • 所属グループ:DAG-AWS-Admins
    • メールアドレス:必須(認証にMail属性を利用する為)

後ほど、AWSでIAM roleを作成しますが、上記のユーザの所属グループは、このIAM Roleと同じ名称にしなければいけないことに注意してください。 また、AWSにアクセスさせたいユーザは、このグループに所属させる必要があります。

60-ad-users

60-2-user-account

61-ad-users-group

Duo Access Gatewayの構築

ここからは、Duo Access Gateway(DAG)の構築を行います。

Duo Access GatewayはWindowsの他にLinuxも選択できますが、今回は費用節約の為にActive Directoryと同じインスタンスを利用するので、Windows版の手順で構築していきます。

尚、Linux版のドキュメントは下記になります。Dockerを利用した手順です。

EC2のインスタンスサイズ等は必要とされる要件に基づき下記の通りとしました。

  • インスタンスサイズ:t2.medium
  • EBS:60GB
  • OS:Windows Server 2012R2
    • AMIは「Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2017.07.13」を利用

それでは作っていきたいと思います。

IISのインストール

Duo Access Gatewayの操作はブラウザで行うので、IISをインストールします。
PowerShellを管理者として起動 して、下記のコマンドレットを実行します。

import-module servermanagerServer

次にDuo Access Gatewayのインストーラに必要なコンポーネントをインストールします。

add-windowsfeature Web-Server, Web-Mgmt-Tools, Web-CGI, NET-Framework-Core, Web-Asp-Net45, Web-Scripting-Tools

ここで一旦サーバを再起動して下さい。

必要なソフトウェアのインストール

Duo Access Gatewayのインストールには「Visual Studio 2015 の Visual C++ 再頒布可能パッケージ」が必要になるので、無ければインストールして下さい。
私の環境ではインストール済みでしたので、スキップしました。

Update for Universal C Runtime in Windows

次にPHP環境が必要なので、必要とされるバージョンのZIPを下記からダウンロードします。インストーラが解凍とインストールをやってくれるので、ZIPファイルを適当なフォルダにダウンロードしておくだけでOKです。

SSL証明書の入手

AWSからDuo Access Gatewayへのアクセスには、HTTPSでFQDNが利用されるのでサーバ証明書が必要になります。その為、独自ドメインも必要になるので、予め準備しておいて下さい。

証明書の種類は特に問われないようなので、今回は「Let's Encrypt」 を使って証明書を作成しました。 ELBを挟んでACMを利用する構成にしてもいいかと思いますが、Linux版の場合、Duo Access Gatewayに証明書と秘密鍵を登録する必要があるので注意して下さい。

証明書の取得ができたらIISでHTTPSのバインドを追加します。
難しい作業ではないので具体的な手順は省略させて頂きます。尚、IISの設定はHTTPSのバインド設定以外はデフォルトのまま使っています。

Let's EncryptでIIS上にSSLサイトを導入する方法(無料)

具体的な作業は割愛させて頂きましたが、ここまでの作業でDuo Access GatewayのURLに対して、HTTPSでIISのページが表示されていればOKです。

Duo Access Gateway(DAG)のインストール

インストール自体は、下記のインストーラを実行するだけで非常に簡単です。

ドキュメントにある通りで全く問題ないのでスクリーンショットなどは割愛させて頂きます。途中でPHPのZIPファイルを指定する必要がありますが、特に難しいことはないと思います。
最後にDuo Access Gatewayにアクセス可能なIPアドレスを指定します。ここは適宜設定して下さい。

Duo Access Gateway(DAG)にログオン

インストールが完了したら、次の形式のURLで管理コンソールにアクセスします。

正常にアクセスできれば下記のような画面になります。最初にログオン用のパスワードを設定して下さい。

14-duo-access-gateway

Welcome画面が出ればログオン成功です。

15-duo-agw-welcome

Authentication Sourceの設定

次に、Duo Access Gateway上で認証元の設定を行います。
今回はActive Directoryを利用するので、事前に作成した内容に応じて設定していきます。

Duo Access Gatewayの画面で「Authentication Source」 をクリックして設定画面に移動します。設定前は「Set Active Source」のプルダウンは何も存在せず操作できないですが、気にしないでください。

70-dag-set-auth-source

画面をスクロールして、「Configure Sources」 の各項目を下記のように設定します。下記は設定済みの為に「Status」が正常になっています。最初は「Not Configured」 と表示されていますが気にしないでください。

71-dag-configure-sources

今回の構成に関する説明を表にしてみました。各項目の詳細な説明は公式のドキュメントを参照してください。

Duo Access Gateway for Windows: Duo Security

項目名 設定内容 備考
Source Type Acitive Directory -
Server ldap://localhost ドメインコントローラのホスト名またはIPアドレスです。DAGと同じホストの為localhostとしました。カンマ区切りで複数指定可能です。
Port 389 Active Directoryと通信するためのポート指定(TCP)です。適宜設定して下さい。
Transport type CLEAR DAGとActive Directoryが同じホストの為、CLEARにしています。
Attributes distinguishedName,mail,sAMAccountName,userPrincipalName SSOログインに必要なADユーザの属性を指定します。対象のサービスに応じて指定するものが異なります。指定する属性についてはサービスプロバイダのマニュアルを参照して下さい。標準で対応するものについては、Duoのドキュメントに記載があります。今回はAWS用の属性を指定しています。
Search base DC=duotest,DC=local ユーザやグループを検索するパスを指定します。
Search Attributes distinguishedName,mail,sAMAccountName,userPrincipalName クラウドサービスのSSOユーザー名と一致するAD属性を入力します。こちらもDuoのドキュメントに記載のAWS用の内容を設定しています。
Search username duotest\cmadmin ADにLDAPクエリを実行できるユーザ名を指定します。
Search password cmadminのパスワード 上記ユーザ名のアカウントのパスワードを指定します。

AWS Protection設定

ようやくAWSとの連携に関する設定までたどり着きました。もう少しで完了です。
ここから行う作業は以下になります。書いてみると意外とたくさんありますが、頑張って行きましょう。

  • Duo Access Gateway上でAWS側に提供するデータのダウンロード
  • AWSへのSSOの有効化
    • AWS上でIDプロバイダを作成
    • IAM Roleの作成
  • Duo管理コンソールでプロテクト対象の設定
  • Duo Access Gateway上で対象AWS環境の設定投入

AWSへの提供データのダウンロード

Duo Access Gateway上でAWS側に渡すためのメタデータファイルをダウンロードします。メニューから「Applications」 をクリックします。

72-dag-applications

画面下側にある「Metadata」 の箇所から「Download XML metadata」 というリンクをクリックしてxmlファイル(dag.xml)をダウンロードします。

73-application-metadata

SAML IDプロバイダーの作成

次にAWS側でSAML IDプロバイダーを作成します。
AWSのIAMのマネジメントコンソールで「Identity providers」 をクリックします。移動できたら「Create Provider」 をクリックします。

74-idprovider

下記のように設定します。名称は適当なものにして下さい。Metadataは先程ダウンロードしたXMLファイルをアップロードします。

75-config-provider

次にIAM Roleを作成します。最終的にここで指定した権限でAWSにアクセスされる事になります。

76-create-role

ロールタイプは「Role for Identity Provider Access」 を選択して、更に「Grant Web Single Sign-On (WebSSO) access to SAML providers」 を選んで下さい。

77-select-type

プロバイダは先程作成したものを選択します。

78-select-provider

次の「trust relationship」はそのままで構いません。

79-verify-trust

ポリシーは必要なものをアタッチして下さい。今回はドキュメントと同じように「AdministratorAccess」 にしました。

80-attach-policy

ロール名はActive Directoryで作成したグループ名と同じものにして下さい。 今回の場合だと「DAG-AWS-Admins」です。

81-set-role-name

Duo管理コンソールでプロテクト対象の設定

久しぶりにDuoの管理コンソールで作業を行います。(Duo Access Gatewayではないことに注意しましょう)

管理画面上で「Applications」 をクリックしてから「Protect an Application」 をクリックします。

54-protect-application

「amazon」で検索して「Protect this Application」 をクリックします。

55-search-amazon

アクセス対象のAWSアカウントIDを入力して保存します。

56-configure-awsapp

保存できたら、Duo Access Gatewayに設定するためのJSONファイルがダウンロードできるようになっています。「Download your configuration file」 をクリックして保存しておきましょう。

58-download-config-aws

Duo Access GatewayにAWSアプリケーションの追加

最後の手順です。
先程ダウンロードしたJSONファイルをDuo Access Gatewayの管理画面からアップロードします。

150-add-dag-app-aws

これでDuo Access Gateway側にAWS SAMLアプリケーションが追加されました。この画面にある「Login URL」 からAWSにアクセスします。

151-dag-app-aws

ログインURLは下記のような形です。

https://your-server/dag/saml2/idp/SSOService.php?spentityid=DIXXXXXXXXXXXXXXXXX

AWSにDuo Access Gateway経由でログインしてみる

アカウント初期設定

先程のURLにアクセスしてログインしたいユーザ情報を入力します。ここで入力するユーザ情報はActive Directoryで管理しているものになります。

19-ssologgin

初回アクセス時は下記のような画面になり、アクセス方法の設定を行います。

20-ssologin

2段階認証に利用するデバイス種類を選択します。今回はスマホを使うので「Mobile phone」 を選択します。

21-ssologin-type

電話番号を入力します。

22-ssologin-phonenumber

スマホの種類を選択します。適宜選択して下さい。

23-2-ssologin-phone-type

DuoのiOS向けのスマホアプリをインストールします。今回はインストール済みなので何もせずに「I have 〜」 をクリックして進めました。

23-3-ssologin-duo-mobile

QRコードが表示されるのでスマホアプリでスキャンします。

23-4-activate-duo-mobile

スマホアプリで「+」をクリックしてスキャンします。

23-4-2-scan-qr

スキャンできたらAWSアクセス用のアカウントが追加されます。

23-4-3-ok-scan

ブラウザ側では下記のようにモバイルのアクティベートが完了した表示になります。

23-5-activated

ここまでで全ての対応が完了しました。「Continue to Login」 をクリックしてAWSにサインインしてみます。

23-6-continue-login

次回以降は下記の画面からアクセスすることになります。モバイルアプリで認証するので「Duo Push」の「Send Me a Push」 をクリックします。

モバイルアプリが利用できない場合は「Passcode」を選択すると、登録した電話番号宛に6桁のパスコードが送られてくるので、そのパスコードを入力してサインインします。

23-7-choose-auth-method

モバイルアプリ側にリクエストのプッシュ通知が来るので、緑色のバーをタップして承認します。

23-8-2-request-mobile

承認するので「Approve」 をタップします。

23-8-3-approve-request

マネジメントコンソールにサインインできました!

23-9-loggined-aws

最後に

記事にしてみると長くなってしまいましたが、実際の作業としてはそんなに時間がかかるものではないと思います。
Duoが標準で対応しているクラウドサービスであれば、簡単に「SSO + 2段階認証」の環境を作ることができるので、是非ご検討頂ければと思います。

また、WordpressやOpenVPN等にも簡単に2段階認証を設定することもできるので、こちらも機会があればご紹介したいと思います。

以上です。