【问题标题】:How do I restrict access to a static s3 website to a VPN如何将静态 s3 网站的访问限制为 VPN
【发布时间】:2015-09-20 18:45:38
【问题描述】:

我正在尝试保护对内部静态网站的访问。

公司中的每个人都在使用 VPN 访问我们的 Amazon VPC,所以如果您使用 VPN,我想限制对该站点的访问。

所以我在 AWS 上发现了这个 documentation 来使用 VPC 端点,这似乎是我正在寻找的。​​p>

所以我使用以下策略创建了一个 VPC endoint。

{
  "Statement": [
    {
        "Action": "*",
        "Effect": "Allow",
        "Resource": "*",
        "Principal": "*"
    }
  ]
}

在我的 S3 存储桶上,我确认我可以从常规 Web 和 VPN 访问 index.html。

然后我添加了以下存储桶策略以限制仅 VPC 端点。

{
  "Id": "Policy1435893687892",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1435893641285",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::mybucket/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::123456789:user/op"
        ]
      }
    },
    {
       "Sid": "Access-to-specific-VPCE-only",
       "Action": "s3:*",
       "Effect": "Deny",
       "Resource": ["arn:aws:s3:::mybucket/*"],
       "Condition": {
         "StringNotEquals": {
           "aws:sourceVpce": "vpce-1234567"
         }
       },
       "Principal": "*"
     }
  ]
}

现在普通 Web 得到 403,但当我在公司 VPN 后面时,我也会得到 403。

我错过了什么吗?

【问题讨论】:

  • 仅仅因为您使用 VPN 来访问您的 VPC...与 VPN 用户如何访问 S3 并没有真正的关系。几乎可以肯定,无论您身在何处,您仍然可以通过 Internet 访问 S3。
  • 好吧,一旦在 VPN 上我使用 VPC dns 解析为内部主机名,我的理解是 VPC 终端节点为 s3 存储桶创建了一个 dns 路由规则,然后在您到达终端节点时检测到该规则,并且让你通过。
  • 这不是正确的理解。为 S3 声明 VPC 终端节点不会改变 DNS 的工作方式。它改变的是 VPC 路由表——将流量直接从所选子网路由到 S3,从 VPC 内部,但服务的目标 IP 地址没有被修改。它们仍然是服务 (S3) 的 public 地址。 “前缀列表 ID 逻辑上表示服务使用的公共 IP 地址范围” -- docs.aws.amazon.com/AmazonVPC/latest/UserGuide/… 您选择的 DNS 解析器不是一个因素。
  • Michael - 你的理解不正确...流量不去互联网:“你的实例不需要公共IP地址,你不需要互联网网关,NAT实例,或您的 VPC 中的虚拟私有网关。您的 VPC 和 AWS 服务之间的流量不会离开 Amazon 网络。”我需要查看存储桶的 IP 是什么(我现在不在 VPN 上);但在直接安装后肯定无法从 Internet 访问 - 单存储桶,单 VPC。
  • 如果可以为 S3 存储桶分配一个私有/VPC IP 地址,我认为你很好——如果 VPN 配置为将流量隧道传输到 VPC。如果 S3 存储桶具有 public IP,那么您可以限制来自 S3 端的流量(“仅允许来自此 IP 范围”),但主要问题是如何让 VPN 用户的流量被路由请求 S3 公共 IP 时通过 VPN。

标签: amazon-web-services amazon-s3


【解决方案1】:

@Michael - sqlbot 是对的。

您所做的似乎是限制对 S3 存储桶的访问,您将在其中存储静态 Web 内容的请求使用 VPC 端点来自特定 AWS VPC。

VPC 终端节点在 AWS 服务之间建立关联,以允许来自 VPC 内部的请求。

您无法通过 VPC 和 S3 ACL 配置获得您想要的,但您可以通过 ACL 和一些 VPN 配置获得它。

假设连接到您公司的 VPN 并不意味着所有流量(包括 VPN 客户端和 AWS S3 之间的 Internet 流量)都将通过该 VPN 连接进行路由,因为正常的 VPN 配置通常是这样工作的。如果不是这种情况,请省略以下步骤:

  1. 将到您的 S3 存储桶的静态路由添加到您的 VPN 服务器配置,这样每个客户端都会尝试通过 VPN 访问存储桶,而不是尝试与其建立直接的互联网连接。例如,在 OpenVPN 上,编辑 server.conf,添加以下行:

    push "route yourS3bucketPublicIP 255.255.255.255"

