我有一个简单的存储桶,长得像 images.mysite.com
这样,在我的S3和其他包含备份等的存储桶中。
我想允许特定用户能够访问 images.mysite.com
存储桶以上传图片。但是,我不希望他看到任何其他存储桶,甚至不知道它们的存在。
我无法创建这样的策略;每次我尝试限制某些内容,就会阻止列出任何存储桶。
我尝试了一段时间,最终想出了一个可行的解决方案。你必须根据你正在执行的操作使用不同的“资源”。此外,我在先前的答案中包括了一些缺失的操作(例如DeleteObject
),并限制了一些更多的操作(例如PutBucketAcl
)。
以下IAM策略现在对我有效:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::itnighq",
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectVersionAcl"
],
"Resource": "arn:aws:s3:::itnighq/*",
"Condition": {}
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
]
}
与存储桶相关的操作和与对象相关的操作的 arn 必须不同。
ListAllMyBuckets
和GetBucketLocation
权限,涵盖所有S3存储桶(对于资源,使用"arn:aws:s3:::*"
而不是"*"
将起作用)。正如这篇AWS博客文章中所述:“另外需要说明的是,当前无法有选择性地过滤出某些存储桶,因此用户必须获得列出所有存储桶的权限才能访问控制台。” - jwadsack如果不授予ListAllMyBuckets
权限,则无法访问S3控制台。
在我的情况下(也许对于将来的读者也是如此),可接受的替代方案是在登录后直接将用户重定向到您想让他们看到的桶。
要实现这一点,请将以下内容附加到IAM登录URL末尾:/s3/?bucket=bucket-name
完整的登录URL(替换your-alias和bucket-name):
https://your-alias.signin.aws.amazon.com/console/s3/?bucket=bucket-name
IAM策略(替换bucket-name):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-name",
"arn:aws:s3:::bucket-name/*"
]
}
]
}
如需了解如何为用户创建特定存储桶权限,请阅读此博客:http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-amazon-iam/
"Version": "2012-10-17",
。请参见https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_version.html。 - filpa我们的应用场景:为云应用程序的客户提供备份空间,客户可以直接使用常见的S3工具进行访问。当然,没有任何客户应该看到其他客户的内容。
如cloudberryman所解释的,“您可以列出所有存储桶或不列出”。因此,我们必须想出一个解决方法。背景:
向用户授予ListAllMyBuckets权限是必需的,以使AWS S3控制台或S3Fox在连接时不会出现错误提示。但是,ListAllMyBuckets会列出所有存储桶,而不考虑分配的资源(实际上,只有arn:...:::*有效)。如果你问我,这是一个严重的错误。顺便说一句,拒绝对所有存储桶进行ListBucket不会防止它们被列出,因为ListBucket授予权限来列出存储桶的内容。
我考虑了三种可能的解决方法。我选择了最后一种。
(1)使用加密的存储桶名称,例如GUIDs
优点:易于设置
缺点:对于客户端来说管理困难(想象一下在成千上万个GUID中找到特定的GUID)。还显示备份服务使用的存储桶数量=使用备份服务的客户数量。
(2)使用一个存储桶和客户特定的文件夹
这是亚马逊通过其S3/IAM示例建议为某些用户或用户组提供访问权限的方法。请参见: AWS Example IAM Policies
优点:相当容易设置,符合AWS的理念
缺点:强制公开所有存储桶的存在,以便客户可以找到他们的“主目录”存储桶。AWS会计提供存储桶使用统计信息,但不提供文件夹使用统计信息,这使得按客户计算成本变得困难。
(3)不授予ListAllMyBuckets的访问权限
优点:您得到了您想要的:客户无法看到其他客户的存储桶
缺点:客户端无法查看自己的存储桶。S3Browser 提供了一个友好的“无法执行”的消息,并要求输入存储桶名称。S3Fox 在连接到根目录时会抛出错误消息,但如果已知存储桶名称,则允许直接导航到客户端的存储桶。Amazon S3 控制台根本无法工作。
希望这些内容有助于您按需处理 S3 IAM。
尝试使用此策略。还要注意,没有办法让用户仅列出所选的存储桶。您只能列出所有存储桶或不列出任何存储桶。
{
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
]
}
s3:*
才能让它对我起作用。我还有"Resource": ["arn:aws:s3:::your_bucket_here", "arn:aws:s3:::your_bucket_here/*"]
,但这可能不是必需的。 - Michael Yagudaev有一种很好的方法可以让用户访问特定的存储桶,而不会泄露其他存储桶的信息。像下面这样的组策略将只允许用户查看“bucket a”。唯一的问题是,用户只能在连接到给定的存储桶端点时才能访问该存储桶。对于下面的示例,这将是bucket-a.s3.amazonaws.com。此外,该存储桶可能还需要允许“经过身份验证的用户”才能发生这种情况。
{
"Statement": [
{
"Sid": "<EXAMPLE_SID>",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucket-a"
]
},
{
"Sid": "<EXAMPLE_SID>",
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucket-a/*"
]
}
]
}
./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2
对于为什么没有选中答案感到困惑?
让我们逐一分解上述解决方案中的每个策略声明:
此策略声明来自适用于存储桶的内容,但不适用于存储桶本身。这可能不是问题所询问的,因为您无法看到存储桶中的内容。
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}
arn:aws:s3:::your_bucket_here/
)的只读访问权限,同时还允许在存储桶的内容(arn:aws:s3:::your_bucket_here/*
)上进行CRUD操作。{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::your_bucket_here",
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectAclVersion"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
可能是最简单的用例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucket-name"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::bucket-name/*"]
}
]
}
此策略包含以下错误:策略必须包含有效的版本字符串。
- MaximeBernard(包括列表)
的含义,有没有关于如何列出用户被允许获取的存储桶的任何想法?到目前为止(根据所有其他答案),似乎AWS不允许这样做。 - MaximeBernard{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::MyExampleBucket",
"arn:aws:s3:::MyExampleBucket/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"AROAEXAMPLEID:*", #Role ID
"111111111111" #AccountID
]
}
}
}
]
}
IAM政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::MyExampleBucket",
"arn:aws:s3:::MyExampleBucket/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"AROAEXAMPLEID:*", #Role ID
"AIDAEXAMPLEID", #UserID
"111111111111" #AccountID
]
}
}
}
]
}
使用示例: 查询IAM用户信息
aws iam get-user --user-name USER-NAME --profile=ExampleProfile
使用示例: 查询IAM角色信息
aws iam get-role --role-name ROLE-NAME --profile=ExampleProfile
P.S. 注意 S3 存储桶权限控制,未经授权可能无法访问。
https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/
。这样可以避免他们看到整个列表,并且不会改变当前策略。 - treecoder