非Organizations環境のAWSアカウントにAzure ADのユーザーからSSOしてスイッチロールしてみた
はじめに
こんにちは。大阪オフィスの林です。
前回のエントリで、非Organizations環境のAWSアカウントにAzure ADのユーザーからSSOするところまでを試しました。
前回検証した内容を図で表すと下記の通りで、Azure ADのユーザーからAWSアカウントに対してSSOするところまでで終わっています。
作業する対象が、1つのAWSアカウントのみであれば前回のエントリの内容のみで事足りることもあるかと思いますが、複数のAWSアカウントがあって、その複数のAWSアカウントそれぞれにログインしてAWSの環境を触るケースもあるかと思います。前回のエントリのセットアップをすべてのAWSアカウントで実装すれば対応は出来るものの手間もかかってしまい、全環境で同じ内容のセットアップを行うのは非効率であまり現実的ではありません。
今回やること
そこで、今回の検証ではAzureと連携するAWSアカウントを「Jumpアカウント」として別のAWSアカウントにスイッチロールする踏み台として扱います。他のAWSアカウントに作成するスイッチ先のロールには、フェデレーションしてきたAzure ADのユーザーを識別するポリシーを記述することで、悪意を持った利用者からの想定外のスイッチロールを防止します。※設定方法は後述します。
やってみた
Jumpアカウント側の作業
まずはJumpアカウント側の設定です。前回のエントリでも記載しましたが、AWSにフェデレーションしてきたユーザーはIDプロバイダに割り当てられているロールによって認可されます。通常はJumpアカウントでの操作は不要なケースが多いのでベースとなる権限としては「ReadOnly権限」など弱い権限を割り当てておきます。今回は「ReadOnly権限」に加えてJumpアカウントとして別のAWSアカウントにスイッチするために「AssumeRole」を許可するポリシーも付加しておきます。
それでは、JumpアカウントでAssumeRoleの許可ポリシー割り当てをやっていきたいと思います。
AssumeRoleの許可ポリシー割り当て
IAMのダッシュボード左メニューから「ポリシー」-「ポリシーの作成」を選択します。
「JSON」タブから下記のJOSNをコピペして次のステップに進みます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": [ "*" ] } ] }
次に、IDプロバイダに紐付いているIAMロールに、今作ったAssumeRole用のIAMポリシーを割り当てます。左メニューから「ロール」を選択し、IDプロバイダに紐付けているIAMロールを検索し選択します。
今作ったAssumeRole用のIAMポリシーを検索し、選択し「ポリシーのアタッチ」を選択します。
AssumeRole用のIAMポリシーがIDプロバイダに紐付いているIAMロールにアタッチされました。
スイッチ先のAWSアカウント側の作業
スイッチ先のAWSアカウントでは、スイッチ先となるIAMロールを作成するのですが、不特定多数のユーザーからスイッチされては困るので、作成するIAMロールに割り当てるポリシーでフェデレーションしてきたユーザーを識別して、意図したユーザーからのスイッチしか出来ないようなコントロールを行います。
IAMのダッシュボード左メニューから「ロール」-「ロールの作成」を選択します。
最終的には変更するのですが、ここでは一旦JumpアカウントのAWSIDを入力し、次のステップに進みます。
割り当てる権限は用途に合わせて適宜選択してください。今回は検証なのでAdministratorAccessを選択して進めます。
「信頼関係」タブから「信頼関係の編集」を選択します。ここの設定で、フェデレーションしてきたユーザーを識別して意図したスイッチしか出来ないようなコントロールを行います。
下記のJOSNをコピペして「信頼ポリシーの更新」を選択します。今回の設定では、JumpアカウントのIDプロバイダに紐付いているAzureAD-IdP-Role
というIAMロールによって認可されたユーザー且つsso-test-user-1@hogehoge.onmicrosoft.com
というAzure ADのユーザーIDからのみロールへのスイッチを許可する設定としています。Azure ADのユーザーID先頭の*
はスイッチロール時に付与される変動するIDのため設定時に特定できません。そのため*
としています。Azure ADのユーザーIDの先頭に:
があるので*
としておいても、意図しない他のユーザーIDに許可を与えてしまうことも無いでしょう。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012(JumpアカウントのAWSID 12桁):role/JumpアカウントのIDプロバイダに割り当てたIAMロール(AzureAD-IdP-Role)" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:userid": "*:sso-test-user-1@hogehoge.onmicrosoft.com" } } } ] }
動作確認
それでは動作を見ていきたいと思います。動作確認ではsso-test-user-1@hogehoge.onmicrosoft.com
とsso-test-user-2@hogehoge.onmicrosoft.com
の2つのAzure ADのユーザーからスイッチロールを試して動作を見ていきたいと思います。まずはsso-test-user-1@hogehoge.onmicrosoft.com
からです。
SSO後のAWSマネージメントコンソールの画面から「ロールの切り替え」を選択します。
「アカウント」にスイッチ先のAWSアカウント(12桁)を入力し、「ロール」にスイッチするロールの名前を入力後、「ロールの切り替え」を選択します。
スイッチロールが許可されたユーザー(意図したユーザー)であるため、スイッチロールが成功します。
次にスイッチロールが許可されていないユーザー(意図されていないユーザー)で試してみます。sso-test-user-2@hogehoge.onmicrosoft.com
でSSOしました。
同様の情報でロールの切り替えをしてみますが、許可されていないためスイッチロールが成功しません。
まとめ
AWSだけで完結している環境の場合、JumpアカウントにIAMユーザーを作成しておいて、そのIAMユーザーから別のAWSアカウントにスイッチして操作するというケースはよく聞きますが、Azure ADとSSO連携した場合のスイッチロールについては試したことが無かったので、今回の検証で非常に勉強になりました!Azure ADユーザーを使ったAWSマネージメントコンソールへのSSOをご検討されている方の参考になれば幸いです!
以上、大阪オフィスの林がお送りしました!