Amazon Connect のSSO(IAM Identity Center/SAML2.0)設定

今回はAWSが提供しているマネージドコンタクトセンターサービスのAmazon Connectを同じくAWSサービスのIAM Identity Centerと連携させ、SSOできる環境の構築を行います。認証はSAML2.0を利用し、IdPはIAMで構築して利用するAWS内で完結するSSO環境となります。

# 今回のゴール
実現したい内容としては、IAM Identity Centerで1度ユーザ認証をすれば、AWS管理コンソールもAmazon connectにもアクセスできるという状態を作ることです。
![今回のゴール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/d52ac5ce-9dd3-b828-1f68-d1b11dfe1680.jpeg)

デフォルト状態（SSOしない）であれば
![通常のログイン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/7fac65f3-050f-2d98-6d4f-1db50abc7a09.jpeg)

こんな感じでAWS IAMのログイン画面とAmazon Connectログイン画面は別々となり、IDの管理もぞれぞれ別々となります。
運用例として、AmazonConnectのユーザを作成するために、AmazonConnectにAmazonConnectの管理者でログインする必要がありますがAWS IAMの管理者IDとは別IDのため、AmazonConnectの管理者PWの管理も必要になります。
ちゃんと管理していないとどっちの管理者IDがどのPWなのか分からなくなるという事態にもなりえます。

## 構成図
今回の設定を構成図にするとこんな感じになります。

![構成図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/949de3a0-6a97-2beb-fe1e-ad4cd920e822.jpeg)



# 前提条件+免責事項
- Amazon Connectインスタンス、IAMロール、IdPなどは全て同一のAWSアカウント内で構築する
- インスタンス利用料金が発生する
- 認証方式はSAML2.0を利用する
- IdPはAWS IAMから作成する
- 本記事のスクショは2024年3月時点のUI画面のスクショ
- Amazon Connect内の設定は本記事の範疇外（本記事はSSOでログインするところまで）
- SSOで利用するIDはメールアドレス形式

## 用語解説
- SSOとは?
>シングルサインオン (SSO) は、ユーザーが 1 回限りのユーザー認証で複数のアプリケーションやウェブサイトにログインできるようにする認証ソリューションです。今日のユーザーはブラウザからアプリケーションに直接アクセスすることが多いため、組織はセキュリティとユーザーエクスペリエンスの両方を改善するアクセス管理戦略を優先しています。SSO は両方の側面を提供します。SSO では、ユーザーが本人であることが一度検証されると、ログインを繰り返さなくても、パスワードで保護されたすべてのリソースにアクセスできます。

【出典】https://aws.amazon.com/jp/what-is/sso/

- IdPとは?
>IdP(Identity Provider)は、その名前の通り、アイデンティティ（身元）を提供するプロバイダのことです。具体的には、ユーザーがあるオンラインサービス（例えば、ショッピングサイトやSNS）にログインする際、そのユーザーが「本当に主張している人物であるか」を確認し、その情報をサービス提供者（SP: Service Provider）に伝える役割を果たします。
>例えば、オンラインショッピングでアカウントを作成する際、ユーザー名やパスワード、メールアドレスを設定し、この情報がユーザーの「アイデンティティ」となり、次回からはその情報でログインします。IdPは、このようなユーザー情報を一元管理し、さまざまなウェブサービスで利用できるようにしてくれるものです。

【出典】https://www.netattest.com/idp-2023_mkt_tst

- SAMLとは?
>SAML (Security Assertion Markup Language) は、アプリケーションが認証情報を SSO サービスと交換するために使用するプロトコルまたは一連のルールです。SAML は、ブラウザに適したマークアップ言語である XML を使用して、ユーザー識別データを交換します。SAMLベースの SSO サービスは、アプリケーションがユーザー認証情報をシステム内に保存する必要がないため、より優れたセキュリティと柔軟性を提供します。

【出典】https://aws.amazon.com/jp/what-is/sso/

# 設定の流れ
## IAM Identity Centerの作成・有効化
AWS管理コンソールで「IAM Identity Center」を検索し、有効化します。

![IIC有効化.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/4aabf650-4abf-b9fd-dd28-08fa303b0639.jpeg)

有効化できたらIAM Identity Centerで作成したユーザからAWS管理コンソールにログインできるように左側の「マルチアカウントアクセス許可」から「AWSアカウント」をクリックし、管理コンソールへログインできるようにしたいAWSアカウントを選択します。


