スイッチロール元のIAMロールを制限してみた

## 背景
企業でAWSを利用しているのであれば企業の共通認証基盤とAWS IAM Identitiy CenterとSSOを構築していると思います。そしてAWSで利用する権限は許可セットとして共通基盤の管理部署によって提供され、ユーザー側からは許可セットのカスタマイズができなくなっていることが多いのでしょうか。

私が関わっているチームでは、共通基盤で使えるIAMロール（許可セットをもとに生成されたもの）の権限が自分たちのチームのユースケースに合わなかったので、スイッチロールすることで自分たちに合った権限を付与することにしました。
同じ許可セットを使う人でもユースケースは異なることがあるので、スイッチロール元の人とIAMロールを絞ることでユースケースに沿った権限管理を実現しました。

このページでは、スイッチロールするときに、誰がどのIAMロールを被っているときにスイッチロールを許可あるいは拒否するかを制限する方法を記述します。

![Shimazushi Miro (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/0052d866-380a-8950-4332-b0cdb6573262.jpeg)

## 結論
信頼関係にアカウントID、ロール名、セッション名を条件として記述することで実現できます。

以下のような書き方です。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<アカウントID>:role/<ロール名>"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "sts:RoleSessionName": "<セッション名>"
                }
            }
        }
    ]
}
```
`arn:aws:iam::<アカウントID>:role/<ロール名>`を被った<セッション名>さんだけがスイッチロールできるようになっています。

## 検証
まずは、スイッチロール先のIAMロールを作成します。
作成画面でいきなり信頼されたエンティティタイプ「カスタム信頼ポリシー」を選んで信頼関係を記述してしまってもよいですが、
今回は権限が絞られていくことを確認するため、「AWSアカウント」を選びます。
同一アカウント内でスイッチロールしたいので↓画像のように選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/ef422d7c-1711-b4ea-ebfa-ce604f5c9cd7.png)

適当なIAMポリシーをアタッチし、名前を付けてIAMロールを作成すると↓画像の様な信頼関係が出来上がりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/21ca02ff-c191-30f1-c5fb-19e27669ef94.png)

この記述は、指定したアカウントIDのどのリソースからでもスイッチロールできます。

実際にスイッチロールしてみます。

![eea30644-7356-4e4a-8432-104f4d6a8a3c_png__1222×956_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/21d28617-e2f4-74b8-61e7-c140a3d33b65.png)

スイッチロールできましたね。

ではこれからスイッチロールできるIAMのロールを制限していきましょう。
次に、スイッチロールを許可したいIAMロールを確認します。
必要な情報は3つです。
- アカウントID
- IAMロール名
- セッション名

共通基盤経由でAWSにログインし、IAMロール'スイッチロール元A'を被ります。
右上に <IAMロール名>/<セッション名> 表示されているのでメモします。

スイッチロール先のIAMロールの信頼関係を以下のように編集します。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "<スイッチロール元 AのARN>"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "sts:RoleSessionName": "<自分のセッション名>"
                }
            }
        }
    ]
}
```

スイッチロールは成功します。（AWSのUI変更中らしく見た目がコロコロ変わってます）
![73e3a505-f1a6-4443-ae56-69a2e237d50b_png__750×1026_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/fe8714ee-b8e6-8bf5-9d5c-c1c850acaff9.png)



次に絞れていることを確認するために、別のIAMロール'スイッチロール元 B'からスイッチロールを試みます。

![8410f9c2-8872-4aaf-9586-b3f4a8e3048c_png__1036×326_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/81910227-168f-36cb-ac97-138131adce45.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/4c67c095-6cb8-2b06-95bd-cdeeab1e6be8.png)

異なるロールからはスイッチロールできないようになっています。

つぎは`スイッチロール元B/自分のセッション名`からのスイッチロールのみを拒否します。
![fb778c02-4ead-4892-b92b-d561d3518ca8_png__3008×1468_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/534c0430-1e28-9510-c566-c17b0182c843.png)

`スイッチロール元 B`からのスイッチロールは失敗し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/86000123-cbb9-8286-204b-4cb0d9503ff3.png)

`スイッチロール元 A`からのスイッチロールは成功します。
![6fdb2257-89d1-449b-be14-b9c4c3b89a22_png__710×1026_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/92d90bc3-ab6c-8817-5ba2-ea6a3b58b01d.png)

## まとめ
スイッチロール先の信頼関係でアカウントID、ロール名、セッション名を条件にして誰がどのIAMロールを被っているときにスイッチロールを許可するかを制限することができます。もし私達のようにIAM Identity Centerと外部IdP側で権限を分けられない場合は、今回紹介した方法を試してみてください。