2017-10-20 225 views
2

我试图使用S3存储作为一个简单的虚拟主机,但是想要把它背后的反向代理能够分层一些必要的安全控制措施。AWS桶政策的反向代理

我有,我想限制对S3的Web访问的反向代理相关的IP地址。当我在存储桶策略中应用基于IP的限制时,虽然它似乎使帐户中的管理交互非常难以阻止。

我想不会破坏通过控制台/ IAM用户/联合角色从帐户中访问,但启用HTTP访问S3网站只是反向代理相关的IP地址。

对什么是需要启用Web访问表明,我需要这个政策声明,所以我已经包括它开始与AWS文档。

{ 
    "Id": "S3_Policy", 
    "Statement": [ 
     { 
      "Sid": "AllowWebAccess", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": [ 
       "s3:GetObject" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::mybucket/*" 
      ] 
     } 
    ] 
} 

然后我想限制网络流量到一组特定的IP,所以我添加了这个语句。

{ 
    "Id": "S3_Policy", 
    "Statement": [ 
     { 
      "Sid": "AllowWebAccess", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": [ 
       "s3:GetObject" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::mybucket/*" 
      ] 
     }, 
     { 
      "Sid": "DenyNonProxyWebAccess", 
      "Effect": "Deny", 
      "Principal": "*", 
      "Action": "s3:*", 
      "Resource": [ 
       "arn:aws:s3:::mybucket/*", 
       "arn:aws:s3:::mybucket" 
       ], 
      "Condition": { 
       "NotIpAddress": { 
        "aws:SourceIp": [ 
         "99.99.99.1/32", 
         "99.99.99.2/32", 
         "99.99.99.3/32", 
         "99.99.99.4/32", 
         "99.99.99.5/32" 
        ] 
       } 
      } 
     } 
    ] 
} 

这种拒绝策略具有阻止我从与IAM用户访问我的帐户内的能力的意想不到的后果或联合承担的角色,所以我增加了一个明确允许这些资源。如果可能的话,我想只是为了“账户”而放置一个毯子。这让我有了这个政策,而且这似乎并不符合我的愿望。我似乎无法将其作为我的用户进行管理,也无法从代理访问网络内容。

{ 
    "Id": "S3_Policy", 
    "Statement": [ 
     { 
      "Sid": "AllowWebAccess", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": [ 
       "s3:GetObject" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::mybucket/*" 
      ] 
     }, 
     { 
      "Sid": "DenyNonProxyWebAccess", 
      "Effect": "Deny", 
      "Principal": "*", 
      "Action": "s3:*", 
      "Resource": [ 
       "arn:aws:s3:::mybucket/*", 
       "arn:aws:s3:::mybucket" 
       ], 
      "Condition": { 
       "NotIpAddress": { 
        "aws:SourceIp": [ 
         "99.99.99.1/32", 
         "99.99.99.2/32", 
         "99.99.99.3/32", 
         "99.99.99.4/32", 
         "99.99.99.5/32" 
        ] 
       } 
      } 
     }, 
     { 
      "Sid": "AllowAccountUsersAccess", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": [ 
        "arn:aws:IAM::999999999999:user/[email protected]", 
        "arn:aws:IAM::999999999999:user/[email protected]", 
        "999999999999" 
       ] 
      }, 
      "Action": "s3:*", 
      "Resource": [ 
       "arn:aws:s3:::mybucket/*", 
       "arn:aws:s3:::my bucket" 
      ] 
     } 
    ] 
} 

有没有办法有一个S3存储是仅限于选择的IP范围的网络访问,而无需中断从账户管理桶本身的能力的静态虚拟主机?

回答

1

有访问可以在Amazon S3的桶被授予资源多种方式:

  • IAM权限
  • 桶政策
  • 预标识的URL

如果访问请求满足任何以上,他们将被授予访问权限(虽然拒绝可能会覆盖它)。

IAM权限用于将权限分配给一个用户。例如,如果您想要访问存储桶,则可以添加创建策略并将其作为IAM用户分配给您。如果您希望所有管理员访问存储桶,请将其置于IAM组中,并将策略分配给该组。以这种方式进行的所有访问都需要使用AWS凭据(无匿名访问)完成。

一个桶政策通常用于授予匿名访问(无需证书),但可以包括一些限制,例如IP地址范围,仅支持SSL,和时间的一天。这是您授予访问您的反向代理服务器的方式,因为它不会将凭据作为其请求的一部分发送。

前置签名URL可以通过应用程序生成的授予临时访问到特定对象。该URL包含验证访问的计算签名。这通常用于在HTML页面上生成链接(例如链接到私人图像)。

你的情况

所以,首先,你应该授予访问你自己和你的管理员,使用类似的策略:

{ 
    "Id": "S3_Policy", 
    "Statement": [ 
     { 
      "Sid": "AllowWebAccess", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:GetObject" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::mybucket/*" 
      ] 
     } 
    ] 
} 

注意,没有Principal,因为它适用于任何用户/组已被分配此策略。

接下来,您希望授予对您的反向代理的访问权限。这可以通过一个桶政策来完成:

{ 
    "Id": "S3_Policy", 
    "Statement": [ 
     { 
      "Sid": "DenyNonProxyWebAccess", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:*", 
      "Resource": [ 
       "arn:aws:s3:::mybucket/*", 
       "arn:aws:s3:::mybucket" 
       ], 
      "Condition": { 
       "IpAddress": { 
        "aws:SourceIp": [ 
         "99.99.99.1/32", 
         "99.99.99.2/32", 
         "99.99.99.3/32", 
         "99.99.99.4/32", 
         "99.99.99.5/32" 
        ] 
       } 
      } 
     } 
    ] 
} 

该政策允许(Allow)访问指定的水桶,但前提是请求从规定一个IP地址来。

通过Allow授予访问权总是优于拒绝访问,因为Deny总是覆盖Allow。因此,谨慎使用Deny,因为一旦被拒绝,它就不能被允许(例如,如果拒绝阻止管理访问,则不能再允许访问)。拒绝主要用在你肯定想阻止某些事情的地方(例如一个已知的坏角色)。

VPC端点

最后一个值得考虑的选择是S3使用VPC端点。这允许VPC和S3之间的直接通信,而不必通过互联网网关。这非常适合私有子网中的资源希望与S3进行通信而不使用NAT网关的情况。

可以将附加策略添加到VPC端点以定义哪些资源可以访问VPC端点(例如您的反向代理范围)。存储桶策略可以专门引用VPC终端,允许来自该访问方法的请求。例如,您可以配置允许仅从特定VPC访问的存储桶策略 - 这对于将存取/测试/产品存取分隔为存储区很有用。

但是,它可能不适合您的给定用例,因为它会强制 S3流量通过VPC端点,即使在反向代理之外也是如此。这可能不是你的体系结构所期望的行为。

底线: IAM策略授予用户访问权限。桶策略授予匿名访问权限。

您当然不会“需要”您列出的第一项政策,实际上您应该很少使用该政策,因为它授予对存储区的完整访问权限。