IAMロールにスイッチロールできるIAMユーザをタグで絞り込みしてみた
こんにちは、クラウド事業統括本部のニシヤマです。
みなさん、AWSアカウントにログインして作業をする際にスイッチロールすると思います。
その際に作業者毎のIAMロールを作成することもあると思いますが、チームで同じAWSアカウントに同じ権限で作業する場合に面倒だったので同じスイッチロールできるIAMユーザをIAMユーザに付与したタグで制御する方法を試してみました。
結論
IAMロールの信頼ポリシーで以下の様にCondition要素で許可するタグのキーとバリューを指定することでスイッチロールできるIAMユーザを制御できます。(IAMユーザにはMFA必須にしています)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<IAMユーザを管理しているAWSアカウントID>:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:PrincipalTag/<タグキー>": "<タグバリュー>"
},
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
以下は試した際の記録なので興味ある方だけ見ていただければOKです。
困ってたこと
AWSアカウント毎にアクセスするIAMユーザを管理するのは、アクセスが異なるだけで同一ユーザのIAMユーザを複数作成が必要だったりと管理が大変です。
そこまでAWSアカウントの数が多くない場合などは、IAMユーザ管理用のAWSアカウントを用意してリソース作成用のAWSアカウントのIAMロールへスイッチロールするケースがあると思います。
スイッチロール可能なプリンシパルはIAMロールの信頼ポリシーで定義しますが、その際に以下の様な問題が発生します。
- プリンシパルにAWSアカウントを指定した場合:AWSアカウントの全てのIAMユーザがスイッチロールできてしまう
- プリンシパルにIAMユーザを指定した場合:スイッチロールするIAMユーザを追加したい場合に専用のIAMロール作成が必要だったり、信頼ポリシーにIAMユーザ追加のメンテが大変
折角、管理用のAWSアカウントでIAMユーザを管理しやすくしたのに意図しないIAMユーザもスイッチロールできてしまうと問題ですが、IAMユーザ毎にIAMロールを作ったり、信頼ポリシーを都度メンテナンスする手間や作業ミスを考えるとかなり大変です。
そこで、IAMユーザを集約管理しつつ限られたユーザのみがスイッチロールできる様にIAMユーザに付与されたタグで制御してみました。
やってみる
環境準備
まず2つ以上のAWSアカウントを用意します
| AWSアカウントID | 用途 |
|---|---|
| 111111111111 | IAMユーザ管理用のAWSアカウント |
| 222222222222 | スイッチロール先のAWSアカウント |
111111111111では以下のIAMユーザを準備します。また、スイッチロールに必要な権限は付与済みの状態とします。
| IAMユーザ | タグキー/バリュー |
|---|---|
| switch-user-blue | SwitchRole-A/True |
| switch-user-green | SwitchRole-B/True |
| switch-user-red | SwitchRole-A/True、SwitchRole-B/True |
また222222222222には以下の信頼ポリシーのIAMロールを作成します。(MFA利用のIAMユーザのみを許可します)
SwitchRole-Aの信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:PrincipalTag/SwitchRole-A": "True"
},
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
SwitchRole-Bの信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:PrincipalTag/SwitchRole-B": "True"
},
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
これで準備は整ったのであとはスイッチロールを試してみるのみです。すでに想像できるかと思いますが結果は以下の様になります。

スイッチロールしてみる
では各IAMロールからスイッチロールして結果を確認します。
IAMユーザ1:switch-user-blue
スイッチ先IAMロール:SwitchRole-A
信頼ポリシーで許可されているタグがついているでスイッチロールできました!

スイッチ先IAMロール:SwitchRole-B
信頼ポリシーで許可されているタグがついていないのでエラーが出てスイッチロールできませんでした!

次のIAMユーザで試してみます。
IAMユーザ2:switch-user-green
スイッチ先IAMロール:SwitchRole-A
今度は想定通りSwitchRole-Aの信頼ポリシーでタグがついていないのでエラーが出てスイッチロールできませんでした!

スイッチ先IAMロール:SwitchRole-B
逆に信頼ポリシーで許可されているタグがついているでスイッチロールできました!

最後に両方のタグがついたIAMユーザで試してみます。
IAMユーザ3:switch-user-red
もちろん想定通り、両方のIAMロールにスイッチできます!


これでIAMロールの信頼ポリシーでスイッチロールできるIAMユーザをIAMユーザに付与したタグで制御で制御できることが確認できましたね。
IAMユーザには最大50個のタグの付与が可能です(上限引き上げ不可)。
今回は異なるタグキーでスイッチ先IAMロールを制御しましたが、同じタグキーで異なるタグバリューを利用することでスイッチできる環境を絞るの様なことも可能です。
また、プリンシパルに複数のAWSアカウントを追加することで同じタグで複数のIAMユーザ管理用のAWSアカウントからのスイッチロールを制御することが可能です。
もちろん、IAMユーザ自身がタグの編集をできてしまうと制御の意味がなくなるので変更を禁止するポリシーの設定が必要になります(タグ編集禁止ポリシー自体の編集も禁止が必要)
作業証跡について
スイッチ先で操作した際に誰が行ったかについてですがCloudTrailからもIAMユーザが確認可能です。これで作業証跡に関しても安心ですね。

まとめ
IAMユーザを集約管理しながら、スイッチロール可能なIAMロールを制御する方法をご紹介しました。環境に合わせがタグの設計次第で色々制御できそうです。
IAMユーザ毎に専用IAMロールを作成して管理も良いですが、権限が同じ場合はIAMロールを共有することで管理の手間を減らせるので活用していきたいですね。
この記事の中で「スイッチ」という単語が何回出てきたか数えたら33件でした。

