如何在允许控制台访问的同时将对S3存储桶的访问限制为特定的VPC

时间:2019-01-18 16:37:42

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

我正在设置S3存储桶的一部分,希望将访问限制在VPC上,同时仍然允许从AWS控制台访问存储桶。

按照建议的here,我创建了一个S3端点并将其添加到主路由表中。端点上的策略允许完全访问所有资源。

我创建了一个S3策略(请参见下文)并将其添加到存储桶中。保存策略后,就无法再从控制台访问存储桶。

我还试图以“ aws:username”:“ user1”的形式专门将用户添加到条件“ StringNotEquals”,但无济于事。

{
"Version": "2012-10-17",
"Id": "Policy-S3-Bucket-myBucket",
"Statement": [

    {
        "Sid": "Access-via-VPC-only",
        "Principal": "*",
        "Action": "s3:*",
        "Effect": "Deny",
        "Resource": [
            "arn:aws:s3:::myBucket",
            "arn:aws:s3:::myBucket/*"
        ],
        "Condition": {
            "StringNotEquals": {
                "aws:sourceVpc": "vpc-01c9d66c12345"
            }
        }
    },
    {
        "Sid": "Allow-console-access",
        "Action": [
          "s3:*"
        ],
        "Effect": "Allow",
        "Resource": [
          "arn:aws:s3:::myBucket",
          "arn:aws:s3:::myBucket/*"
      ],
        "Principal": {
          "AWS": [
            "arn:aws:iam::<account-id>:user/user1", "arn:aws:iam::<account-id>:user/user2"
          ]
        }
      }
]
}

预期结果是,只能由上述VPC和AWS控制台访问S3存储桶。

实际结果是:

存储桶概述显示“错误:访问被拒绝”,权限页面(公共访问设置)显示:“您无权查看此配置。请与您的帐户管理员联系以请求访问权限。”

我必须使用root用户登录并删除策略以重新获得对存储桶的访问权限。

3 个答案:

答案 0 :(得分:0)

我找到了一个可行的解决方案。我已经在策略模拟器中对其进行了测试,它在实时环境中似乎也可以正常工作。以下策略可以解决问题:

  handleSubmit = event => {
    event.preventDefault();
    console.log(event.target.checkBoxName.value)
    //console.log(event.target.checkBoxName[].value)   //This gives me error, cannot use [] here

    // fetch(............, {
    //   method: "POST",
    //   headers: { "Content-Type": "application/json" },
    //   body: JSON.stringify({
    //     checkBox: event.target.checkBoxName.value
    //   })
    // })
    //   .then(response => {
    //     console.log(response);
    //     if (response.status === 200) {
    //       console.log('successfully')
    //     } else {
    //       alert('Check your inputs')
    //     }
    //   })
    //   .catch(error => {
    //     alert('Server error')
    //   });
  }

该策略要求sourceVpc字符串或用户名必须与条件中列出的相同。

诚然,该策略是冗长的,并且有大量的复制。如果有人有想法更有效地解决这个问题,我会很高兴。

答案 1 :(得分:0)

技巧似乎是拒绝所有内容,除非它来自用户或VPC,但必须处于相同条件。策略的工作方式是“拒绝”规则优先于所有其他规则,因此,如果您拒绝,则不能再允许随后的规则;已经被拒绝了,就是这样。

顺便说一句,根用户的aws:userid是帐户ID。使用该用户可能是一个不好的做法,但是很好:P

因此,我的存储桶现在仅接受来自VPC和我通过AWS Web控制台登录的用户的流量(这样我就不会在Web控制台中收到访问被拒绝的错误)

{
"Version": "2012-10-17",
"Id": "Policy154336817545456388",
"Statement": [
    {
        "Sid": "Block-if-not-from-VPC-or-Me",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::bucket-name",
            "arn:aws:s3:::bucket-name/*"
        ],
        "Condition": {
            "StringNotEquals": {
                "aws:SourceVpce": "vpce-4598ujfjrhc",
                "aws:userid": "576767373466"
            }
        }
    }
    ]
}

答案 2 :(得分:0)

此政策已经过测试,可以准确提供您所需的信息:

 Statement": {        
        "Sid": "Allow-anonymous-access-from-specific-VPC",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::bucket_name/*",
        "Condition": {
            "StringEquals": {
                "aws:SourceVpc": "some-vpc-id"
            }
        }
    }

这将允许匿名访问来自“ some-vpc-id”的请求,同时允许从AWS控制台进行访问。

您的VPC必须配置S3端点才能正常工作。