我的整体目标:我尝试了几件事并阅读了相关的AWS文档,但无法弄清楚如何编写S3存储措施策略以仅允许访问特定的IAM角色和CloudFront Origin访问身份(OAI),并拒绝其他所有人。
我到目前为止尝试的是:1.我找到了这个博客,该博客显示了如何限制S3存储桶访问特定IAM角色的访问:https://aws.amazon.com/blogs/security/how-to-to-restrict-celtrict-astertict-mazon-s3-bucket-access-access-cess-to-cess-to-cess-to-cess-to-ces-to-ces-to-cess-to-access-to-cess-to-cess-to-cess-to-cess-to-cess-to-cess-to-ces-to-co-ces-to-co-ces,a特异性iam-lole/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:*"
]
}
}
}
]
}
- 我找不到AWS范围的密钥-http://docs.aws.amazon.com/amazons3/latest/dev/amazon-s3-policy-keys.html- for oai,我可以将其与my_iam_role_user_id一起插入" AWS:USERID"数组。我尝试插入OAI的Canonicaluserid,但它不起作用。
我的问题:我如何组合(1)AWS:IAM角色/用户的用户ID和(2)单个策略语句中的OAI ID?
我遇到了同样的问题,我需要限制仅访问我对CloudFront(OAI),MediaConvert(角色)和某些用户(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/*"
]
}
要回顾一下,您需要一个限制访问S3存储桶和内容的存储策略,但允许访问您的CloudFront Origin访问访问身份以及您的IAM角色(s)您想指定。我有几种方法可以做到这一点,一个带有非主题元素,另一个带有主要元素。这取决于有多少人在使用您的IAM角色,或者您打算扩展访问该角色的范围。您可以通过使用NotPrincipal Element并显式拒绝在存储措施策略中指定权限,以防止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"
]
}
要涵盖所有这些用户和实例,您需要在声明中的通配符来表示假定的角色:
"arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/*"
但是,通配符不支持NOTPRINCIPAL元素。,如果您只使用自己使用该角色或一个实例,则可以使用,但是随着您的扩展,您需要添加ARN对于使用该角色的用户/实例。
在此示例中,而不是NotPrincipal
,将"Principal": "*"
用作每个语句块中的目标实体,其中包括每个允许块的条件。通配符在"aws:userid": ["ROLE-ID:*"]
中使用,以在调用临时凭据的情况下,包括通话过程传递的所有名称(例如应用程序,服务或实例ID)。有关更多信息,请参阅所有请求中可用的信息。包括根帐户以防止锁定:
"Condition": {
"StringLike": {
"aws:userid": [
"AROAID2GEXAMPLEROLEID:*",
"444455556666"
]
}
}
deny块中的字符串notlike:
"Condition": {
"StringNotLike": {
"aws:userid": [
"AROAID2GEXAMPLEROLEID:*",
"444455556666"
]
}
}
这是完整的策略:
{
"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"
]
}
}
}
]
}
注意:
- 请确保您将示例名称替换为自己的角色ID和存储桶名。
- 在上面的示例中,我正在使用IAM实体的唯一ID。http://docs.aws.amazon.com/iam/latest/userguide/Reference_Identifiers.html#Identifiers-inique-Inique-Ids
获取有关IAM角色的信息以下get-lole命令获取有关名为test-lole的角色的信息:
aws iam get-role --role-name Test-Role
输出:
{
"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"
}
}
重要说明
基本上,当您使用 cloundfront api 创建 Origin访问身份时,您可以获得USERID和S3 canonical ID,并且您必须将其记下来以在条件字符串。http://docs.aws.amazon.com/amazoncloudfront/latest/developerguide/private-content-restricting-access-to-s3.html#private-content-content-content-cortent-coreating-coreating-oai-oai-aai-aapi
如果您当前没有云范围的原始访问标识的ID,请创建一个新的ID,您可以按建议保存ID元素和S3 canonical ID。
我的较旧答案会支持某些人,但可能不准确。因此,我要发布另一个答案,这将更准确地满足您的需求。以下角色政策将允许访问IAM角色和OAI,并将否认其他所有人:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EXXXXXXXXX"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucketname/*"
},
{
"Sid": "2",
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EXXXXXXXXX",
"arn:aws:iam::AWS-account-ID:role/role-name"
]
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucketname/*"
}
]
}
似乎有点远,但是找到Origin Access Iddity的ID(而不是规范用户ID ...找到以E
开头的一个和大约是12个字符),并将其添加到这样的策略中:
"StringNotLike": {
"aws:userId": [
"MY_IAM_ROLE_USER_ID:*",
"arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EXXEXAMPLEXX"
]
}
请注意,包括空格在内的" CloudFront Origin Access身份"一词是该引号字符串的一部分。完全插入它,如图所示,仅更改12个字符ID。
可能会阻止此政策拒绝访问OAI的访问。如果有一种方法可以将OAI的用户包含在条件密钥中,那么这似乎是唯一可能的解决方案。
单独需要第二个策略声明,即将授予OAI必要访问的正常语句。
您的问题可以通过用适当的NotPrincipal
在您的Deny
中替换Principal: "*"
,并引用CloudFront OAI,并为CloudFront OAI添加适当的Allow
语句:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"NotPrincipal": {
"CanonicalUser": "..."
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::myBucket",
"arn:aws:s3:::myBucket/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"MY_IAM_ROLE_USER_ID:*"
]
}
}
},
{
"Effect": "Allow",
"Principal": {
"CanonicalUser": "..."
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::myBucket/*"
}
]
}
以这种方式,您的IAM角色被aws:userId
条件排除在Deny
语句中,而NotPrincipal
条件则排除了CloudFront OAI。所有其他校长仍将被拒绝访问,并且CloudFront OAI仅在存储措施策略中直接授予其权限。
回想起来似乎很简单,这种解决方案当然并不明显,此答案的信用应该是AWS支持,他们最近对我回答了同样的问题。