AssumeRoleで特定のグループに属する人のみIAMの操作ができるようにする
やりたいこと
特定のIAMグループに属する人のみ、Assumeできるロールを作りたい
ユースケース
このグループに属している人のみ、IAM関連の設定ができる
このグループに属している人のみ、Aプロダクトに関連するAWSリソースの設定ができる
などなど
やり方
「このグループに属している人のみ、IAM関連の設定ができる」を例に
作るもの
IAMグループ
IAMの操作のみを許可するグループを作る(iam-admin)
IAMロール
①権限用IAMロール(iam-operation-auth-role)
実行用IAMロールをAssumeするための権限用ロール
②実行用IAMロール(iam-operation-role)
IAM周りの操作を行うための実行用ロール
ポリシー
①権限用IAMロールをAssumeするためのポリシー(iam-operation-auth-role-assume-policy)
②実行用IAMロールをAssumeするためのポリシー(iam-operation-role-assume-policy)
③IAM操作を許可するためのポリシー(iam-operation-policy)
※③はAWS管理のポリシーを使ってもOK
手順
STEP1: ポリシーを作成する
①権限用IAMロールをAssumeするためのポリシーを作成する
こんな感じ
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "iam-operation-auth-role-assume-policy",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/iam-operation-auth-role"
}
]
}
②実行用IAMロールをAssumeするためのポリシーを作成する
こんな感じ
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "iam-operation-role-assume-policy",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/iam-operation-role"
}
]
}
③IAM操作をするためのポリシーを作成する
こんな感じ
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "iam-operation-policy",
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:GetPolicy",
"iam:GetPolicyVersion",
"iam:ListPolicyVersions",
"iam:ListInstanceProfilesForRole",
"iam:ListRolePolicies",
"iam:TagRole",
"iam:UpdateRoleDescription",
"iam:DeletePolicy",
"iam:CreateRole",
"iam:DeleteRole",
"iam:AttachRolePolicy",
"iam:TagPolicy",
"iam:CreatePolicy",
"iam:DetachRolePolicy",
"iam:ListAttachedRolePolicies",
"iam:UpdateRole",
"iam:UpdateAssumeRolePolicy",
"iam:CreatePolicyVersion"
],
"Resource": [
"arn:aws:iam::<AWS_ACCOUNT_ID>:role/*",
"arn:aws:iam::<AWS_ACCOUNT_ID>:policy/*"
]
}
]
}
STEP2: IAMロールを作成する
①権限用IAMロール(iam-operation-auth-role)を作成する
■信頼関係
プリンシパルにIAMグループは指定できないので、rootを指定する
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "iam-operation-auth-role-trust-policy",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:root"
},
"Action": "sts:AssumeRole"
}
]
}
■許可ポリシー
②実行用IAMロールをAssumeするためのポリシー(iam-operation-role-assume-policy)を付与する
これによって権限用IAMロール(iam-operation-auth-role)を持っていれば、実行用IAMロールを引き受けられるようになる
②実行用IAMロール(iam-operation-role)を作成する
■信頼関係
プリンシパルに①権限用IAMロール(iam-operation-auth-role)を指定することで、権限用IAMロールを持ったものでしか実行用IAMロールを引き受けることができないようにする
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "iam-operation-role-trust-policy",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/iam-operation-auth-role"
},
"Action": "sts:AssumeRole"
}
]
}
■許可ポリシー
③IAM操作をするためのポリシー(iam-operation-role-assume-policy)を付与する
これによって実行用IAMロール(iam-operation-role)を持っていれば、IAM操作ができるようになる
STEP3: IAMグループを作成する
IAM操作権限を付与したいユーザをこのグループに所属させる
■許可ポリシー
①権限用IAMロールをAssumeするためのポリシー(iam-operation-auth-role-assume-policy)を付与する
これによって、権限用IAMロールを引き受けることができ、その結果、実行用IAMロールを引き受け、IAM操作を行うことができる
なぜこんなに複雑になるのか
IAMロールの信頼ポリシーのPrincipalにはIAMグループを指定できないから
IAM ロールの信頼ポリシー (Trust Policy) の Principal には、IAM ユーザ、IAM ロール、AWS サービス、AWS アカウント (root) などを指定できるが、IAM グループは指定できない
なので特定のグループに属する人のみ実行できるロールを付与するケースでは
グループに権限用IAMロールをAssumeできるポリシーをアタッチし
その権限用IAMロールを持つIAMエンティティからのみAssumeが可能な実行用IAMロールを作成する必要がある
直接IAMグループにポリシーをアタッチすれば良くない?
✅ IAM グループに直接ポリシーをアタッチ
→ 永続的な権限を持つ(IAM ユーザーに直接適用)
→ IAM ユーザーが Identity Center へのアクセスを継続的に持つ
→ IAM ユーザーの権限管理が複雑になる可能性がある
✅ IAM ロールを使ったチェーン(AssumeRole を経由)
→ 一時的な権限で Identity Center への操作を許可
→ デフォルトの IAM ユーザーの権限を最小限に抑えられる
→ 特定の操作をするタイミングで権限を昇格させられる
項目 | IAM グループに直接ポリシーをアタッチ | IAM ロールチェーン (AssumeRole) |
---|---|---|
権限の持続性 | 常に Identity Center への権限を持つ | 必要なときのみ一時的に権限を得る |
セキュリティ | 不要なときでも権限があるためリスクがある | 必要なときだけ AssumeRole できるため、最小権限の原則(PoLP)を適用しやすい |
運用のしやすさ | 一度設定すれば簡単だが、権限管理が難しい | 多少手間だが、セキュリティが向上 |
MFA との組み合わせ | IAM グループに MFA を強制するのが難しい | AssumeRole 時に MFA を要求できる |
セッション管理 | 永続的な権限 | AssumeRole で取得した一時的な権限(最大 12 時間) |
「実行したいときはスイッチロールして行ってね」の運用の方がセキュリティ的には良さそう
やってみたがロールチェーンできない問題に直面
AWSマネジメントコンソールでは、スイッチロールを多段で実行できないらしい
解決策
マルチセッションサポートをオンにするといける
Discussion