之后您会看到,当客户端连接到 VPN 时,它会在其路由表中添加一个额外条目,对应于告诉它通过 VPN 到达存储桶的静态路由。

  1. 使用 S3 存储桶 ACL 的“IpAddress”字段设置您想要的配置。它应该看起来像这样:

.

{
  "Version": "2012-10-17",
  "Id": "S3PolicyId1",
  "Statement": [
    {
      "Sid": "IPAllow",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::examplebucket/*",
      "Condition": {
         "IpAddress": {"aws:SourceIp": "54.240.143.0/24"},
         "NotIpAddress": {"aws:SourceIp": "54.240.143.188/32"} 
      } 
    } 
  ]
}

您使用IpAddress 字段允许使用CIDR notation 的IP 或IP 范围,而NotIpAddress 字段以相同的方式限制IP 或IP 范围(您可以省略那个)。 IpAddress 上指定的 IP(或 IP 范围)应该是路由贵公司的 VPN 互联网流量的网关接口的公共地址(当有人来自您的 VPN 会尝试连接到它)。

更多信息:

http://www.bucketexplorer.com/documentation/amazon-s3--access-control-list-acl-overview.html

http://aws.amazon.com/articles/5050/

http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-3

https://openvpn.net/index.php/open-source/documentation/howto.html

【讨论】:

  • S3 存储桶有静态 IP 吗?有没有办法分配一个?
  • @Eleni 你有没有找到上面问题的答案?
  • @NotGaeL 你怎么找到上面的yourS3bucketPublicIP?
  • 我研究这个已经有一段时间了,但我认为你可以通过 VPC 端点/弹性 ip 做到这一点。 OP已经弄清楚了那部分。也许检查aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3了解更多信息。
【解决方案2】:

实际上,@Michael - sqlbot 一直是直到 2015 年 5 月 15 日。你所做的是正确的。您找到了允许您在 VPC 中设置 S3 存储桶(可能无法从外部世界访问)的文档(再次正确),与设置 EC2 机器的方式相同。因此,

在我的 S3 存储桶上,我验证我可以从常规 Web 和 VPN 访问 index.html。

是个问题。如果您没有犯错,您不应该能够从常规 Web 访问存储桶。您之后所做的一切都无关紧要 - 因为您没有在连接 VPN 的 VPC内部创建 S3 存储桶。

你没有详细说明你在第一步中做了什么;最简单的可能是删除此存储桶并从头开始。由于需要设置路由表,所以很容易出错。 This 是一组更简单的说明 - 但它所涵盖的内容不如您遵循的文档那么多。

但任何早于此功能的链接(即 2015 年 5 月之前的任何链接)都无关紧要。

【讨论】:

  • 我确实得到了只允许来自 VPC 内部的请求的配置。意思是从常规 Web 我得到 403 和从我们的 AWS 实例之一,如果我 curl 我确实可以访问。不幸的是,即使它使用的是 VPC,我在使用 VPN 时也无法工作。我最终使用了@elcodedocle 描述的解决方案,并通过 VPN 的 IP 地址进行限制
  • @Felix 你是对的,迈克尔也是。连接并非源自 EC2 实例,因此您要么放弃名称解析存储桶的私有地址(坏主意),要么逐个编辑所有 VPN 客户端上的主机文件(或设置/修改内部 DNS并强制所有连接的客户端将其用作主 DNS),添加所需的额外 DNS 配置,以便将存储桶名称解析为其 VPC 私有 IP 而不是公共 IP。
  • 使用存储桶的公共 IP 不需要额外的步骤或复杂性,除了 VPN 服务器配置文件上的那一行。 ACL 也很简单,并不比仅仅阻止所有公共流量复杂多少。最大的好处是您可以轻松地将其他网络添加到 ACL,无论是内部还是外部。
  • @Paté 你能否让它在为你的静态网站启用 SSL/TLS 的情况下工作?
猜你喜欢
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2019-08-04
  • 2019-08-25
  • 1970-01-01
  • 2022-08-04
相关资源
最近更新 更多