伙计们,有件事我真的不明白。底部的 GitLab 运行器无法删除顶部存储桶中的对象。他应该有权限这样做,但我得到的却是以下内容:
删除失败:s3://bucket.domain.com/file.png 调用 DeleteObject 操作时发生错误(AccessDenied):访问被拒绝
S3 权限存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1412062044000",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::321570121925:root"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::bucket.domain.com/*",
"arn:aws:s3:::bucket.domain.com"
]
},
{
"Sid": "Stmt1721016931TBA",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::321570121925:root"
},
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::bucket.domain.com"
}
]
}
“aws sts get-called-identity” 的 GitLab 运行器结果:
{
"Account": "321570121925",
"UserId": "AROAJZ6FNUZ33NL3XQVYK:i-0394709c2c1742643",
"Arn": "arn:aws:sts::321570121925:assumed-role/gitlab-runner-20180419190331730700000002/i-0394709c2c1742643"
}
我已经调查了好几个小时,但这对我来说毫无意义。请帮忙。
答案1
S3 允许跨账户委派权限,以便一个账户中的主体(用户、角色)可以访问另一个账户中的资源。
但是,要做到这一点,两个账户都必须授予必要的权限:拥有存储桶的账户必须委托该权限,而拥有委托人的账户也必须授予该权限。
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxx:root"
},
在存储桶策略中,这将权限委托给外部账户 xxxxxxxxxxxx 的根...但该账户必须使用适当的 IAM 策略进一步将权限委托给其用户/角色。
笔记
要对资源执行特定操作,IAM 用户需要获得其所属的父 AWS 账户和拥有该资源的 AWS 账户的权限。
https://docs.aws.amazon.com/AmazonS3/latest/dev/how-s3-evaluates-access-control.html
上面引用的文档对 S3 如何处理特权检查进行了广泛的概述。