Azure AD と AWS IAM 間で SAML を使った ID Federation をやってみた

# はじめに

AWS マネージメントコンソールに、Identity Provider を使った SSO ログインがやりたいときがあります。AWS Organizations が使える環境だったら、AWS SSO を使えば比較的楽に実現できます。しかし、Organizations が使えない環境でも、AWS IAM で Identity Provider の設定をすることで、SSO が実現できます。

今回は、AWS IAM と Azure AD 間で、SAML を使ったフェデレーションを行っていきます。



# わかったこと

今回の検証を通じて、わかったことを最初に書きます。

- この記事の構成では、Azure AD 側でプロビジョニングの設定を加えても、AWS IAM User などには自動的に追加されない
  - https://docs.microsoft.com/ja-jp/azure/active-directory/app-provisioning/user-provisioning
- Azure AD 上で、シングルサインオンに関する RoleSessionName の設定を変更しないとエラーになる場合がある
- AWS 側で複数 IAM Role を作ることで、Azure AD のログイン時に、使用する IAM Role を指定可能
- Azure AD のユーザーやグループごとに、割り当てる IAM Role を指定可能
- Identity Provider 経由で AWS マネージメントコンソールを表示したときに、左上に表示される文字列は、`IAM Role Name/Role Session Name` という形式になっている


# Azure : Azure Active Directory で SAML 設定

Microsoft Azure にログインし、Azure Active Directory で検索して、サービスを選択します。
https://portal.azure.com/

![image-20211230224530191.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c83c2cd8-4b40-9442-d23a-6384096ba2d8.png)



エンタープライズアプリケーションを選びます。

![image-20211230224709994.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4c4868b6-8479-7b19-c55d-09695b6e1063.png)



新しいアプリケーションを選択します。

![image-20211230224754776.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ffd84b2a-4c70-b4e3-e530-8778052405e4.png)



AWS を選択します。

![image-20211230224911973.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/972afd38-f921-7810-44e7-69f03f3da8ae.png)



AWS Single-Account Access を選択します。

![image-20211230224929214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/90f57fee-15f2-6a12-b9ce-18aa622b6dba.png)



名前に好きなものを入れて作成をおします。

![image-20211230225104886.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/1bfaba91-2d2d-1c83-f6de-f0e5d44a54f4.png)



数秒後、作成完了となります。左側のメニューから、シングルサインオンを選択します。

![image-20211230231213291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/830ed90b-e0c9-871c-58f5-1f23654bcdbc.png)



SAML を選びます。

![image-20211230231237707.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5ef2426a-8923-1abf-1e55-40ee591fbf7b.png)



はい を選ぶ。

![image-20211230231307255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4206b36a-ff17-ca9c-6f6d-80688723e925.png)





フェデレーション メタデータ XML をダウンロードします。

![image-20211230232121911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/26046665-91c1-b4f6-6a72-a53d5ae72f9b.png)



# AWS : IAM で Identity Provider の設定

AWS IAM の画面を開き、Identity Provider を追加します。

![image-20211230233243086.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f77776c6-4976-5227-9093-8a3963417bed.png)



パラメータをいれて、Add provider を押します

- SAML を選択
- 任意の名前
- Azure AD からダウンロードしたメタデータ XML を指定

![image-20211230233514122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/abf3cdb6-b2f0-eacf-1859-11efd53c45f6.png)



追加されました

![image-20211230234025886.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7b194d65-41c4-e7ab-8730-010b439c9875.png)



# AWS : IAM Role 管理者権限を作成

Azure AD 経由でログインされたユーザーに紐づける IAM Role を作成します。

![image-20211230234223350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0da693f2-4110-ebf7-8d57-fc2ebb1cc996.png)



入力して Next を押す

- SAML 2.0 Federation を押す
- SAML Provider を選択
- Management Console にログイン可能を選択

![image-20211230234314773.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/90273dcc-2fd5-3835-df71-15e272820b8e.png)



ユースケースに合わせた Policy を指定。今回はシンプルにいきたいので、Administrator を指定 (本番環境では、必要最小限の権限にしましょう)

![image-20211230234443326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/75b22c53-8583-6468-4280-04ec1caadaeb.png)





このまま Next を押す

![image-20211230234514828.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b725f6b6-2bcc-8575-995a-7d821155cb35.png)



名前などを指定して、Create role を選択

![image-20211230234634519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c3f889c4-977a-c619-977a-b87b0811b011.png)





IAM Role が作成される

![image-20211230234732452.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a8e59f10-fed0-0c1b-0701-1ebf2682c0ef.png)



# AWS : IAM Role 読み込み権限を作成

さきほどと同様に、別の 読み込み専用 IAM Role を作成します。

![image-20211231002931128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3090940b-b4ba-83d1-37a7-c54ea1547b55.png)



