【问题标题】:S3 Private BucketS3 私有存储桶
【发布时间】:2018-01-14 02:27:56
【问题描述】:

我正在尝试创建一个访问受限的私有 S3 存储桶。我只希望自己作为用户和 EC2 角色能够访问存储桶。存储桶的目的是存储加密的 SSH 密钥,这些密钥将被复制到自动缩放组中的机器上。现在,当我对存储桶运行 aws sync 时,输出如下:

cogility@ip-10-10-200-113:~$ aws s3 sync s3://sshfolder.companycloud.com/cogility /home/cogility/.ssh
download failed: s3://sshfolder.companycloud.com/cogility/id_rsa to ../cogility/.ssh/id_rsa An error occurred (AccessDenied) when calling the GetObject operation: Access Denied
download failed: s3://sshfolder.companycloud.com/cogility/id_rsa.pub to ../cogility/.ssh/id_rsa.pub An error occurred (AccessDenied) when calling the GetObject operation: Access Denied

我使用具有以下权限的 EC2 角色创建 EC2 实例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "kms:List*",
                "kms:Get*",
                "kms:Describe*"
            ],
            "Resource": "arn:aws:kms:us-west-2:0000000000:key/kms-id-01234567890"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::sshfolder.companycloud.com/*",
                "arn:aws:s3:::sshfolder.companycloud.com"
            ]
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:*",
                "ec2:*",
                "cloudwatch:*",
                "autoscaling:*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "lambda:List*",
                "lambda:Invoke*",
                "lambda:Get*"
            ],
            "Resource": "*"
        }
    ]
}

这是存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::sshfolder.companycloud.com",
                "arn:aws:s3:::sshfolder.companycloud.com/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": [
                        "AROAXXXXXXXXXXXXXXXXX", <-- autoscaling-ec2-role user id
                        "AROAXXXXXXXXXXXXXXXXX",
                        "AIDAXXXXXXXXXXXXXXXXX",
                        "AIDAXXXXXXXXXXXXXXXXX"
                    ],
                    "aws:sourceVpce": "vpce-abc82480d"
                },
                "ArnNotLike": {
                    "aws:SourceArn": "arn:aws:sts::000000000000:assumed-role/autoscaling-ec2-role/"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::000000000000:root"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::sshfolder.companycloud.com",
                "arn:aws:s3:::sshfolder.companycloud.com/*"
            ]
        }
    ]
}

知道为什么我无法从我的 EC2 实例访问 S3 存储桶吗?

【问题讨论】:

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


    【解决方案1】:

    默认情况下,Amazon S3 存储桶是私有的。因此,一种方法是:

    • 不要使用存储桶策略
    • 为您的 IAM 用户和 IAM 角色添加访问存储桶的权限

    或者:

    • 使用存储桶策略向 IAM 用户和 IAM 角色授予访问权限

    两者都足以满足您的需求。

    但是,如果您更加怀疑有人可能会意外授予对存储桶的访问权限(例如,使用 s3:** 的主体),那么您明确拒绝访问该用户和角色以外的任何人的方法是一个很好的方法。

    【讨论】:

      【解决方案2】:

      在您的存储桶策略中允许拒绝王牌。您需要使用 not principal 来实现这一点。

      "Statement": [
          {
              "Effect": "Deny",
              "NotPrincipal": {
                  "AWS": "arn:aws:iam::000000000000:root"
              },
              "Action": "s3:*",
              "Resource": [
                  "arn:aws:s3:::sshfolder.companycloud.com",
                  "arn:aws:s3:::sshfolder.companycloud.com/*"
              ],
              "Condition": {
                  "StringNotLike": {
                      "aws:userId": [
                          "AROAXXXXXXXXXXXXXXXXX", <-- autoscaling-ec2-role user id
                          "AROAXXXXXXXXXXXXXXXXX",
                          "AIDAXXXXXXXXXXXXXXXXX",
                          "AIDAXXXXXXXXXXXXXXXXX"
                      ],
                      "aws:sourceVpce": "vpce-abc82480d"
                  },
                  "ArnNotLike": {
                      "aws:SourceArn": "arn:aws:sts::000000000000:assumed-role/autoscaling-ec2-role/"
                  }
              }
          }
      ]
      

      它只是反转了主要元素。您可以根据需要类似地使用 NotAction 和 NotResource。你可以完全取消你的条件,只对所有条件使用 NotPrincipal,这通常比条件更好。

      这里有一个资源:https://aws.amazon.com/blogs/security/how-to-create-a-policy-that-whitelists-access-to-sensitive-amazon-s3-buckets/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-25
        • 2017-03-19
        • 2018-10-26
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多