TL;DR
assumeロールした権限をアクセス制限をかける場合はsession name
とrole name
での2つのフィルターをかける必要がある
"arn:aws:sts::123456789123:assumed-role/{role_name}/{session_name}",
"arn:aws:iam::123456789123:role/{role_name}"
やりたいこと
- ロールAからロールBにassumeロールする
- assumeロールした権限でs3にアクセスする
- s3には特定のロールのみアクセスを許可させたい
はまった部分
初めにやった構成
- ロールAにはassumeを許可する設定
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::123456789123:role/{dest_assume_role}"
]
}
]
}
- ロールBにはロールAからのアクセスを許可して、s3へのアクセスを許可
信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789123:role/{source_role}"
]
},
"Action": "sts:AssumeRole"
}
]
}
iam policy
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:Get*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::test_bucket",
"arn:aws:s3:::test_bucket/*"
]
}
]
}
- s3には特定のロールのみアクセスを許可するバケットポリシーを貼る
"Version": "2012-10-17",
"Id": "test",
"Statement": [
{
"Sid": "only-specific-role-access",
"Effect": "Deny",
"NotPrincipal": {
"AWS": "arn:aws:iam::123456789123:role/{dest_assume_role}"
},
"Action": "s3:Get*",
"Resource": [
"arn:aws:s3:::test_bucket",
"arn:aws:s3:::test_bucket/*"
]
}
が、この設定だとassumeして取得した一時キーでs3にアクセスすると、Access Denied
で弾かれます。
直したところ
公式ドキュメントをよく見てみると、特定ユーザーでは別に設定が必要な模様。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_principal.html
特定の引き受けたロールユーザー
"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:assumed-role/role-name/role-session-name" }
そこで 以下のように変更してみる。
"NotPrincipal": {
"AWS": "arn:aws:iam::123456789123:role/{dest_assume_role}"
},
↓
"NotPrincipal": {
"AWS": "arn:aws:iam::123456789123:assumed-role/{dest_assume_role}/{session_name}"
},
が、これでも動きません。どうやら role
+ assume-role
どちらも設定が必要な模様。
最終的に両方設定すると無事アクセスすることができました。
"NotPrincipal": {
"AWS": [
"arn:aws:iam::123456789123:role/{dest_assume_role}",
"arn:aws:iam::123456789123:assumed-role/{dest_assume_role}/{session_name}"
]
},
終わりに
assumeロールした権限をアクセス制限をかける場合はsession name
とrole name
での2つのフィルターをかける必要がある
"arn:aws:sts::123456789123:assumed-role/{role_name}/{session_name}",
"arn:aws:iam::123456789123:role/{role_name}"
ちなみに{session_name}
はクライアント側で設定可能な部分ですが、以下のように*
を使用することができないので、コーディングルールとして{session_name}
を固定させる必要がありそうです。
"arn:aws:sts::123456789123:assumed-role/{role_name}/*"