はじめに
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/
エンタープライズアプリケーションを選びます。
新しいアプリケーションを選択します。
AWS を選択します。
AWS Single-Account Access を選択します。
名前に好きなものを入れて作成をおします。
数秒後、作成完了となります。左側のメニューから、シングルサインオンを選択します。
SAML を選びます。
はい を選ぶ。
フェデレーション メタデータ XML をダウンロードします。
AWS : IAM で Identity Provider の設定
AWS IAM の画面を開き、Identity Provider を追加します。
パラメータをいれて、Add provider を押します
- SAML を選択
- 任意の名前
- Azure AD からダウンロードしたメタデータ XML を指定
追加されました
AWS : IAM Role 管理者権限を作成
Azure AD 経由でログインされたユーザーに紐づける IAM Role を作成します。
入力して Next を押す
- SAML 2.0 Federation を押す
- SAML Provider を選択
- Management Console にログイン可能を選択
ユースケースに合わせた Policy を指定。今回はシンプルにいきたいので、Administrator を指定 (本番環境では、必要最小限の権限にしましょう)
このまま Next を押す
名前などを指定して、Create role を選択
IAM Role が作成される
AWS : IAM Role 読み込み権限を作成
さきほどと同様に、別の 読み込み専用 IAM Role を作成します。
こっちは ReadOnlyAccess を選択します。
適当な名前で作成
AWS : 自動プロビジョニングに利用する IAM User を作成
まず、User に紐づけるための IAM Policy を作成します。
Create Policy を選択します。
Azure AD 側で必要な権限は、IAM Role の参照なので、次の設定を行います。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:ListRoles"
],
"Resource": "*"
}
]
}
Tag は無しのまま。
適当な名前をいれて、Create します。
IAM Policy が作成されました。
この Policy を使うための IAM User を作成します。
適当な名前をいれて、Next を入れます。
- Access Key を Azure AD 側に入力するので、Programmatic access をチェックいれます。
作成した IAM Policy を選択して、Next を押します。
このまま Next を押します。
Create User を押します。
AccessKey, Secret access key を控えておきます。
IAM User が作成されました。
Azure : Azure AD でプロビジョニングの設定
プロビジョニングから、作業の開始を選びます。
パラメータを入れて、テスト接続を押します。
-
自動
-
clientsecret : Access Key
-
シークレット トークン : Secret Accesss Key
テスト接続が OK なので、このまま保存を押します。
保存完了です。
画面を戻した後に、プロビジョニングの開始を押します。
プロビジョニングが開始されました。
プロビジョニングの編集を押します。
プロビジョニングの状態がオンになっていれば OK です。オンになっていない場合は、オンにします。
Azure AD のユーザーを、AWS 側に紐づけを行います。
まずユーザーを選択します。
選択を押します。
このユーザーに紐づけるロールを選択可能です。Admin のロールを選びます。
割り当てを押します。
ユーザーが割り当てられた様子が確認できます。
同様の操作を行って、Role を2個割り当てることもできます。
動作確認 : エラー
Azure AD としての Portal 画面を開きます。既にログインしているので、ID/Password の入力は求められません。
https://myapps.microsoft.com/
Azure AD に登録されているエンタープライズアプリケーションが、このポータル画面に一覧表示されます。この中から、AWS のアイコンを選択します。
AWS マネージメントコンソールで使う IAM Role を選択して、サインインを押します。
エラーのトラブルシュート
エラーになってしまいました・・・。デバッグをしていきます。
RoleSessionName in AuthnResponse must match [a-zA-Z_0-9+=,.@-]{2,64} (service: AWSSecurityTokenService; status code: 400; error code: InvalidIdentityToken)
Developer Tools で Network Tab から、saml を選択し、Payload から、SAMLRespone を Copy する。
この文字列を 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 上でカスタマイズしてみます。
RoleSessionName を変更します。
適当に、user.mail
としておきます。
変わりました。
動作確認 : 正常
再び Azure AD のポータルサイトを開きます。
https://myapps.microsoft.com/
AWS の Icon を選択します。
サインインを押します。
AWS のマネージメントコンソールが開かれます。
なお、このときに、とくに IAM User 側は自動的に作成されているわけではありませんでした。
余談 : 右上に表示される名前について
Identity Provider 経由で AWS のマネージメントコンソールにログインすると、右上に名前が表示されています。
この表示名は IAM Role Name/Role Session Name
という形式になっています。
IAM Role 名は、ここの名前から引っ張ってきています。
Role Session Name は、Azure AD 側の設定方法に依存されます。この記事では、Azure AD 側の設定で、RoleSessionName を user.mail
と指定しています。
この設定によって、Azure AD 側に登録されている User の電子メールの属性を引用して使われています。これらの設定を適宜変更することにより、任意の名前を付けられるようになります。
例えば、ここの RoleSessionName の設定を変更して、特定の文字列を追加すると
右上の表示もこんな感じにかわります。
まとめ
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