我的总体目标:我尝试了几件事并阅读了相关的AWS文档,但我无法确定如何编写S3存储桶策略以仅允许访问特定的IAM角色和Cloudfront Origin Access Identity(OAI),并拒绝其他所有人 .
到目前为止我尝试过的内容:1 . 我发现了这个博客,其中展示了如何限制对特定IAM角色的s3桶访问: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:*"
]
}
}
}
]
}
- 我无法为OAI找到一个aws宽的密钥 - http://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html - 我可以将其与MY_IAM_ROLE_USER_ID一起插入"aws:userId"数组 . 我试着插上OAI 's CanonicalUserId but it didn'工作 .
我的问题: How can I combine (1) aws:userid of IAM roles/users and (2) OAI IDs in a single policy statement?
4 回答
这似乎有点远,但找到Origin Access Identity的ID(不是规范的用户ID ...找到以
E
开头并且大约12个字符长的那个)并将其添加到策略中,如下所示:请注意,包含空格的单词“CloudFront Origin Access Identity”是此引用字符串的一部分 . 完全如图所示插入,仅更改12个字符ID .
这可能会阻止此政策拒绝访问OAI . 如果有办法将OAI的用户包含在条件键中,这似乎是唯一可行的解决方案 .
另外,您需要第二个策略声明,即允许对OAI进行必要访问的正常声明 .
回顾一下,您需要一个限制访问S3存储桶和内容的存储桶策略,但允许访问您希望指定的Cloudfront Origin Access Identity以及您的IAM角色 . 我有几种方法可以做到这一点,一个使用NotPrincipal元素,另一个使用Principal元素 . 这取决于有多少人使用您的IAM角色,或者您是否计划扩展对角色的访问权限 . 您可以通过使用NotPrincipal元素和显式拒绝在存储桶策略中指定权限来阻止Amazon Identify和Access Management(IAM)实体访问您的Amazon S3存储桶 . 但是,NotPrincipal不支持通配符 .
在此策略示例中,您必须列出每个用户的角色会话名称以及将承担该角色的每个实例ID:
要覆盖所有这些用户和实例,您需要在语句中使用通配符来表示假定的角色:
However, wildcards are not supported with the NotPrincipal element. 如果您只使用角色或一个实例,这将起作用,但在扩展时,您需要为假定角色的用户/实例添加ARN .
在此示例中,使用
"Principal": "*"
作为每个语句块中的目标实体,而不是NotPrincipal
,其中包括每个允许块的条件 ."aws:userid": ["ROLE-ID:*"]
中使用通配符来包括调用进程(例如应用程序,服务或实例ID)在调用获取临时凭据时传递的所有名称 . 有关更多信息,请参阅所有请求中可用的信息 . 包含root帐户以防止锁定:拒绝块中的StringNotLike:
这是完整的政策:
To get information about an IAM role 以下get-role命令获取有关名为Test-Role的角色的信息:
输出:
我的老答案会支持一些人,但可能不是你的 . 所以,我正在发布另一个答案,它将更准确地满足您的需求 . 以下角色策略将允许访问IAM角色和OAI,并将拒绝其他所有人:
您的问题可以通过将
Deny
语句中的Principal: "*"
替换为引用CloudFront OAI的相应NotPrincipal
,并为CloudFront OAI添加适当的Allow
语句来解决:这样,您的IAM角色将被
aws:userId
条件排除在Deny
语句之外,而您的CloudFront OAI将被NotPrincipal
条件排除 . 所有其他主体仍将被拒绝访问,CloudFront OAI将仅具有您在存储桶策略中直接授予它的权限 .回想起来似乎很简单,这个解决方案当然不是很明显,对于这个答案应该归功于AWS Support,他最近为我回答了同样的问题 .