AWS マネージメントコンソール を AzureAD で SSO してみる

# はじめに
[mediba advent calendar 2016](http://qiita.com/advent-calendar/2016/mediba) 九日目担当の @mediba_t-sato  です。
情報システム部に所属しており社内インフラを担当しています。

情報システム部の昨今の課題といえば、ログインが必要な社内/外のシステムの爆発的な増加です。

これらの管理の煩雑さや情報漏えいリスクを軽減するため mediba ではシングルサインオン(SSO) 基盤の検討をしています。今回は検証中ではありますが、一部運用を開始している Azure Active Directory の IDaaS (ここで上げている AzureAD 以外にも OneLogin、Okta、PingFederation など) による SSO の検証を公開してみたいと思います。

# なぜ SSO が必要なのか？
**各クラウドサービスはそれぞれユーザ名/パスワードがあります。** まぁ当たり前ですね。
しかし、これら各サービスのユーザ名/パスワードを適切に管理するのは非常に困難です。

- 定期的にパスワードを変更する
- ユーザの死活を管理する
- 複数のサービスで同じパスワードを利用しない

上記 3 つは古くから言われている安全に運用するための必要な行為ですが、利用するサービスが増えていった場合、確実に実行することは困難になっていきます。

## SSO による一本化
SSO は一つの ID（日常的に利用している PC のログインアカウントや、メールアドレス）を利用して、アカウント認証元にログインすることで、各サービスを利用することができる機能です。また、SSO や ID 連携に対応しているサービスであれば、一回の認証で全てのサービスへのログインが可能となります。
また、一つの ID の死活を管理者が管理することで芋づる式にサービスの利用可否を制御することができます。
このため SSO 化することはアカウント管理側にもサービスを利用するユーザ側にもメリットがあるといえます。

mediba の情報システム部では新クラウドサービスの全社導入時の検討材料に SSO の可否も盛り込んでいます。

## AzureAD にした理由
IDaaS を幾つか検討をした結果 AzureAD Premium を選択しています。OneLogin なども検討したのですが、下記の理由により AzureAD を利用することにしました。
- ADFS がとてつもなくめんどくさい。
- Office 365 に付いてきた。
- 社内で Active Directory ドメイン サービスを利用している。
特に ADFS を自前で構築した場合、冗長性、セキュリティ、証明書管理など構築から稼動までにかかるコストが必要となり、コストやリソースをカットし、実稼動までに一日もあれば実現できるという気軽さが最大のメリットでした。

それでは、早速構築してみましょう。

# 今回実現すること
AWS の IAM にユーザを作らずにロールのみで利用シチュエーションに応じたアクセス許可を実現してみたいと思います。

ユーザには AWS マネージメントコンソールにアクセスする際に、社内の Active Directory アカウントでのログインが求められ、アカウントの応じた適切なアクセス許可が割り当てられます。
当然、社内の Active Directory でユーザのアカウントの停止をすれば、ユーザは AWS へログインすることが出来なくなります。
また、AzureAD 側で AWS の接続権限を変更することで、一元的に各機能へのアクセス許可を変更することが可能になります。
AWS のマネージメントコンソールを数十人が利用する可能性がある場合、検討の余地があるかと思います。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/148739/e6d44a1c-5962-1ce4-2caf-390526921c29.png)

また、AzureAD は MFA(多要素認証)にも対応しているため、重要な権限を持つロールについては多要素認証を追加することも可能ですが、今回は割愛します。

今回は S3 のみ触るので、S3FullAccess のみに限られた権限と、AdministratorAccess の権限を使い分けてみたいと思います。

# 環境
## 必要なもの
- AzureAD Premium
 - Office 365 についてくる Azure AD Free 版でも可。
 - Office のエディションによっては Azure AD Premium が付いてきます。

