代码之家  ›  专栏  ›  技术社区  ›  Nagalakshmi Srirama

当我通过假设角色来尝试我的lambda时,我尝试访问不同帐户中的s3 bucket。I get GetObject操作:拒绝访问

  •  0
  • Nagalakshmi Srirama  · 技术社区  · 7 年前

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

    在这种情况下,我有一个lambda函数,在帐户a中有一个角色,在帐户B中有一个bucket,lambda函数需要访问该bucket。帐户A中的角色对帐户B中的bucket具有s3:*权限。我们将帐户B中bucket上的主体设置为接受帐户A中的角色。bucket策略还允许在bucket上使用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中的bucket执行所有列表操作,但当我们尝试任何GET操作时,访问被拒绝。这没有意义,因为我们双方都有s3:*权限。

    在bucket或IAM策略的设置过程中,我们是否遗漏了一些可以使其按预期工作的内容?我们尝试了一个与帐户A中的角色具有相同策略的假定角色,但在帐户B中,并且对帐户B中的bucket上的LIST或GET操作没有问题。因此有一个解决方法,但我们想看看是否可以使原始设置正常工作。

    这是我收到的错误消息。

    botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the GetObject operation: Access Denied
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Nagalakshmi Srirama    7 年前

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

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

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

    这是我的工作。在帐户B中创建一个角色“XXX”,并授予从帐户B中的s3 bucket读取的权限。

    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')