【IAM】スイッチロール元のユーザをスイッチロール先で制御する

2023/07/12に公開

背景

  • スイッチロール先のアカウント側にてスイッチ元のユーザごとに権限を制御したいこと、ありますよね。一般的にはロールを分割してしまえばいいかと思います。
  • ただ今回はスイッチするロールは共通で、ロールにアタッチするポリシーにてスイッチ元のユーザを条件分岐させたいと思います。
  • 具体的に利用できるシチュエーションは限られますが、例えば
    - 一括してグループに紐づくユーザ全てを許可している。
    - そんな時に、一部のユーザにのみ特定の上位権限(IAMFullAccess)など上位権限をつけたい場合。

やりたいこと

  • 上図のように
    • AccoutA側
      • User1と2には同じロールにスイッチする権限をアタッチしてある
    • AccoutB側
      • ロールにて以下のように権限のアタッチをする
        • Policy a:User1のみが使えるように制限
        • Policy b:条件なし(User1,2が使える)

方法

  • Policy a側で以下のようなCondition文を実装する
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "IamAdminOnlyUser1",
            "Effect": "Allow",
            "Action": "iam:*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:userid": "<ロールXのユーザID>:<User1>"
                }
            }    
        }
    ]
}

その他トラシュー

  • 以下の方法では実現できませんでした。
  1. スイッチ元のPrincipalを指定する方法
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "IamAdminOnlyUser1",
            "Effect": "Allow",
            "Action": "iam:*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {"aws:PrincipalArn": "arn:aws:sts::XXXXXXXXXX:assumed-role/<role-name>/<User1Name>"}
            }
        }
    ]
}
  1. ArnEqualsで実行主体のArnを指定する方法
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "IamAdminOnlyUser1",
            "Effect": "Allow",
            "Action": "iam:*",
            "Resource": "*",
            "Condition": {
                "ArnEquals": {"aws:PrincipalArn": "arn:aws:sts::XXXXXXXXX:assumed-role/<role-name>/fujiidik/<User1Name>"}
            }
        }
    ]
}

Discussion