## Amazon Conectインスタンスの作成
SSOでログインする先のAmazonConnectを作成していきます。AWS管理コンソールで「Amazon Connect」を検索し、通常のインスタンスを作成する手順とほぼ同じですがID管理のところで、「SAML2.0ベースの認証」を選択してください。アクセスURLのところは任意の値でOKです。




![connect追加1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/cadf8a9b-73c2-03df-b0d1-b432a7e8dea8.jpeg)

管理者の追加ですが今回はあとから作成するので、「管理者なし」を選択します。ここで事前に作成しておいても問題ないです。
![コネクト管理者を追加.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/96d47180-102f-3a71-1879-092fd8459cfb.jpeg)

テレフォニー設定はデフォルトのままでOKです。
![テレフォニー設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/84665a2d-f25e-9603-1c3c-ac954fd58a5e.jpeg)

データストレージ設定もデフォルトのままです。
![データストレージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/2c851065-ac62-aa1b-0c93-52227fd52add.jpeg)

しばらくするとインスタンスが作成され、ステータスがアクティブになると思います。

## IAM Identity CenterでAmazon Conectのアプリケーション登録
次にIAM Identity Centerで作成したユーザからAmazon Connectにログインできるように左側「アプリケーションの割り当て」から「アプリケーション」をクリックします。
![IIC有効化.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/4aabf650-4abf-b9fd-dd28-08fa303b0639.jpeg)


「アプリケーションを追加」をクリックします。

![アプリケーション追加.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/9f70457a-1446-9589-d514-dadc1e2daf44.jpeg)





アプリケーションタイプの選択ですが、今回設定するAmazon ConnectはAWSのカタログの中にあるため「カタログからアプリケーションを選択する」を選びます。
![アプリケーションタイプ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/5c273861-cb2f-4121-8e62-254f197a1fcf.jpeg)



検索欄に「connect」と入力するとAmazon connectが出てくるので選択します。

![カタログ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/8f408d69-efd0-9c6e-249a-7a44f9087404.jpeg)

表示名や説明は任意の値を設定できますが今回はデフォルトのまま進めます。
![表示名.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/f9725009-6e8b-0454-2761-818dcc033f31.jpeg)


メタデータの各種URLが表示されています。この中で一番上の「IAM Identity Center SAMLメタデータファイル」は設定に必要なのでDLして、保存しておきます。アプリケーションのプロパティの「リレー状態」に後ほど値を入力します。
![メタデータ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/9cdc244f-76ad-7c21-5619-e3d51fbaccb7.jpeg)


アプリケーションACS URLとアプリケーションSAML対象者ですがデフォルトのままでOKです。
![メタデータ入力.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/32899327-b4db-da79-c589-6e6d2c5bb4c1.jpeg)

これでアプリケーション登録に必要な最低限の情報は入力できたので「送信」をクリックし、登録を行います。
登録後はこんな感じで「アプリケーションの表示名で入力した値」のものと「Custom SAML2.0 Application」の２つが出てきます。「Custom SAML2.0 Application」はステータスが「未完了」になりますがこのままで問題ないです。

![アプリケーション登録後.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/f0f5506f-0a85-2234-6f05-7fbebce64a4e.jpeg)

アプリケーションが表示されていない場合は「AWS管理」と「カスタマー管理」のタブが別になっていますので、「カスタマー管理」の方を表示させましょう。

## IAM でIdPの作成
続いてIdPを作成します。IAMで作成しますがIAM Identity Centerの画面左下に関連コンソールというリンクがありますのでそこからアクセスします。IAM管理画面のアクセス管理の中に「IDプロバイダ」があるのでクリックします。

![IAMアクセス.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/b00bab2b-a8f4-3d37-e9e6-0f30bd3f7d4e.jpeg)

「プロバイダを追加」をクリックします。
![プロバイダヲ追加.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/f245a336-2dd7-3f84-08c4-4101c87676fc.jpeg)

プロバイダのタイプで「SAML」を選択します。プロバイダ名は任意の値（今回はConnectIAMIdentityCenterという名前にしています）を入力し、「メタデータドキュメント」で先ほどDLしておいた「IAM Identity Center SAMLメタデータファイル」をアップします。これで右下の「プロバイダを追加」をクリックすれば必要情報が登録されたプロバイダが作成されます。

