Active Directory、AWS IAM Identity Centerを使用したAmazon QuickSightへのシングルサインオン環境を構成する

Amazon QuickSight（以下QuickSight）向けにシングルサインオン環境を構築する機会があったのでメモ。
なお、歴史的経緯から現在のAWS SSOあらためAWS IAM Identity Center（以下Identity Center）がそれなりに複雑な構成になっていたので、そのあたりについても簡単にまとめておく。

# やりたいこと
QuickSightとActive Directory（以下AD）でシングルサインオンを行えるようにする。
シングルサインオンは、いわゆるIdP-Initiatedで構成する。

参考：
[IdP-Initiated SSO（IdPでログインしてからQuickSightに遷移）](https://docs.aws.amazon.com/quicksight/latest/user/federated-identities-idp-to-sp.html)
[SP-Initiated SSO（QuickSightログイン画面からIdPにリダイレクト）](https://docs.aws.amazon.com/quicksight/latest/user/setup-quicksight-to-idp.html)


# 構成図
シングルサインオンを設定する前のIdentity Centerの構成が既にいい加減複雑だったが、まとめると最終構成図は以下のようになる。
なお、Identity Center、QuickSightともホームリージョンはバージニア北部。
![QS-IIC.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/ba4184ce-e290-8a44-0213-e20f62f1ba3e.png)

# ステップバイステップ
以下、設定方法を記載していく。

なお、EC2にADを構成し、AD Connectorからリージョン跨ぎでEC2を参照して、Identity CenterからAD Connector経由でADをIDソースとして使用するまでの設定の詳細は省略し、ポイントのみ列挙する。
- AD on EC2はそれほど複雑な手順は必要ない。昔ながらのdcpromo。
- AD ConnectorはAD on EC2のIPアドレスを参照するだけだが、インターリージョンVPCピアリングと、しかるべきルーティング設定が必要。なお、新規にIdentity Centerを作成する場合、東京リージョンに立てることも現在はできるので、この場合はインターリージョンVPCピアリングは必要ない（以前はバージニア北部にしか作れなかった）。
- Identity CenterとAD Connectorの接続については、[こちら](https://docs.aws.amazon.com/singlesignon/latest/userguide/connectonpremad.html)を参照。なお2022年4月以降、同期対象のユーザー/グループを選択・有効化することが必須になった。詳しくは[こちら](https://docs.aws.amazon.com/singlesignon/latest/userguide/provision-users-groups-AD.html)。

## 1. Identity CenterでQuickSightアプリケーションを作成
Identity Centerのコンソールから設定を開始する。最初はQuickSightへのエントリーポイントとなる**アプリケーション**の作成から。
AWSサービスやサードパーティー製品に交じってQuickSightのテンプレートが用意されているので、これを使用する。
今回は、名前もデフォルトの*Amazon QuickSight*とした。
![スクリーンショット 2022-08-18 23.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/2b6699a4-73cf-a72c-9fa8-ee7b875b0d7e.png)
いずれの項目もデフォルトで構わない。

重要なのはリレーステートで、SAML認証が成功したのち、SAMLアサーションを転送する先（つまり、ログインする先）を指定するのだが、ここを`https://quicksight.aws.amazon.com`（デフォルト）とすることでQuickSightにリダイレクトされるようになる。
ちなみに、以下のように**アプリケーション開始URL**にダッシュボードのURLを入れておくと、QuickSightのホーム画面ではなく、ダッシュボードが直接開くように設定することもできる。
![スクリーンショット 2022-08-19 0.34.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/b906592c-4b3b-3a9b-1980-ddd4a961faad.png)
後続の設定のため、以下からSAMLメタデータファイルをダウンロードしておく。
![スクリーンショット 2022-08-18 23.44.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/92f71746-7971-ca5d-fb57-0611273a34e3.png)

## 2. IAMでSAMLプロバイダーを作成
Identity CenterとQuickSightを繋ぐSAMLプロバイダーを、IAMコンソールで作成する。SAMLメタデータファイルは、先程ダウンロードしたものをそのままアップロードすればOK。
![スクリーンショット 2022-08-18 23.51.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/9186ae28-6774-c84e-9c34-e27e013b7bd2.png)

作成後の状態は以下の通り。
ちなみに下にあるのはIdentity CenterがSSOの頃に作成した、Identity Center用のSAMLプロバイダーである。今回の構成とは直接関係しないが、ADFSを使う場合もここで構成する。
![スクリーンショット 2022-08-18 23.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/c181891f-f7c9-2bfe-09d5-65dc80d536ed.png)

## 3. IAMポリシー/IAMロールを作成
フェデレーション時に使用されるIAMロールと、それにアタッチするためのIAMポリシーを作成する。
ロールの作成時に、**SAML2.0フェデレーション**を選択することがポイント。また、**プログラムと AWS マネジメントコンソールへのアクセスを許可する**を選択し、**属性**と**値**が自動入力されていることも確認する。
![スクリーンショット 2022-08-19 0.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/67c44fbd-a94a-337e-82b0-73792c55b75d.png)

今回は一般的なベストプラクティスに従い、`quicksight:CreateReader`権限を持つポリシーをアタッチした`qs-reader`ロールを作成する（つまり、セルフプロビジョニングされるユーザーはまずReaderとして作成される。必要な場合は後で管理者がAuthorやAdminに変更する運用モデルを想定する）。

```json:quicksight-policy-reader
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "quicksight:CreateReader",
            "Resource": "arn:aws:quicksight:*:012345678901:user/${aws:userid}"
        }
    ]
}
```

ロールARNは次のステップでSAML属性に入力するので、クリップボードにコピーしておく。
![スクリーンショット 2022-08-19 22.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/f2b74809-d823-ee28-cf8e-e0d7285297b7.png)

## 4. SAML属性を追加
Identity Centerに戻り、作成済みのアプリケーション*Amazon QuickSight*から**属性マッピングを編集**を選択する。
これを忘れると、テストの際に`invalid SAML assersion.`などと文句を言われるので注意。
![スクリーンショット 2022-08-19 23.05.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/a2590e84-ca9c-954d-799e-1fd7ebf37eee.png)

以下のフォーマットで入力する。
|アプリケーションのユーザー属性|この文字列値または IAM Identity Center のユーザー属性にマッピング|形式|
|:--|:--|:--|
|`https://aws.amazon.com/SAML/Attributes/Role`|`arn:aws:iam::<アカウントID>:saml-provider/<SAMLプロバイダー名>,arn:aws:iam::<アカウントID>:role/<ロール名>`|`undefined`|

SAMLプロバイダー名、ロール名は、前のステップで作成したものを使用する。カンマ区切りであれば、SAMLプロバイダー名とロール名の順番は逆でも構わない。
ちなみに、異なるポリシーを持つ複数のロール（例えば`quicksight:CreateAdmin`を持つ`qs-admin`、`quicksight:CreateUser`を持つ`qs-author`）を作成することもできるが、現状、Identity Centerでは、QuickSightアカウントあたり一つしか`SAML/Attributes/Role`に設定できない制約がある（Identity Centerを介さず、[Azure AD](https://aws.amazon.com/jp/blogs/big-data/enabling-amazon-quicksight-federation-with-azure-ad/)や[Okta](https://aws.amazon.com/jp/blogs/news/federate-amazon-quicksight-access-with-okta/)を直接IdPとして構成する場合は、複数設定ができるようだ）。

> You can only map one IAM role per Amazon QuickSight account and one IAM role attribute mapping per IAM Identity Center application instance.

## 5. ユーザー/グループの割り当て
最後に、QuickSightを利用するユーザーまたはグループをアプリケーションに割り当てる。運用上、通常はグループになると思われる。
なお、ここではAD内のユーザー/グループを検索して割り当てるのだが、最近のUIでは、一致の有無は表示してくれるが候補表示はしてくれないので、AD側の画面も開きながら設定する必要がありそう。
![スクリーンショット 2022-08-19 0.37.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/da7cc22b-78cc-8634-f3db-c48d9fb506af.png)

## 6. テスト
Identity Center→**ダッシュボード**から、**AWSアクセスポータルのURL**を探す。
![スクリーンショット 2022-08-19 0.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/e61f3987-fc15-439b-cd28-fcf21a34689c.png)
上記URLを別のブラウザやシークレットモードに貼り付けて、開いてみる。
![スクリーンショット 2022-08-19 0.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/6f96500f-53e9-c2d8-fc87-d3c87de08f16.png)
自分の環境ではAWSマネコンも割り当ててあるので、ログインに成功するとこんな感じでIdPポータルが開く。
![スクリーンショット 2022-08-19 0.45.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/31e0624f-cbcc-5777-f2c8-fb971e011cca.png)
*Amazon QuickSight*をクリックすると、QuickSightコンソールに遷移し、先程設定したダッシュボード画面に直接リダイレクトされる。ホームに遷移するか、ダッシュボードに直接遷移するかは、要件次第というところ。
![スクリーンショット 2022-08-19 0.49.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/7904b3b7-5e4b-f44e-d73f-7f43c309a6e9.png)

# まとめ
Ad→Identity Center→QuickSight、の組み合わせでシングルサインオンを構成した。
シングルサインオンはそれ自体がややこしいが、ただ、一度理解してしまえば応用が利く。Azure ADやOktaも基本は同様の設定で行けるはず。
なお、今回はIdP-Initiated SSOということでIdentity Centerへのログインを契機に遷移していく構成を検証したが、QuickSightのログイン画面から入ってIdPにリダイレクトしたいケース（SP-Initiated SSO）も需要が多いと思われる。参考情報に参照先ドキュメントを記載したので、必要に応じて試してみて欲しい。

# 参考情報
[AWS QuickSightへのアクセスにAWS SSOをつかう](https://lovebeerbear.hatenablog.com/entry/2020/07/07/233437)
[Set up SSO for Amazon QuickSight by using IAM Identity Center and identity federation](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/set-up-sso-for-amazon-quicksight-by-using-iam-identity-center-and-identity-federation.html)
[Setting up IdP federation using IAM and QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/external-identity-providers-setting-up-saml.html)
[Configuring SAML assertions for the authentication response](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_create_saml_assertions.html#saml_role-attribute)
[Amazon QuickSight のアクセスに Okta をフェデレーションする](https://aws.amazon.com/jp/blogs/news/federate-amazon-quicksight-access-with-okta/)
[Enabling Amazon QuickSight federation with Azure AD](https://aws.amazon.com/jp/blogs/big-data/enabling-amazon-quicksight-federation-with-azure-ad/)
[チュートリアル: Azure AD SSO と AWS Single-Account Access の統合](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/amazon-web-service-tutorial)