【问题标题】:when I try my lambda by assuming role tried to access s3 bucket in different account. I get GetObject operation: Access Denied当我通过假设角色尝试我的 lambda 时,尝试访问不同帐户中的 s3 存储桶。我得到 GetObject 操作:拒绝访问
【发布时间】:2018-02-23 03:19:22
【问题描述】:

我有一个关于 s3 和角色如何跨帐户工作的问题。

我有一个 lambda 函数,该函数在账户 A 中具有角色,在账户 B 中具有 lambda 函数需要访问的存储桶。来自账户 A 的角色对账户 B 中的存储桶具有 s3:* 权限。我们在账户 B 中的存储桶上设置委托人以接受来自账户 A 的角色。存储桶策略还允许存储桶上的 s3:*。像下面的东西。

帐户 A 角色:

{
    "Action": [
        "s3:*"
    ],
    "Resource": [
        "arn:aws:s3:::bucket/*",
        "arn:aws:s3:::bucket"
    ],
    "Effect": "Allow"
}

账户 B 存储桶政策:

{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::account:role/role"
    },
    "Action": "s3:*",
    "Resource": ["arn:aws:s3:::bucket/*","arn:aws:s3:::bucket"]
}

我们遇到的问题是账户 A 中的角色能够对账户 B 中的存储桶执行所有 LIST 操作,但是当我们尝试任何 GET 操作时,我们会被拒绝访问。这没有意义,因为我们在双方都有 s3:* 权限。

我们在设置存储桶或 IAM 策略时是否遗漏了一些东西,可以让它按预期工作?我们尝试了一个与账户 A 中的角色具有相同策略的假设角色,但在账户 B 中,并且在账户 B 中的存储桶上的 LIST 或 GET 操作没有问题。所以有一个解决方法,但我们想看看是否我们可以让原始设置正常工作。

这是我收到的错误消息。

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the GetObject operation: Access Denied

【问题讨论】:

  • 看来你在做正确的事。是否有任何策略(在任一帐户中)可能导致访问被拒绝,从而覆盖允许?您能否向我们展示有效的 LIST 代码和无效的 GET 代码?您还可以包括您收到的确切错误消息吗? (您可以编辑您的问题以添加这些详细信息。)

标签: amazon-web-services amazon-s3 amazon-iam


【解决方案1】:

这是我从 AWS 得到的回复......

在 s3 中,我们有拥有存储桶的存储桶所有者和拥有对象的对象所有者。除非对象所有者授予对象权限,否则除了对象所有者之外,没有人可以访问它。作为存储桶所有者或已被授予存储桶权限的任何人都可以列出存储桶,但读/写操作将导致对象的 403 访问被拒绝。 对象所有者可以使用 --acl bucket-owner-full-control 向存储桶所有者授予权限,这就是我看到的这个 S3 对象的问题。

当您的对象不属于存储桶所有者时,存储桶策略不会继承。在这种情况下,存储桶所有者可以复制该对象以获得所有权。完成此操作后,由存储桶策略授予访问权限的账户 C 或 X 将有权访问该对象。

这是我的解决方法。在账户 B 中创建一个角色“XXX”。并授予从账户 B 中的 s3 存储桶读取的权限。

import boto3
sts_client = boto3.client('sts')
assumed_role_object = sts_client.assume_role(
        RoleArn="<ARN of role XXX>",
        RoleSessionName="AssumeRoleSession1"
    )
# From the response that contains the assumed role, get the temporary
# credentials that can be used to make subsequent API calls

credentials = assumed_role_object['Credentials']
s3_client = boto3.client(
    service_name='s3',
    aws_access_key_id=credentials['AccessKeyId'],
    aws_secret_access_key=credentials['SecretAccessKey'],
    aws_session_token=credentials['SessionToken']
)
response = s3_client.get_object(Bucket=self.bucket, Key=file_name)
file_content = response['Body'].read().decode('utf-8')

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 2021-03-04
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多