LoginSignup
0

More than 3 years have passed since last update.

【AWS】 IAMのassumeロールした権限をPrincipalでアクセス制限をかける方法

Last updated at Posted at 2019-06-01

TL;DR

assumeロールした権限をアクセス制限をかける場合はsession namerole nameでの2つのフィルターをかける必要がある

"arn:aws:sts::123456789123:assumed-role/{role_name}/{session_name}",
"arn:aws:iam::123456789123:role/{role_name}"

やりたいこと

  1. ロールAからロールBにassumeロールする
  2. assumeロールした権限でs3にアクセスする
  3. s3には特定のロールのみアクセスを許可させたい

はまった部分

初めにやった構成

  • ロールAにはassumeを許可する設定
iam_policy
{
    "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

iam_policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:Get*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::test_bucket",
                "arn:aws:s3:::test_bucket/*"
            ]
        }
    ]
}
  • s3には特定のロールのみアクセスを許可するバケットポリシーを貼る
buckt_policy
    "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どちらも設定が必要な模様。

最終的に両方設定すると無事アクセスすることができました。

これだとOK
"NotPrincipal": {
                "AWS": [
                  "arn:aws:iam::123456789123:role/{dest_assume_role}", 
                  "arn:aws:iam::123456789123:assumed-role/{dest_assume_role}/{session_name}"
                ]
            },

終わりに

assumeロールした権限をアクセス制限をかける場合はsession namerole 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}/*"

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0