S3 存储桶策略 IAM 角色显示为 API 密钥

Posted

技术标签:

【中文标题】S3 存储桶策略 IAM 角色显示为 API 密钥【英文标题】:S3 bucket policy IAM role showing up as API key 【发布时间】:2021-08-13 06:28:56 【问题描述】:

我有一个 S3 存储桶,我正在尝试通过 CloudFormation 应用存储桶策略。我想允许两个 IAM 角色访问存储桶,通过在 CloudFormation 模板中的存储桶策略中指定角色的 ARN 来实现。 以下是 CloudFormation 模板:

LandingBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref LandingBucket
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          # yamllint disable-line rule:line-length
          - Sid: "Allow s3 permission"
            Action:
              - s3:PutObject
              - s3:GetObject
              - s3:ListBucket
            Effect: "Allow"
            Resource:
              - !GetAtt LandingBucket.Arn
              - !Sub "$LandingBucket.Arn/*"
            Principal:
              AWS:
                - !Ref IamRoleArn1
                - !Ref IamRoleArn2

参数为:IamRoleArn1: arn:aws:iam::1234:role/xyz, IamRoleArn2: arn:aws:iam::1234:role/abc

控制台的最终策略如下所示


    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "file drop permission",
            "Effect": "Allow",
            "Principal": 
                "AWS": [
                    "arn:aws:iam::1234:role/xyz",
                    "AROxxIECxx"
                ]
            ,
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ]
        
    ]

第一个 Principal 是一个 IAM 角色,然而,第二个看起来像一个 API 密钥,尽管我在 CloudFormation 模板中提到了第二个 IAM 角色 ARN,就像第一个 IAM 角色一样。

为什么第二个角色 ARN 没有出现在存储桶策略中?

【问题讨论】:

你的cloudformation模板可以吗? @Marcin 我已将 cloudformation 模板添加到问题中 从您发布的内容来看,一切似乎都是正确的。我会仔细检查您的问题是否完全代表您使用的真实代码。 你显示的参数都叫IamRoleArn1——不应该是IamRoleArn2吗? AROxxIECxx(唯一 ID)通常会在您引用在引用后被删除的资源时显示。看起来IamRoleArn2 指的是一个已删除/已删除的角色。 【参考方案1】:

这是该特定资源的unique identifier。在这种情况下,它称为 RoleId,而 ARN 只是相同的可读格式。两种表示都指向 AWS 中的相同资源。 尝试运行

 aws iam get-role --role-name "<you role here>"

此命令的输出将包含一个名为 RoleId 的字段,它应该会为您清除所有内容。

AROA开头的唯一标识符表示它是一个角色相关资源。

【讨论】:

以上是关于S3 存储桶策略 IAM 角色显示为 API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

AWS IAM 策略:按用户/角色限制存储桶/文件夹访问?

如何将 S3 存储桶锁定到特定用户和 IAM 角色

S3 存储桶策略可以覆盖 IAM 策略吗?

S3 存储桶策略授予/限制对特定联合用户的访问权限

用于为用户列出 S3 存储桶内的特定文件夹的 IAM 策略

通过 terraform 创建 IAM 用户并在 S3 存储桶中上传密钥和访问密钥