我看过其他类似的问题,但我看不出该怎么做。
我有一个S3桶,所有的公共访问都被封锁了,存储桶打开了服务器端加密。
我希望创建一个具有权限的用户组,允许特定用户查看列出的存储桶(但没有其他用户),并上载,但不允许下载、删除或该桶中的任何其他内容。
我有一个用户组,其权限如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:CreateAccessPoint",
"s3:PutAnalyticsConfiguration",
"s3:PutAccelerateConfiguration",
"s3:PutAccessPointConfigurationForObjectLambda",
"s3:DeleteObjectVersion",
"s3:RestoreObject",
"s3:DeleteAccessPoint",
"s3:CreateBucket",
"s3:ListBucket",
"s3:DeleteAccessPointForObjectLambda",
"s3:ReplicateObject",
"s3:PutEncryptionConfiguration",
"s3:DeleteBucketWebsite",
"s3:AbortMultipartUpload",
"s3:PutLifecycleConfiguration",
"s3:UpdateJobPriority",
"s3:CreateMultiRegionAccessPoint",
"s3:PutBucketVersioning",
"s3:PutObjectAcl",
"s3:PutIntelligentTieringConfiguration",
"s3:PutMetricsConfiguration",
"s3:PutBucketOwnershipControls",
"s3:PutReplicationConfiguration",
"s3:DeleteMultiRegionAccessPoint",
"s3:PutObjectLegalHold",
"s3:UpdateJobStatus",
"s3:PutBucketCORS",
"s3:PutInventoryConfiguration",
"s3:PutObject",
"s3:PutBucketNotification",
"s3:DeleteStorageLensConfiguration",
"s3:PutBucketWebsite",
"s3:PutBucketRequestPayment",
"s3:PutObjectRetention",
"s3:PutBucketLogging",
"s3:CreateAccessPointForObjectLambda",
"s3:PutBucketObjectLockConfiguration",
"s3:ReplicateDelete"
],
"Resource": "arn:aws:s3:::my-bucket"
}
]
}我用Visual创建了它,这对我来说似乎太过了,然而,即使我将用户分配给那个用户组,我仍然无法将一个文件上传到那个桶中,或者看到列出的桶一旦注册为该用户。
我做错了什么?
//编辑//
这是我标记为正确的答案中特别提到的版本:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:GetBucketPublicAccessBlock",
"s3:GetBucketPolicyStatus",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject",
"s3:GetBucketAcl",
"s3:GetBucketLocation",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"s3:GetAccountPublicAccessBlock",
"s3:ListAccessPoints"
],
"Resource": "arn:aws:s3:::*"
}
]
}发布于 2021-12-01 20:14:37
这里有几个问题:
操作的问题是,某些操作与桶相关,有些操作与对象相关,而其他操作与资源类型根本不相关。当您在同一资源语句中同时包含存储ARN (如"arn:aws:s3:::my-bucket"或"arn:aws:s3:::*")和对象ARN (如"arn:aws:s3:::my-bucket/*")时,您可能做错了。
您可以看到桶和对象操作的示例,还可以看到与这些操作相关的具有相应资源类型的S3定义的操作列表。您的策略应该将桶操作应用于存储资源ARN,将对象操作应用于对象资源ARN,理想情况下不应该将它们混合(实际上,这与您在编辑的示例中所做的基本相同)。是的,允许"s3:Get*"同时针对桶ARN和通配符对象ARN这样的操作是很有诱惑力的,但这是不正确的,而且是维护上的麻烦。
例如,您将看到ListAccessPoints没有关联的资源类型。您已经指出了"arn:aws:s3:::*",这是不正确的,将不授予任何(它需要成为"*")。为什么它需要是"*"?根据文档
如果操作不支持资源级权限,则策略中的语句必须在Resource元素中使用通配符(*)。
在我看来,对于AWS来说,这有点不幸,也是一个值得怀疑的选择。
如果您想要一个IAM策略,允许列出所有桶,列出特定桶中的对象,然后上传到相同的桶中,但没有其他内容,那么首先我将:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::my-bucket"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}现在,您可能会发现,在实践中,这是不够的,必须添加额外的操作(我不知道您的客户做什么),但我希望这是一个好的起点。
https://stackoverflow.com/questions/70186814
复制相似问题