こっちは ReadOnlyAccess を選択します。

![image-20211231003019554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/81017b34-686e-9b1f-8caa-ff87057bc8f1.png)





適当な名前で作成

![image-20211231003110126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/55b848ce-dc18-0151-5113-cf99fba99c25.png)





# AWS : 自動プロビジョニングに利用する IAM User を作成

まず、User に紐づけるための IAM Policy を作成します。

Create Policy を選択します。

![image-20211231000747461.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/aacaa17e-f29d-b7a5-9c89-59dea98e9869.png)



Azure AD 側で必要な権限は、IAM Role の参照なので、次の設定を行います。

![image-20211231000859616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4bad6447-e2e2-3bce-5e24-a0ac9a40a7e6.png)

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



Tag は無しのまま。

![image-20211231000948637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3c721a09-4600-1c33-4603-915f1810b9f2.png)



適当な名前をいれて、Create します。

![image-20211231001115142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6ea6292f-64d1-a644-bf98-8f8c873fc63b.png)





IAM Policy が作成されました。

![image-20211231001201859.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c83658d1-62a5-605c-9d0d-4edd565301cb.png)



この Policy を使うための IAM User を作成します。

![image-20211231001249799.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/de0ce0e2-9762-6934-9323-99a562938d65.png)



適当な名前をいれて、Next を入れます。

- Access Key を Azure AD 側に入力するので、Programmatic access をチェックいれます。

![image-20211231001405971.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/46eb44fa-7070-a7b3-514f-c7b5129ca0ea.png)



作成した IAM Policy を選択して、Next を押します。

![image-20211231001505612.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a56235b7-020d-f495-5d2b-a8a709ca4166.png)



このまま Next を押します。

![image-20211231001527128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/eb0ade63-ff26-65d1-900e-3468296c420d.png)



Create User を押します。

![image-20211231001556534.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7125c7ba-ba04-faa0-a617-fa13b5f0dca8.png)



AccessKey, Secret access key を控えておきます。

![image-20211231001633626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/23e89882-2687-c27a-491c-23b9dc7b84d8.png)



IAM User が作成されました。

![image-20211231001735256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/94b094d1-7235-9e5a-e687-75158f905d39.png)



# Azure : Azure AD でプロビジョニングの設定

プロビジョニングから、作業の開始を選びます。

![image-20211231001814700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/11237484-8f57-001e-bb58-ea0d5f3180c9.png)



パラメータを入れて、テスト接続を押します。

- 自動

- clientsecret : Access Key
- シークレット トークン : Secret Accesss Key

![image-20211231002025526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fa3a4f72-2b0d-04fc-f458-1c352a078601.png)



テスト接続が OK なので、このまま保存を押します。

![image-20211231002059532.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a0426118-3ea6-11cb-0607-955d797c27c1.png)



保存完了です。

![image-20211231002143871.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e2f29f38-ee59-369a-2eb4-c76260864f05.png)



画面を戻した後に、プロビジョニングの開始を押します。

![image-20211231002335433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/77abad8c-0330-5291-3a11-455c928fd767.png)



プロビジョニングが開始されました。

![image-20211231002356523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/35418d09-57a3-244b-ea1e-33cb980ee117.png)



プロビジョニングの編集を押します。

![image-20211231002519977.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2f6913c7-8184-882e-b58b-0e130a076360.png)



プロビジョニングの状態がオンになっていれば OK です。オンになっていない場合は、オンにします。

![image-20211231002603153.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a4957083-d7ea-2ee4-ed77-8603c2bcc5b3.png)



Azure AD のユーザーを、AWS 側に紐づけを行います。

![image-20211231004709210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/43f892b7-e3e4-1b06-07a5-ff278899e700.png)



まずユーザーを選択します。

![image-20211231004821013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/47bbe14c-298f-7605-76ea-6ab4652ae482.png)



選択を押します。

![image-20211231004844678.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/06e962f2-946b-75fd-4cfb-8aa9b7c89d49.png)



このユーザーに紐づけるロールを選択可能です。Admin のロールを選びます。

![image-20211231004917980.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d7fcb7ec-a8e3-3415-151d-702e0ce6beec.png)



割り当てを押します。

![image-20211231004950919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0914f6d1-a55a-14a7-32e2-8cf66085e06a.png)



ユーザーが割り当てられた様子が確認できます。

![image-20211231005019686.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/268de43d-47be-8b64-03a0-49f99eb65617.png)



同様の操作を行って、Role を2個割り当てることもできます。

![image-20211231005316020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/445cc27b-cf89-6bbc-20ad-aac9df7ae175.png)



# 動作確認 : エラー

Azure AD としての Portal 画面を開きます。既にログインしているので、ID/Password の入力は求められません。
https://myapps.microsoft.com/



