4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-30

はじめに

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

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

わかったこと

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

  • この記事の構成では、Azure AD 側でプロビジョニングの設定を加えても、AWS IAM User などには自動的に追加されない
  • 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

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

image-20211230224709994.png

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

image-20211230224754776.png

AWS を選択します。

image-20211230224911973.png

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

image-20211230224929214.png

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

image-20211230225104886.png

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

image-20211230231213291.png

SAML を選びます。

image-20211230231237707.png

はい を選ぶ。

image-20211230231307255.png

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

image-20211230232121911.png

AWS : IAM で Identity Provider の設定

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

image-20211230233243086.png

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

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

image-20211230233514122.png

追加されました

image-20211230234025886.png

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

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

image-20211230234223350.png

入力して Next を押す

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

image-20211230234314773.png

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

image-20211230234443326.png

このまま Next を押す

image-20211230234514828.png

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

image-20211230234634519.png

IAM Role が作成される

image-20211230234732452.png

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

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

image-20211231002931128.png

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

image-20211231003019554.png

適当な名前で作成

image-20211231003110126.png

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

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

Create Policy を選択します。

image-20211231000747461.png

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

image-20211231000859616.png

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

Tag は無しのまま。

image-20211231000948637.png

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

image-20211231001115142.png

IAM Policy が作成されました。

image-20211231001201859.png

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

image-20211231001249799.png

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

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

image-20211231001405971.png

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

image-20211231001505612.png

このまま Next を押します。

image-20211231001527128.png

Create User を押します。

image-20211231001556534.png

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

image-20211231001633626.png

IAM User が作成されました。

image-20211231001735256.png

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

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

image-20211231001814700.png

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

  • 自動

  • clientsecret : Access Key

  • シークレット トークン : Secret Accesss Key

image-20211231002025526.png

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

image-20211231002059532.png

保存完了です。

image-20211231002143871.png

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

image-20211231002335433.png

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

image-20211231002356523.png

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

image-20211231002519977.png

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

image-20211231002603153.png

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

image-20211231004709210.png

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

image-20211231004821013.png

選択を押します。

image-20211231004844678.png

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

image-20211231004917980.png

割り当てを押します。

image-20211231004950919.png

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

image-20211231005019686.png

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

image-20211231005316020.png

動作確認 : エラー

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

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

image-20211231005505277.png

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

image-20211231005637970.png

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

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

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

image-20211231010715656.png

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

image-20211231010808417.png

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

echo "base64encodedtext" | base64 --decode

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

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

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

      <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

RoleSessionName を変更します。

image-20211231011554115.png

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

image-20211231011625376.png

変わりました。

image-20211231011650528.png

動作確認 : 正常

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

AWS の Icon を選択します。

image-20211231014908475.png

サインインを押します。

image-20211231014947065.png

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

image-20211231015029936.png

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

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

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

image.png

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

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

image.png

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

image.png

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

image.png

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

image.png

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

image.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

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

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?