以上。
Azure AD Premium を利用したほうが、SSO 連携のアプリを無制限に登録することができます。(Free 版は 10 個まで)もっと詳しく知りたい人は、こちらのリンクからご確認ください。
参考：[Azure Active Directory のエディション](https://docs.microsoft.com/ja-jp/azure/active-directory/active-directory-editions)

## あったら便利なもの
- Windows Server 2012 R2（オンプレ）
 - Active Directory ドメイン サービスを利用いる場合、社内のアカウント管理と同期させたほうが利便性はぐっとあがります。

今回は、社内の Active Directory ドメイン サービス と AzureAD をシンクさせ、ドメインログインアカウントを利用して、SSO を実現を試します。

# 準備
## AzureAD と社内の Active Directory ドメイン サービスとのアカウント同期
AzureAD とオンプレのアカウントの同期は非常に簡単です。
ほとんどの場合、ドメインコントローラーに AzureAD Connect をセットアップするだけで完了します。
また、Office 365 をドメインログインアカウントを利用する場合、これらの作業で前準備は完結しています。
参考：[Office 365 のディレクトリ同期をセットアップする](https://support.office.com/ja-jp/article/Office-365-%25E3%2581%25AE%25E3%2583%2587%25E3%2582%25A3%25E3%2583%25AC%25E3%2582%25AF%25E3%2583%2588%25E3%2583%25AA%25E5%2590%258C%25E6%259C%259F%25E3%2582%2592%25E3%2582%25BB%25E3%2583%2583%25E3%2583%2588%25E3%2582%25A2%25E3%2583%2583%25E3%2583%2597%25E3%2581%2599%25E3%2582%258B-1b3b5318-6977-42ed-b5c7-96fa74b08846?ui=ja-JP&rs=ja-JP&ad=JP)
参考：[簡単設定を使用した Azure AD Connect の開始](https://docs.microsoft.com/ja-jp/azure/active-directory/connect/active-directory-aadconnect-get-started-express) 

かんたんですね。
mediba の場合 セカンダリーのドメインコントローラーに AzureAD Connect をセットアップすることと AzureAD 側からのパスワードライトバック（リセットや変更）はカスタマイズをしてさせないように設定しています。

## AzureAD へのアプリの登録
ロール毎のアクセス権限は、AzureAD にてアプリケーションとして登録します。
今回は、AdministratorAccess を持つロールと、S3FullAccess を持つロール用の二つのアプリケーションを登録します。

### ギャラリーからの Amazon Web Service (AWS) の追加
ギャラリーから Amazon Web Service (AWS) を追加するには、次の手順を実行します。

0. [Azure クラシック ポータル](https://manage.windowsazure.com/)の左側のナビゲーション ウィンドウで、[Active Directory] をクリックします。
0. [ディレクトリ] の一覧から、ディレクトリ統合を有効にするディレクトリを選択します。
0. アプリケーション ビューを開くには、ディレクトリ ビューでトップ メニューの [アプリケーション] をクリックします。
0. ページの下部にある [追加] をクリックします。
0. [実行する内容] ダイアログで、[ギャラリーからアプリケーションを追加します] をクリックします。
0. 検索ボックスに、「Amazon Web Service (AWS)」と入力します。
0. 結果ウィンドウで [Amazon Web Service (AWS)] を選択し、[完了] をクリックしてアプリケーションを追加します。
0. 上記手順を S3FullAccess と AdministratorAccess 用に二つ作ります。

### Amazon Web Service (AWS) との Azure AD シングル サインオンを構成
先ほど追加したアプリにシングルサインオンの設定を行います。
ちなみにこちらの手順について Microsoft の公式な資料があるのですが、残念ながら手順どおりになりません。画面イメージが豊富ですので下記の手順の参考にしてみてください。
参考：[チュートリアル: Azure Active Directory と Amazon Web Service (AWS) の統合](https://docs.microsoft.com/ja-jp/azure/active-directory/active-directory-saas-amazon-web-service)

1. [Azure クラシック ポータル](https://manage.windowsazure.com/)の左側のナビゲーション ウィンドウで、[Active Directory] の 追加した Amazon Web Service (AWS) アプリケーション統合ページで [シングル サインオンの構成] をクリックして、[シングル サインオンの構成] ダイアログを開きます。
1. [ユーザーの Amazon Web Service (AWS) へのアクセスを設定してください] ページで、[Azure AD のシングル サインオン] を選択し、[次へ] をクリックします。
1. [アプリケーション設定の構成] ページで、[識別子] に以下のURIを入力します。

**ポイント**：AWS エンドポイント（ https://signin.aws.amazon.com/saml ）に付随した URI を指定する必要があります。
たとえば、以下のような URI をユニークで生成します。
(エンドポイントの後ろにパラメーターで識別子を挿入）
https://signin.aws.amazon.com/saml?S3Full

[Amazon Web Service (AWS) でのシングル サインオンの構成] ページで、[メタデータのダウンロード] をクリックし、コンピューターにローカルでメタデータ ファイルを保存します。
**後で使います**

### AWS 側の設定
2. IAM を編集できる権限で AWS マネージメントコンソールにサインオンします。
2. [IAM] のコンソールを開き、左側のナビゲーションから [ID プロバイダー] をクリックします。
2. [プロバイダの作成]をクリックし、[プロバイダーのタイプ]から **SAML** を選択します。
2. [プロバイダ名] に任意の識別子を入れ、先ほどダウンロードした XML ファイルをメタデータドキュメントとしてアップロードし、[次のステップ] をクリックし作成します。
2. つづいて利用するロールを作成するため、左側のナビゲーションから[ロール]を選択し［新しいロールの作成］をクリックします。
2. ［ロール名］を指定し［次のステップ］をクリックします。
2.［ロールタイプの選択］にて［IDプロバイダアクセス用のロール］を展開し［SAML プロバイダへのウェブシングルサインオン（WebSSO）アクセスを付与］を選択し［次のステップ］をクリックします。
2. ［ロールの信頼の確認］にて 12 行目のエンドポイントを目的の値に修正し［次のステップ］をクリックします。
2. ［ポリシーのアタッチ］で設定したいポリシー名を選択し［次のステップ］をクリックします。
2. ［確認］の画面で［ロール ARN］と［信頼されたエンティティ］の値をメモし［作成］します。
![無題の画像.png](https://qiita-image-store.s3.amazonaws.com/0/148739/e0b709fa-9618-162d-cabf-9dbb234eeb69.png)
2. [Azure クラシック ポータル](https://manage.windowsazure.com/) に戻り、対応するアプリケーションを開きます。
2. 上部のメニューで [属性] をクリックしダイアログを開きます。
2. [ユーザー属性の追加] をクリックし、追加のダイアログで以下の値を入力して完了します。
 3. [属性名] ボックスに、「https://aws.amazon.com/SAML/Attributes/Role」と入力します。
 3. [属性値] ボックスに、[Role の ARN 値] , [Trusted Entity の ARN 値] を入力します。
![無題の画像2.png](https://qiita-image-store.s3.amazonaws.com/0/148739/b5f3c213-f075-db98-8d89-313689ec1170.png)

2. 再び[ユーザー属性の追加] をクリックし、追加のダイアログで以下の値を入力して完了します。
 3. [属性名] ボックスに、「 https://aws.amazon.com/SAML/Attributes/RoleSessionName 」と入力します。
 3. [属性値] ボックスに「user.userprincipalname」と入力するか、ドロップダウン リストから選択します。
2. [変更の適用] をクリックし、保存をします。

### ユーザーへの割り当て
ドメインと同期している場合は、ユーザーへのアクセス管理もかなりシンプルです。

3. [Azure クラシック ポータル](https://manage.windowsazure.com/) からユーザーにアクセスを許可させたいアプリケーションを選択します。
3. 上部のメニューで [ユーザーとグループ] をクリックします。
3. 利用させたいユーザーを検索し［割り当て］ をクリックします。
![無題の画像３.png](https://qiita-image-store.s3.amazonaws.com/0/148739/3d7f7ee5-e266-1212-043c-d8f5c219a482.png)

# 使ってみよう
AWS マネージメントコンソールには個人用のアプリポータルからアクセスできます。
https://portal.office.com/myapps

![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/148739/423f03cf-6d4e-4eb8-02a7-0bc3ddd222c2.png)

先ほど割り当てたアプリケーションが Office の製品と一緒に並んでいるのは不思議な感じではありますが、クリックすると指定したロールで AWS マネージメントコンソールアクセスすることができます。

# まとめ
いかがでしたでしょうか？
クラウドサービスも SAML や OAuth など IDaaS を活用できるサービスが増えてきています。社内のアカウント管理の混乱の収拾にお役立ちできれば幸いです。