Azure AD に登録されているエンタープライズアプリケーションが、このポータル画面に一覧表示されます。この中から、AWS のアイコンを選択します。

![image-20211231005505277.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ad563513-997d-2a4d-721c-1717323f11e6.png)





AWS マネージメントコンソールで使う IAM Role を選択して、サインインを押します。

![image-20211231005637970.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b2fd2766-b2a4-5c6e-d89f-21a48ea405a9.png)



# エラーのトラブルシュート

エラーになってしまいました・・・。デバッグをしていきます。

```
RoleSessionName in AuthnResponse must match [a-zA-Z_0-9+=,.@-]{2,64} (service: AWSSecurityTokenService; status code: 400; error code: InvalidIdentityToken)
```

![image-20211231010715656.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f77062ab-c49c-2f72-335b-999761742bc9.png)



Developer Tools で Network Tab から、saml を選択し、Payload から、SAMLRespone を Copy する。

![image-20211231010808417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/28fd635b-53d0-21cf-3299-d266373dbe32.png)





この文字列を Base64 でデコードします。

```
echo "base64encodedtext" | base64 --decode
```

もしくはセキュリティを気にしない環境なら、このサイトでデコード可能です。
https://www.base64decode.org/

さらに XML を整形可能です
https://tm-webtools.com/Tools/XMLBeauty



デコードすると、エラーになった RoleSessionName を確認できます。

```xml
      <Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName">
        <AttributeValue>mailaddress_gmail.com#EXT#@mailaddressgmail.onmicrosoft.com</AttributeValue>
      </Attribute>
```



AWS の Document に詳細がかかれています。`#EXT#`  の文字列が怪しいです。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/troubleshoot_saml.html#troubleshoot_saml_invalid-rolesessionname



# RoleSessionName の指定を変更

RoleSessionName の指定を、Azure AD 上でカスタマイズしてみます。

![image-20211231011516697.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4f2c4942-0e12-4f82-a30d-69f76cb6fb02.png)



RoleSessionName を変更します。

![image-20211231011554115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c0ec1033-a3c7-f69b-5ca2-e1fed79f4046.png)



適当に、`user.mail` としておきます。

![image-20211231011625376.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bdada31e-752b-41e5-d851-f8f81dbd7b5f.png)



変わりました。

![image-20211231011650528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ea891da2-ed4d-0776-9e7e-12bd37cd3268.png)



# 動作確認 : 正常

再び Azure AD のポータルサイトを開きます。
https://myapps.microsoft.com/



AWS の Icon を選択します。

![image-20211231014908475.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/338ef551-53e2-1bc2-3e1a-361c6baf6abe.png)



サインインを押します。

![image-20211231014947065.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ec6f6b0a-5621-e372-2a77-1ea5a6e2a3d3.png)



AWS のマネージメントコンソールが開かれます。

![image-20211231015029936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6c5f36bd-345b-7bc7-5ad1-66aa4e8341be.png)



なお、このときに、とくに IAM User 側は自動的に作成されているわけではありませんでした。

# 余談 : 右上に表示される名前について

Identity Provider 経由で AWS のマネージメントコンソールにログインすると、右上に名前が表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/eb1adb66-5c75-f44a-633c-96b29065679f.png)

この表示名は `IAM Role Name/Role Session Name` という形式になっています。

IAM Role 名は、ここの名前から引っ張ってきています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/aefc27fa-2014-311b-c058-ccb9154ce1e1.png)


Role Session Name は、Azure AD 側の設定方法に依存されます。この記事では、Azure AD 側の設定で、RoleSessionName を `user.mail` と指定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/686d8736-a690-9cf4-dc0b-626dab73fc67.png)

この設定によって、Azure AD 側に登録されている User の電子メールの属性を引用して使われています。これらの設定を適宜変更することにより、任意の名前を付けられるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0da3b813-92f2-9362-ecd5-3e00e2a7fde4.png)

例えば、ここの RoleSessionName の設定を変更して、特定の文字列を追加すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/49acaeff-215f-ce05-1503-e932a220123c.png)

右上の表示もこんな感じにかわります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fdb8ded2-49d0-db2b-41ce-d0a84d7bc58f.png)



# まとめ

Azure AD と IAM を連携した SSO の手順を紹介しました。Organizations が使えない環境で便利に利用できます。



# 参考URL

SAML 2.0 ベースのフェデレーションについて
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_saml.html

https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/amazon-web-service-tutorial

AWSアカウント シングルサインオンの設計と運用
https://d1.awsstatic.com/webinars/jp/pdf/services/20200722_AWSBlackbelt_%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A8%E9%81%8B%E7%94%A8.pdf

https://dev.classmethod.jp/articles/non-organizations-aws-azuread-sso/