![プロバイダタイプ選択.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/50acfe95-dfbb-76a8-ce90-004d8a420fd7.jpeg)


## IAMポリシー（2つ）、IAMロールの作成
次にポリシーとロールを作成します。IAMの画面で「ポリシー」をクリックし、「ポリシーの作成」で新しいポリシーを作成します。

どういうポリシーを作成するのか設定できる画面になるので「JSON」をクリックし、ポリシーエディタを開きます。
![ポリシー作成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/fa9b0709-06e6-0d89-aa6a-740762fe3484.jpeg)

ポリシーエディタの部分に以下の内容を記入します。インデントのずれや変なところに改行があるとエラーになるので気を付けましょう。

    #以下をコピペ
    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": "connect:GetFederationToken",
            "Resource": [
                "<connect instance ARN>/user/${aws:userid}"
            ]
        }
    ]
    }

コピペしたコードの中で、***\<connect instance ARN>*** は実際の値を入れる必要があります。
connect instance ARNですがAmazonConnectの管理サイトに記載があります。

![ARN.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/7074b42d-731f-8565-7c76-96c936232077.jpeg)

ポリシー名ですが「ConnectIAM-Indetity-Center-Policy」にしています。

上記のポリシー作成後ですがこんな感じになります。
![ポリシー作成後.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/b7d1e8c7-a985-0302-eb38-6e185faf77e2.jpeg)


同じ要領でもう１つポリシー作成します。ポリシーエディタの部分に以下の内容を記入します。

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:ListRoles",
                "iam:ListAccountAliases"
            ],
            "Resource": "*"
        }
    ]
    }

ちなみにポリシー名ですが「identitycenter_cli_policy」にしています。
上記のポリシー作成後ですがこんな感じになります。

![別ポリシー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/af11f4b5-2a05-83c1-3199-532aa8df0b14.jpeg)

ポリシーができたので、今度はロールを作っていきます。

IAM管理画面のアクセス管理の中に「ロール」があるのでクリックします。
右上の「ロール作成」をクリックし、以下内容で設定します。

- 信頼されたエンティティタイプは「SAML2.0フェデレーション」を選択
- SAML2.0ベースのプロバイダーで、先ほど作成したIdPを選択
- 許可されるアクセスで「プログラムとAWSマネジメントコンソールへのアクセスを許可する」を選択
![ロール作成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/05f0e570-e6d4-f61d-fe1d-9a10f7eec757.jpeg)

- 許可ポリシーで先ほど作成した2つのポリシーを選択
ロール名は任意のものを設定します。今回は「ConnectIAM-Identity-Center」にしています。

これでロールを作成するとこんな感じになります。
![ロール作成２.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/44315774-2e1f-0a1b-82ce-b2305f99d181.jpeg)




## Amazon Conectのアプリケーション登録内容の変更
先に作成しておいたAmazon Connectの設定内容を変更していきます。アプリケーションが表示されていない場合は「AWS管理」と「カスタマー管理」のタブが別になっており、「カスタマー管理」の方を表示させましょう。登録したアプリケーションを選択し、「アクション」から「設定を編集」をクリックします。
![アプリのプロパティ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/6191a010-7206-c50d-5fe8-1e23458d08ee.jpeg)


アプリケーションのプロパティの「リレー状態」の箇所に以下パラメータを入力します。

    https://リージョン ID .console.aws.amazon.com/connect/federate/インスタンス ID
    
![アプリのプロパティ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/2a380b1b-df58-b398-03d6-6f46ce96cd92.jpeg)

「リージョン ID」と「インスタンス ID」は環境によって変わりますので変更してください。
ちなみに東京リージョンだと「リージョン ID」はap-northeast-1になります。「インスタンス ID」はAmazonConnectのARNの中の”:instance/”以降の英数字です。

アプリケーションの設定編集はこれでOKです。

続いて「属性マッピングを変更」を行っていきます。


![属性マッピング.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/1f57c21e-c42b-97ed-fa8f-ca5b59b113f6.jpeg)

上記画像のように以下２つの属性マッピングを追加します。

1つ目はユーザ属性=「https://aws.amazon.com/SAML/Attributes/RoleSessionName」に、形式を「${user: email}」にします。

