如何编写 S3 存储桶策略以*仅*允许特定的 IAM 角色和 Cloudfront 源访问身份?

ktr*_*ace 8 amazon-s3 amazon-cloudfront amazon-iam

我的总体目标:我尝试了几件事并阅读了相关的 AWS 文档,但无法弄清楚如何编写 S3 存储桶策略以仅允许访问特定的 IAM 角色和 Cloudfront 源访问身份 (OAI),并拒绝其他所有人。

到目前为止我尝试过的: 1. 我找到了这个博客,它展示了如何限制 s3 存储桶对特定 IAM 角色的访问:https : //aws.amazon.com/blogs/security/how-to-restrict-amazon- s3-bucket-access-to-a-specific-iam-role/ 2.基于上述博客,我编写了以下存储桶策略。此策略仅允许 MY_IAM_ROLE 允许对名为“myBucket”的存储桶进行所有操作:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::myBucket",
                "arn:aws:s3:::myBucket/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": [
                        "MY_IAM_ROLE_USER_ID:*"
                    ]
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)
  1. 我无法找到一个AWS级的密钥- http://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html -为OAI,我能与 MY_IAM_ROLE_USER_ID 一起插入“aws:userId”数组。我尝试插入 OAI 的 CanonicalUserId,但没有奏效。

我的问题: 如何在单个策略声明中组合 (1) aws:IAM 角色/用户的用户 ID 和 (2) OAI ID?

Ale*_*lix 6

我遇到了同样的问题,我需要将我的存储桶的访问权限限制为 Cloudfront (OAI)、MediaConvert (Role) 和某些用户 (IAM)。

NotPrincipal指令适用于 Cloudfront 和个人用户,但正如 @MuhammadHannad 所说,问题在于,对于角色,您必须列出与其关联的每个会话名称,并且无法通过将通配符与字符串组合来解决此问题,因为此元素不支持它。

使用"Condition": {"StringNotLike": {"aws:userid" [...]}}也不起作用,因为正如您在评论中所说,Cloudfront Origin Access Identity 没有相应的aws:userid.

我终于找到了一个解决方案,而不是使用StringNotLike,我们可以使用"Condition": {"ArnNotLike": {"aws:PrincipalArn": [...]}},其行为方式与 相同NotPrincipal,但可以在资源名称中使用通配符。

{
    "Sid": "1",
    "Effect": "Deny",
    "Principal": "*",
    "Condition": {
        "ArnNotLike": {
            "aws:PrincipalArn": [
                "arn:aws:iam::111122223333:user/S3-USER",
                "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity AAAABBBBCCCC1",
                "arn:aws:iam::111122223333:role/MediaConvertRole",
                "arn:aws:sts::111122223333:assumed-role/MediaConvertRole/*",
                "arn:aws:iam::111122223333:root"
            ]
        }
    },
    "Action": "s3:*",
    "Resource": [
        "arn:aws:s3:::myBucket",
        "arn:aws:s3:::myBucket/*"
    ]
}
Run Code Online (Sandbox Code Playgroud)


Muh*_*nan 5

概括地说,您需要一个存储桶策略来限制对您的 S3 存储桶和内容的访问,但允许访问您的 Cloudfront 源访问身份以及您想要指定的 IAM 角色。我有几种方法可以做到这一点,一种使用 NotPrincipal 元素,另一种使用 Principal 元素。这取决于有多少人在使用您的 IAM 角色,或者您是否计划扩展对该角色的访问量。您可以通过使用 NotPrincipal 元素和显式拒绝在存储桶策略中指定权限来阻止 Amazon 识别和访问管理 (IAM) 实体访问您的 Amazon S3 存储桶。但是,NotPrincipal 不支持通配符。

在此策略示例中,您必须列出将承担该角色的每个用户和每个实例 ID 的角色会话名称:

"Effect": "Deny",
"NotPrincipal": {
"AWS": [
    "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/cross-account-audit-app",
    "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/instanceID",
    "arn:aws:iam::444455556666:role/cross-account-read-only-role",
    "arn:aws:iam::444455556666:root"
    ]
}
Run Code Online (Sandbox Code Playgroud)

要涵盖所有这些用户和实例,您需要在语句中使用通配符来表示假定的角色:

"arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/*"
Run Code Online (Sandbox Code Playgroud)

但是,NotPrincipal 元素不支持通配符。例如,如果您只使用角色或一个实例,这将起作用,但随着您的扩展,您需要为承担该角色的用户/实例添加 ARN。

在此示例中,代替NotPrincipal"Principal": "*"用作每个语句块中的目标实体,其中包括每个 Allow 块的 Condition。通配符用于"aws:userid": ["ROLE-ID:*"]包括调用进程在调用以获取临时凭证时传递的所有名称(例如应用程序、服务或实例 ID)。有关更多信息,请参阅所有请求中可用的信息。包含 root 帐户以防止锁定:

"Condition": {
    "StringLike": {
        "aws:userid": [
            "AROAID2GEXAMPLEROLEID:*",
            "444455556666"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

拒绝块中的 StringNotLike:

"Condition": {
    "StringNotLike": {
        "aws:userid": [
            "AROAID2GEXAMPLEROLEID:*",
            "444455556666"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

这是完整的政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::myExampleBucket",
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::myExampleBucket/*",
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }
        },
        {
            "Sid": "",
            "Effect": "Deny",
            "Principal": "*",
                "Action": "s3:*",
                "Resource": [
                    "arn:aws:s3:::myExampleBucket/*",
                    "arn:aws:s3:::myExampleBucket"
                ],
                "Condition": {
                    "StringNotLike": {
                        "aws:userid": [
                            "AROAID2GEXAMPLEROLEID:*",
                            "444455556666"
                        ]
                    }
                }
            }
        ]
}
Run Code Online (Sandbox Code Playgroud)

笔记:

获取有关 IAM 角色 的信息 以下 get-role 命令获取有关名为 Test-Role 的角色的信息:

aws iam get-role --role-name Test-Role
Run Code Online (Sandbox Code Playgroud)

输出:

{
    "Role": {
        "AssumeRolePolicyDocument": "<URL-encoded-JSON>",
        "RoleId": "AIDIODR4TAW7CSEXAMPLE",
        "CreateDate": "2013-04-18T05:01:58Z",
        "RoleName": "Test-Role",
        "Path": "/",
        "Arn": "arn:aws:iam::123456789012:role/Test-Role"
    }
}
Run Code Online (Sandbox Code Playgroud)

重要说明
基本上,当您使用CloundFront API创建Origin Access Identity 时,您将获得 UserID 和 S3 规范 ID,您必须记下它才能在条件字符串中使用它。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#private-content-creating-oai-api

如果您目前没有 CloudFront 的源访问标识的 ID,请创建一个新的 ID,您可以按照建议保存 ID 元素和 S3 规范 ID。

  • @MuhammadHannad 感谢您发布上述回复,但这并不能解决我的问题。Cloudfront Origin Access Identity **不**基于 IAM,并且没有相应的“aws:userid”值,因此我需要一种与您建议的解决方案不同的解决方案。 (2认同)
  • @ktrace 我的任何解决方案有帮助吗?没有收到任何反馈。 (2认同)