🔒

特定のIAMユーザー、AWS SSOユーザーにだけS3オブジェクトへのアクセスを許可する

2022/03/20に公開約3,000字

バケットポリシーに以下のように設定します。

("Action""s3:GetObject"だけなら、"Resource"のうち、"arn:aws:s3:::bucket-name"の方は無くても良いかも)

特定のIAMユーザーにだけ許可する

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowOnlyTargetUsersGetObject",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:PrincipalArn": [
                        "arn:aws:iam::AWS-account-ID:user/user-name",
                        "arn:aws:iam::AWS-account-ID:user/user-name",
			...
                        "arn:aws:iam::AWS-account-ID:user/user-name"
                    ]
                }
            }
        }
    ]
}

user-nameにて指定されたIAMユーザーたちが同じIAMグループに属しているのであれば、IAMグループを指定して許可したいところですが、IAMグループを指定することは不可能なようです(参考記事参照)。

特定のAWS SSOユーザーにだけ許可する

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowOnlyTargetUsersGetObject",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": [
                        "*:user-name",
                        "*:user-name",
			...
                        "*:user-name"
                    ]
                }
            }
        }
    ]
}

user-nameの部分は、taro.yamada@example.comなどになります。

特定のアクセス権限セットにAssume RoleしたAWS SSOユーザーにだけ許可する

AWS SSOユーザーであれば何らかのアクセス権限セット(つまりロール)にAssume Roleしているので、アクセス権限セット単位で許可しても構わなければ以下のように指定することもできます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowOnlyTargetUsersGetObject",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": "AROAxxxxxxxxxxxxxxxxx:*"
                }
            }
        }
    ]
}

AROAxxxxxxxxxxxxxxxxxの部分はロールIDと呼ばれるものです。

マネジメントコンソールからは確認できませんが、以下で確認できます。

$ aws sso login --profile example
$ aws --profile example sts get-caller-identity | jq -r .UserId
AROAxxxxxxxxxxxxxxxxx:taro.yamada@example.com # この前半部分がロールID

なお、同じアクセス権限セットでも、プロビジョニングした先のAWSアカウントによってロールIDは異なるので注意してください。

参考

https://dev.classmethod.jp/articles/aws-principalarn-global-condition-context-keys/

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids

https://dev.classmethod.jp/articles/s3-bucket-acces-to-a-specific-role/

Discussion

ログインするとコメントできます