【问题标题】:IAM bucket policy to allow cross-account Lambda function to write to S3允许跨账户 Lambda 函数写入 S3 的 IAM 存储桶策略
【发布时间】:2016-03-17 23:28:03
【问题描述】:

我很难弄清楚如何完成这项工作。我们的客户端运行一个 Lambda 函数来生成数据以写入我们的存储桶。 Lambda 承担了一个角色,因此(我认为)我们所有允许客户端的整个帐户访问存储桶的尝试仍然会导致 AccessDenied 错误。

在查看我们的日志时,我看到为 STS 假定角色返回了 AccessDenied。但是,S3 控制台不允许我为通配符 Principal 添加策略,并且代入角色的会话 ID 会在每个会话中更改。

我从稀疏文档中的猜测是,我们需要为 lambda.amazonaws.com 服务提供信任关系。但是我在任何地方都找不到任何关于如何将其限制为仅从特定 Lambda 函数或帐户访问的文档。

我想要这样的东西,但对 Principal 有进一步的限制,因此任何帐户或 Lambda 函数都无法访问它。

{
    "Version": "2012-10-17",
    "Id": "Policy11111111111111",
    "Statement": [
        {
            "Sid": "Stmt11111111111111",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com"
                ]
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket-name-here/*",
                "arn:aws:s3:::bucket-name-here"
            ]
        }
    ]
}

更新

这个政策甚至不起作用。它仍然返回 AccessDenied。日志中列出的用户格式为arn:aws:sts::111111222222:assumed-role/role-name/awslambda_333_201512111822444444

因此,我什至不知道如何允许 Lambda 函数写入 S3 存储桶。

【问题讨论】:

  • 没有为 lambda 函数分配 IAM 角色(文档中的默认值为 LambdaExecRole)您不能编辑角色并分配自定义策略吗?
  • 我相信该角色具有正确的权限,但也会对其进行检查。由于这是跨帐户写入,我发现您必须在两端设置权限,而且通常非常明确。例如,为帐户设置完全控制(通过规范 ID 或策略)不包括必须单独设置的角色。我不知道这如何与服务一起使用。

标签: amazon-s3 amazon-iam aws-lambda


【解决方案1】:

在 IAM 团队的帮助下,我们最终解决了这个问题。

IAM 角色从账户继承任何权限,因此他们需要为 Lambda 脚本明确分配给 assumed role 的权限。

在我们的例子中,Lambda 脚本还试图授予目标存储桶所有者对复制文件的完全控制权。 Lambda 函数承担的角色缺少s3:PutObjectAcl 的权限。 添加权限后,lambda 函数开始正常工作。

我们现在的目的地政策是这样的:

{
  "Version": "2012-10-17",
  "Id": "Policy11111111111111",
  "Statement": [
    {
        "Sid": "Stmt11111111111111",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:ListBucket*",
        "Resource": "arn:aws:s3:::bucket-name",
        "Condition": {
            "StringLike": {
                "aws:userid": "ACCOUNT-ID:awslambda_*"
            }
        }
    },
    {
        "Sid": "Stmt11111111111111",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::bucket-name/*",
        "Condition": {
            "StringLike": {
                "aws:userid": "ACCOUNT-ID:awslambda_*"
            }
        }
    },
    {
        "Sid": "Stmt11111111111111",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::0000000000000:root"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::bucket-name"
    },
    {
        "Sid": "Stmt11111111111111",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::0000000000000:root"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::bucket-name/*"
    }
  ]
}

【讨论】:

    【解决方案2】:

    To Allow Cross account lambda function to get access of s3 bucket
    following policy we need to add to s3 bucket policy externally
    {
                "Sid": "AWSLambda",
                "Effect": "Allow",
                "Principal": {
                    "Service": "lambda.amazonaws.com",
                    "AWS": "arn:aws:iam::<AccountID>:root"
                },
                "Action": "s3:GetObject",
                "Resource": "<AWS_S3_Bucket_ARN>/*"
            }

    以下模板将帮助您允许跨账户 Lambda 函数访问 s3 存储桶

    Parameters:
      LamdaAccountId:
        Description: AccountId to which allow access
        Type: String
    Resources:
      myBucket:
        Type: 'AWS::S3::Bucket'
        Properties: {}
        Metadata:
          'AWS::CloudFormation::Designer':
            id: e5eb9fcf-5fe2-468c-ad54-b9b41ba1926a
      myPolicy:
        Type: 'AWS::S3::BucketPolicy'
        Properties:
          Bucket: !Ref myBucket
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Sid: Stmt1580304800238
                Action: 's3:*'
                Effect: Allow
                Resource:
                  - !Sub 'arn:aws:s3:::${myBucket}/*'
                Principal:
                  Service: lambda.amazonaws.com
                  AWS:
                    - !Sub '${LamdaAccountId}'

    【讨论】:

      猜你喜欢
      • 2021-06-28
      • 2015-08-20
      • 2013-10-25
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2020-03-29
      • 2019-04-23
      相关资源
      最近更新 更多