2017-06-05 114 views
0

我有一个静态网站在S3上托管,我已经将所有文件设置为公开。 另外,我有一个nginx的EC2实例,充当反向代理并可以访问静态网站,因此S3扮演着原点的角色。只允许EC2实例访问S3上的静态网站

现在我想要做的就是将S3上的所有文件设置为私有,以便网站只能通过来自nginx(EC2)的流量访问。

到目前为止,我尝试了以下内容。我创建并连接一个新的政策作用到EC2实例与

策略授予权限:AmazonS3ReadOnlyAccess

而且已经重新启动EC2实例。

然后我在我的S3存储桶控制台>权限>桶政策

{ 
    "Version": "xxxxx", 
    "Id": "xxxxxxx", 
    "Statement": [ 
     { 
      "Sid": "xxxxxxx", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::XXXXXXXXXX:role/MyROLE" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::XXX-bucket/*" 
     } 
    ] 
} 

为主要我已当我创建的EC2实例中的作用,我得到了ARN创建的策略。

"Principal": { 
       "AWS": "arn:aws:iam::XXXXXXXXXX:role/MyROLE" 
      }, 

但是,这不起作用,任何帮助表示赞赏。

回答

3

如果nginx的亚马逊EC2实例仅让一般的web请求到Amazon S3,那么问题变成如何识别来自nginx的请求为“允许”,同时拒绝所有其他请求。

一种方法是使用VPC Endpoint for S3,它允许从VPC直接通信到Amazon S3(而不是通过Internet网关)。

A 存储桶策略然后可以限制对存储桶的访问,以使其只能通过该端点访问。

下面是Example Bucket Policies for VPC Endpoints for Amazon S3铲斗政策:

下面是一个S3桶策略,允许访问特定桶,examplebucket,只从VPC端点ID为vpce-1a2b3c4d的一个例子。该策略使用条件密钥aws:sourceVpce限制对指定VPC端点的访问。

{ 
    "Version": "2012-10-17", 
    "Id": "Policy", 
    "Statement": [ 
    { 
     "Sid": "Access-to-specific-VPCE-only", 
     "Action": "s3:*", 
     "Effect": "Allow", 
     "Resource": ["arn:aws:s3:::examplebucket", 
        "arn:aws:s3:::examplebucket/*"], 
     "Condition": { 
     "StringEquals": { 
      "aws:sourceVpce": "vpce-1a2b3c4d" 
     } 
     }, 
     "Principal": "*" 
    } 
    ] 
} 

所以,完整的设计将是:

  • 对象ACL:只有私人(删除任何现有的公共许可)
  • 桶政策:如上
  • IAM角色:不需要
  • 为VPC端点配置的路由表
+0

看起来合法。我没有测试过VPC端点和托管端点的网站之间的交互,假设这是正在使用的,但它似乎应该起作用。 –

1

权限在亚马逊S3可以以多种方式被授予:

  • 直接在对象(被称为访问控制列表或ACL)
  • 通过一个桶政策(适用于上整个桶,或目录)
  • 要将IAM用户/组/角色

如果上述任何授予访问权限,则该对象可以被公开访问。

您的方案需要以下配置:

  • 每个对象上的ACL应该允许公众访问
  • 应该有没有斗政策
  • 你应该分配权限的政策附加到IAM角色

每当您拥有与用户/组/角色有关的权限时,最好在IAM而不是在桶中分配权限。使用桶策略可以访问所有所有用户

上的作用的政策是:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "AllowBucketAccess", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:GetObject" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::my-bucket/*" 
      ] 
     } 
    ] 
} 

这一政策直接施加到IAM角色,所以没有必要为principal场。

请注意,该政策只允许GetObject - 它不允许桶的上市,上传对象等

您也提到,“我已经将所有的文件是公开的。”如果你通过使每个单独的对象公开可读,那么任何人都可以访问这些对象。有两种方法可以防止这种情况发生 - 可以从每个对象中删除权限,也可以使用拒绝访问的Deny语句创建桶策略,但仍允许角色获得访问权限。

这开始变得有点棘手和难以维护,所以我建议从每个对象中删除权限。这可以通过管理控制台通过编辑每个对象的权限来完成,或者通过使用AWS Command-Line Interface (CLI)用如下命令:

aws s3 cp s3://my-bucket s3://my-bucket --recursive --acl private 

此副本就地文件,但改变了访问设置。

(我不是100%确定是否使用--acl private--acl bucket-owner-full-control,所以周围有点玩。)

+0

问题在于[静态网站端点不支持IAM验证](http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html)。但是,他们确实尊重存储桶策略的其他方面,因此解决方案是将对象上载为私有,为实例分配EIP,然后允许在存储桶策略中使用该IP:''条件“:{”IpAddress “:{”aws:SourceIp“:[”203.0.113.200/32“]}}'(假设EIP为203.0.113.200)。只要您不使用S3 VPC端点(不支持'aws:SourceIp'条件),就可以按预期工作。 –

+0

此外,似乎OP可能期望实例上的IAM角色允许Nginx奇迹般地能够从桶中获取对象,这是因为Nginx运行在具有IAM角色的实例上,忽略了事实您仍然需要从实例元数据中获取临时凭证,并使用它们来签署和验证请求...这可以与REST端点一起使用,但不能与网站端点一起使用。 –

+0

啊!是的,我没有考虑Amazon EC2实例如何从Amazon S3获取数据。我上面的建议只适用于通过API请求获取,但如果仅仅是提出Web请求,则不适用。 –