【发布时间】:2022-08-19 14:10:35
【问题描述】:
我有一个没有附加 ACL 或策略的 S3 存储桶。它是由 terraform 创建的,如下所示:
resource \"aws_s3_bucket\" \"runners_cache\" {
bucket = var.runners_cache.bucket
}
我创建了一个角色并为其附加了策略;有关详细信息,请参阅以下控制台日志
$ aws iam get-role --role-name bootstrap-test-bootstrapper
{
\"Role\": {
{
\"Role\": {
\"Path\": \"/bootstrap-test/\",
\"RoleName\": \"bootstrap-test-bootstrapper\",
\"RoleId\": \"#SNIP\",
\"Arn\": \"arn:aws:iam::#SNIP:role/bootstrap-test/bootstrap-test-bootstrapper\",
... #SNIP
$ aws iam list-attached-role-policies --role-name bootstrap-test-bootstrapper
{
\"AttachedPolicies\": [
{
\"PolicyName\": \"bootstrap-test-bootstrapper\",
\"PolicyArn\": \"arn:aws:iam::#SNIP:policy/bootstrap-test/bootstrap-test-bootstrapper\"
},
... #SNIP
$ aws iam get-policy --policy-arn arn:aws:iam::#SNIP:policy/bootstrap-test/bootstrap-test-runner
{
\"Policy\": {
\"PolicyName\": \"bootstrap-test-runner\",
\"PolicyId\": \"#SNIP\",
\"Arn\": \"arn:aws:iam::#SNIP:policy/bootstrap-test/bootstrap-test-runner\",
\"Path\": \"/bootstrap-test/\",
\"DefaultVersionId\": \"v7\",
... #SNIP
$ aws iam get-policy-version --policy-arn arn:aws:iam::#SNIP:policy/bootstrap-test/bootstrap-test-runner --version-id v7
{
\"PolicyVersion\": {
\"Document\": {
\"Statement\": [
{
\"Action\": [
\"s3:AbortMultipartUpload\",
\"s3:CompleteMultipartUpload\",
\"s3:ListBucket\",
\"s3:PutObject\",
\"s3:GetObject\",
\"s3:DeleteObject\",
\"s3:PutObjectAcl\"
],
\"Effect\": \"Allow\",
\"Resource\": [
\"arn:aws:s3:::#SNIP-runners-cache/*\",
\"arn:aws:s3:::#SNIP-cloud-infrastructure-terraform-states/*\"
]
},
{
\"Action\": [
\"s3:*\"
],
\"Effect\": \"Allow\",
\"Resource\": [
\"arn:aws:s3:::*\"
]
}
],
\"Version\": \"2012-10-17\"
},
\"VersionId\": \"v7\",
\"IsDefaultVersion\": true,
\"CreateDate\": \"2022-08-18T14:16:33+00:00\"
}
}
tl;dr 这个角色有一个附加的策略,允许在帐户中完全访问 s3。
我可以成功担任这个角色:
$ aws sts assume-role --role-arn arn:aws:iam::#SNIP:role/bootstrap-test/bootstrap-test-bootstrapper --role-session-name test123
{ ... #REDACTED }
$ export AWS_ACCESS_KEY_ID=ASIA2 #REDACTED
$ export AWS_SECRET_ACCESS_KEY=8 #REDACTED
$ export AWS_SESSION_TOKEN=IQoJb #REDACTED
$ aws sts get-caller-identity
{
\"UserId\": \"#SNIP\",
\"Account\": \"#SNIP\",
\"Arn\": \"arn:aws:sts::#SNIP:assumed-role/bootstrap-test-bootstrapper/test123\"
}
但是,一旦我这样做了,我就无法再访问 S3:
$ aws s3 ls #SNIP-runners-cache
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
$ aws s3 ls
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
我错过了什么?是否存在一些阻止访问 S3 的默认行为?我应该如何调试这些 403 错误?
-
你是如何从你担任另一个角色的第一次会议开始的?是否存在权限边界、会话策略或 SCP?
-
@luk2302 我的用户在此帐户中具有管理员权限。
-
您的策略有 2 个允许语句,第二个允许在
arn:aws:s3:::*上的s3:*,这使得第一个语句无关紧要。只是为了测试吗?另请注意,在您的第一条语句中,您有一些对象级操作(例如 PutObject)和一些存储桶级操作(例如 ListBucket),但列出的资源都是对象级 ARN。存储桶级操作需要存储桶 ARN,而不是对象 ARN。 -
@jarmod 当然,第一条语句是无关紧要的。对于角色应该执行的操作,它应该足够了,但是当它不起作用时,我创建了第二条语句来排除任何 IAM 错误配置问题。
-
@luk2302 毕竟你是对的。
标签: amazon-web-services amazon-s3 amazon-iam