特定のIAM Identity CenterユーザーのみAssumeRoleできるIAMロールを作成する

2023.08.17

はじめに

マルチアカウント環境ではIAM Identity Centerを使ってメンバーアカウントへログインすることが多いかと思います。 今回は特定のIAM Identity CenterユーザーのみAssumeRoleできるIAMロールを作成してみました。

前提

この記事ではマルチアカウント環境を前提としているため、以下については既に有効化・作成されているものとして進めます。

  • Control Tower or Organizations
  • IAM Identity Center
    • メンバーアカウントへログインできるIAM Identity Centerユーザー
    • IAM Identity Centerユーザーが利用するアクセス許可セット

今回は以下2つのIAM Identity Centerユーザーを作成して、Administorator権限のアクセス許可セットでログインしています。

  • User-A
  • User-B

やってみる

AssumeRoleする条件として特定のIAMロールを指定したい場合は、Conditionでaws:useridを指定することで実現可能です。 そのため、最初はuseridを取得してからIAMロールにその値を設定していきます。

SSO作成ロール(SSO-Oparator)のIDを取得

アクセス許可セットによって作成されたIAMロール(ここではSSO-Oparator)のIDを取得します。このIDを使いPrincipalのConditionに指定することで、後ほど作成するIAMロールへAssumeRoleできる範囲を制御することができます。

取得方法は、メンバーアカウントへログインしてアクセス許可セットのIAMロールを確認します。IAMロール名はAWSReservedSSO_${アクセス許可セット名}_ランダムな文字列の形式です。

IAMロール名が確認できたら、CloudShellで以下のコマンドを実行しましょう。${SSO_IAMロール名}を確認したロール名に置き換えてください。

$ aws iam get-role --role-name ${SSO_IAMロール名}

レスポンスとして以下のようなものが返ってきますので、RoleIdの値を控えておいてください。

{
    "Role": {
        "Path": "/aws-reserved/sso.amazonaws.com/ap-northeast-1/",
        "RoleName": "AWSReservedSSO_SSO-Operator_8024796f8153200d",
        "RoleId": "AROARSGOY76EQO3X62REY",
        "Arn": "arn:aws:iam::111111111111:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_SSO-Operator_8024796f8153200d",
        "CreateDate": "2023-08-17T05:37:48+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Federated": "arn:aws:iam::111111111111:saml-provider/AWSSSO_aa8cddd91b0c9203_DO_NOT_DELETE"
                    },
                    "Action": [
                        "sts:AssumeRoleWithSAML",
                        "sts:TagSession"
                    ],
                    "Condition": {
                        "StringEquals": {
                            "SAML:aud": "https://signin.aws.amazon.com/saml"
                        }
                    }
                }
            ]
        },
        "MaxSessionDuration": 43200,
        "RoleLastUsed": {}
    }
}

IAMロールの作成

User-AのみがAssumeRoleできるIAMロールを作成します。IAMロールの作成権限を持ったロール等でメンバーアカウントへログインしてください。

IAMのコンソールからロールを開いて、ロールの作成をクリックします。

信頼されたエンティティはAWSアカウントを選択して次へ進みます。許可ポリシーはなんでも大丈夫です。今回はお試しなのでAdministratorAccessを選択しました。

IAMロール名にと説明をわかりやすいもので入力して作成してください。この画面ではJson形式で表示された信頼されたエンティティの編集ができないため、作成後に編集します。

Principalの編集

作成したIAMロールの詳細を開いて、信頼関係 > 信頼ポリシーを編集をクリックします。

空欄のConditionを以下のように書き換えてください。<RoleId>は最初に取得したアクセス許可セットのIAMロールID、<UserName>はIAM Identity Centerのユーザー名です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<AWS-account-ID>:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
            "aws:userid": [
                "<RoleId>:<UserName>",
                ]
        }
        }
    }
  ]
}

実際に置き換えたらこんな感じになります。

これでUser-Aでログインした人しかAssumeRoleできない状態になりました。

AssumeRoleできるか確認

User-Aでログインし、スイッチできるか試してみます。

コンソール右上から、ロールの切り替えをクリックします。

以下の情報を入力します。

  • アカウント: ログインしているAWSアカウントID
  • ロール: IamRoleForUserA

表示名と色はお好みでどうぞ

ロールの切り替えをクリックした時、AWSコンソールが表示されればOKです。右上にAssumeRole後のIAMロール名が表示されているのが確認できました。

IAM Identity CenterユーザーをUser-Bに切り替えて同じ手順を実施してみます。

すると、AWSコンソールは遷移せずに以下のようなエラーメッセージが表示されました。

IAMロールの信頼ポリシーで制御されているため、AssumeRoleができないためエラーとなっているようです。想定通りIAM Identity CenterユーザーによるAssumeRole制御ができました。

もしUser-BにもAssumeRoleを許可したい場合は、IAMロールの信頼ポリシーに追加すればOKです。

まとめ

特定のIAM Identity CenterユーザーでしかAssumeRoleできないIAMロールを作成してみました。

特定のユーザーのみ追加の権限を与えたい場合には、こうしたAssumeRoleの制御方法を検討してみてはいかがでしょうか?

参考