もう1つはユーザ属性を「https://aws.amazon.com/SAML/Attributes/Role」に、形式に「IAMroleのARN,IAM IdPのARN」を記入します。

【形式の記入例】
arn:aws:iam::xxxxxxxxx:role/ConnectIAM-Identity-Center,arn:aws:iam::xxxxxxxxxx:saml-provider/ConnectIAMIdentityCenter

これでSSOする環境設定はできました。


## IAM Identity Centerでユーザ作成
ここから実際にSSOする際に利用するユーザを作成していきます。まずはIAM Identity Center側でユーザを作成します。
![IIC-ユーザ作成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/2ec51f72-6875-e556-1a7e-4f5dddffd9ff.jpeg)


ひと通り必要な情報を埋めて、ユーザを作成します。今回はユーザ作成後の認証をメールで送付するので、受信できるメールアドレスを設定してください。またこのメールアドレスは次に作成するAmazonConnect側ユーザと合わせる必要があります。

![ICC-UserCreate.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/fa3e0789-1d68-8be9-3ed3-4da900e0b626.jpeg)

## Amazon Connectでユーザ作成
AmazonConnectの管理コンソールで「Access URL」横のEmergency accessのURLからログインしてユーザを作成します。※AmazonConnectのインスタンス作成時に管理者を作成している場合は通常のAccess URLからのログインでもOKです。
![AccessURL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/47f0c6bd-6f7d-a4e4-d123-aee3fe62f04b.jpeg)

ログイン後にAmazon Connect側でも先ほどIAM Identity Center側で作成したユーザと同じ情報でユーザを作成します。「ログイン」の値はメールアドレス形式で記載してください。
![connect-user.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/08eb6d57-c389-e5ef-dc5c-3a91ce4a0cfa.jpeg)

## AWSコンソールへのアクセス許可
最後にIAM Identity Centerの左側の「AWSマルチアカウントのアクセス許可」でそのAWSアカウントに、どういう権限でアクセスを許可するのか設定しましょう。ここはOrganizationで子アカウントにロールを設定する感じで進めてもらえればOKです。

![IIC有効化.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/4aabf650-4abf-b9fd-dd28-08fa303b0639.jpeg)


## SSOログイン動作試験
これでSSO設定とユーザ作成が完了したので、実際に１回の認証でAmazonConnectまでログインできるかやってみましょう。

認証画面のアクセスURLは以下画像の右下にAWSアクセスポータルのURLと記載されているところになります。
![IIC有効化.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/4aabf650-4abf-b9fd-dd28-08fa303b0639.jpeg)

Amazon connect独自のログイン前認証画面が出てこずに以下のAmazon connectの設定画面にアクセスできてばOKです。
![AWS SSO設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/7acafe39-0689-c6f5-36b6-64f31ccfa46c.jpeg)


# 参照にしたサイト

https://catalog.us-east-1.prod.workshops.aws/workshops/33e6d0e7-f927-4531-abb1-f28a86ba0872/en-US/6-sso-amazonconnect-aws-iam-identity-center/3-iam-identity-center-configuration

↑サイト表示がおかしいときがありますが、何度か更新すると治ります

https://repost.aws/ja/knowledge-center/connect-saml-2-authentication-aws-sso

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/configure-saml.html

# 2024年4月4日追記(アプリケーション追加できない問題)
Organizationに参加しているアカウントの場合、IAM Identity Centerの「アプリケーションの割り当て」で「アプリケーションを追加」ボタンが出てこない場合があります。これはOrganizationの親アカウントによって制限されているためです。

![アプリケーションの追加が出てこない.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/9333cfc7-c9e9-81e2-7499-05daa5631ff0.png)

制限解除のために、今回設定しようとしているアカウントの親アカウント側のIAM Identity Centerで委任管理者に当該アカウントを指定してやる必要があります。一番下の「委任された管理者を登録」からアカウントを指定してやりましょう。
![委任管理者の設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/9359533b-c260-bc65-5f66-aef794be2135.png)

委任管理者として設定されるとこんな感じで登録されます。
![委任管理者の設定後.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/dd190800-8c0e-cbd1-34c3-60e36070ff68.png)



# おわりに
参考にしたサイトは2つともAWS公式のサイトです。ただ設定が必要な箇所が異なったり、片方のサイトには記載がないポリシーがあったり、公式のトラップが仕掛けられています...試される設定力、それがAWSにおけるSSO構築です！