仅允许EC2实例访问S3上的静态网站

gde*_*dev 1 amazon-s3 amazon-ec2 amazon-web-services

我有一个在S3上托管的静态网站,我已将所有文件设置为公开.此外,我有一个带有nginx的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/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

作为主要我已经设置了我在为EC2实例创建角色时获得的ARN.

"Principal": {
                "AWS": "arn:aws:iam::XXXXXXXXXX:role/MyROLE"
            },
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ein 6

如果带有nginx的Amazon EC2实例仅仅是向Amazon S3发出通用Web请求,那么问题就变成了如何将来自nginx的请求标识为"允许",同时拒绝所有其他请求.

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

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

以下是来自Amazon S3的VPC端点的示例存储桶策略的存储桶策略:

以下是S3存储桶策略的示例,该策略examplebucket仅允许从具有ID的VPC端点访问特定存储桶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": "*"
     }
   ]
}
Run Code Online (Sandbox Code Playgroud)

那么,完整的设计将是:

  • 对象ACL:仅限私有(删除任何当前的公共权限)
  • 铲斗政策:如上所述
  • IAM角色:不需要
  • 为VPC端点配置的路由表