Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 仅允许EC2实例访问S3上的静态网站_Amazon Web Services_Amazon S3_Amazon Ec2 - Fatal编程技术网

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

Amazon web services 仅允许EC2实例访问S3上的静态网站,amazon-web-services,amazon-s3,amazon-ec2,Amazon Web Services,Amazon S3,Amazon Ec2,我有一个静态网站托管在S3上,我已将所有文件设置为公共文件。 另外,我有一个带有nginx的EC2实例,它充当反向代理,可以访问静态网站,因此S3扮演了源站的角色 我现在想做的是将S3上的所有文件设置为私有文件,这样只有来自nginx EC2的流量才能访问该网站 到目前为止,我已经尝试了以下方法。我已经创建了一个新的策略角色,并将其附加到EC2实例 授予权限的策略:AmazonS3ReadOnlyAccess 并重新启动了EC2实例 "Principal": {

我有一个静态网站托管在S3上,我已将所有文件设置为公共文件。 另外,我有一个带有nginx的EC2实例,它充当反向代理,可以访问静态网站,因此S3扮演了源站的角色

我现在想做的是将S3上的所有文件设置为私有文件,这样只有来自nginx EC2的流量才能访问该网站

到目前为止,我已经尝试了以下方法。我已经创建了一个新的策略角色,并将其附加到EC2实例

授予权限的策略:AmazonS3ReadOnlyAccess

并重新启动了EC2实例

"Principal": {
                "AWS": "arn:aws:iam::XXXXXXXXXX:role/MyROLE"
            },
然后,我在S3 bucket console>权限>bucket策略中创建了一个策略

{
    "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"
            },

但是,这不起作用,我们非常感谢您的帮助。

可以通过以下几种方式授予Amazon S3中的权限:

直接在称为访问控制列表或ACL的对象上 通过应用于整个Bucket或目录的Bucket策略 到IAM用户/组/角色 如果上述任何一项授予访问权限,则可以公开访问该对象

您的场景需要以下配置:

每个对象上的ACL不应允许公共访问 不应该有桶政策 您应该在附加到IAM角色的策略中分配权限 每当您拥有与用户/组/角色相关的权限时,最好在IAM中而不是在Bucket上分配权限。使用Bucket策略对所有用户进行常规访问

关于这一作用的政策将是:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowBucketAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}
此策略直接应用于IAM角色,因此不需要主体字段

请注意,此策略仅允许GetObject-不允许列出存储桶、上载对象等

您还提到我已将所有文件设置为公共文件。如果您通过使每个对象公开可读来实现这一点,那么任何人都可以访问这些对象。有两种方法可以防止这种情况发生——要么删除每个对象的权限,要么创建一个带有拒绝语句的Bucket策略,该语句停止访问,但仍允许角色获得访问权限

这开始变得有点棘手,难以维护,因此我建议删除每个对象的权限。可以通过管理控制台编辑每个对象的权限,或使用以下命令来完成此操作:

aws s3 cp s3://my-bucket s3://my-bucket --recursive --acl private
这会将文件复制到位,但会更改访问设置


我不能100%确定是使用-acl private还是-acl bucket owner完全控制,所以请仔细考虑一下。

可以通过几种方式授予Amazon S3中的权限:

直接在称为访问控制列表或ACL的对象上 通过应用于整个Bucket或目录的Bucket策略 到IAM用户/组/角色 如果上述任何一项授予访问权限,则可以公开访问该对象

您的场景需要以下配置:

每个对象上的ACL不应允许公共访问 不应该有桶政策 您应该在附加到IAM角色的策略中分配权限 每当您拥有与用户/组/角色相关的权限时,最好在IAM中而不是在Bucket上分配权限。使用Bucket策略对所有用户进行常规访问

关于这一作用的政策将是:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowBucketAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}
此策略直接应用于IAM角色,因此不需要主体字段

请注意,此策略仅允许GetObject-不允许列出存储桶、上载对象等

您还提到我已将所有文件设置为公共文件。如果您通过使每个对象公开可读来实现这一点,那么任何人都可以访问这些对象。有两种方法可以防止这种情况发生——要么删除每个对象的权限,要么创建一个带有拒绝语句的Bucket策略,该语句停止访问,但仍允许角色获得访问权限

这开始变得有点棘手,难以维护,因此我建议删除每个对象的权限。可以通过管理控制台编辑每个对象的权限,或使用以下命令来完成此操作:

aws s3 cp s3://my-bucket s3://my-bucket --recursive --acl private
这会将文件复制到位,但会更改访问设置


我不能100%确定是使用-acl private还是-acl bucket owner full control,所以请仔细考虑一下。

如果带有nginx的Amazon EC2实例只是向Amazon S3发出一般的web请求,那么问题就变成了如何在拒绝所有其他请求的同时将来自nginx的请求识别为“允许的”

一种方法是为S3使用VPC端点,它允许从VPC到AmazonS3的直接通信,而不是从Internet网关出去

然后,bucket策略可以限制对bucket的访问,使其只能通过该端点访问

以下是来自以下站点的bucket策略:

以下是 S3 bucket策略的示例,该策略允许仅从ID为vpce-1a2b3c4d的VPC端点访问特定bucket,例如bucket。该策略使用aws:sourceVpce条件键来限制对指定VPC端点的访问

因此,整个设计将是:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowBucketAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}
对象ACL:Private仅删除任何当前公共权限 桶政策:如上所述 IAM角色:不需要 为VPC端点配置的路由表
如果带有nginx的amazonec2实例只是向amazons3发出一般web请求,那么问题就变成了如何将来自nginx的请求识别为“允许”,同时拒绝所有其他请求

一种方法是为S3使用VPC端点,它允许从VPC到AmazonS3的直接通信,而不是从Internet网关出去

然后,bucket策略可以限制对bucket的访问,使其只能通过该端点访问

以下是来自以下站点的bucket策略:

以下是S3 bucket策略的示例,该策略允许仅从ID为vpce-1a2b3c4d的VPC端点访问特定bucket,例如bucket。该策略使用aws:sourceVpce条件键来限制对指定VPC端点的访问

因此,整个设计将是:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowBucketAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}
对象ACL:Private仅删除任何当前公共权限 桶政策:如上所述 IAM角色:不需要 为VPC端点配置的路由表
这方面的问题是。但是,它们确实尊重bucket策略的其他方面,因此解决方案是将对象作为私有上载,将EIP分配给实例,然后在bucket策略中允许从该IP访问:条件:{IpAddress:{aws:SourceIp:[203.0.113.200/32]}假设EIP为203.0.113.200。只要您不使用不支持aws:SourceIp条件的S3 VPC终结点,这项功能就可以正常工作。此外,OP可能希望实例上的IAM角色允许Nginx神奇地从bucket中获取对象,因为Nginx在具有IAM角色的实例上运行,忽略了这样一个事实,即您仍然需要从实例元数据获取临时凭据,并使用它们对请求进行签名和身份验证。。。这将适用于REST端点,但不适用于网站端点。啊!是的,我没有考虑AmazonEC2实例是如何从AmazonS3获取数据的。我的上述建议仅在通过API请求获取时有效,但在仅进行web请求时无效。感谢John Rotenstein和@Michael sqlbot,我想我太天真了,认为EC2实例可以不受限制地访问S3,从它到S3的任何web请求都不需要任何身份验证。是的,这个想法是所有资产都是私有的,因此访问它们的唯一方法应该是通过EC2实例。我是否正确地假设我走在正确的道路上,并且我没有用amazon身份验证头来装饰源自nginx的请求?使用John的其他答案或我的方法,在评论中,如果需要,我可以扩展为完整答案-我使用HAProxy背后的策略,您应该能够通过使用不同的信任机制来避免对请求签名。。。但是是的,按照最初的计划使用实例角色需要使用来自实例角色的临时凭据对请求进行签名,但是这些临时凭据会定期过期,您必须重新获取。乱七八糟的。问题是这个。但是,它们确实尊重bucket策略的其他方面,因此解决方案是将对象作为私有上载,将EIP分配给实例,然后在bucket策略中允许从该IP访问:条件:{IpAddress:{aws:SourceIp:[203.0.113.200/32]}假设EIP为203.0.113.200。只要您不使用不支持aws:SourceIp条件的S3 VPC终结点,这项功能就可以正常工作。此外,OP可能希望实例上的IAM角色允许Nginx神奇地从bucket中获取对象,因为Nginx在具有IAM角色的实例上运行,忽略了这样一个事实,即您仍然需要从实例元数据获取临时凭据,并使用它们对请求进行签名和身份验证。。。这将适用于REST端点,但不适用于网站端点。啊!是的,我没有考虑AmazonEC2实例是如何从AmazonS3获取数据的。我的上述建议仅在通过API请求获取时有效,但在仅进行web请求时无效。感谢John Rotenstein和@Michael sqlbot,我想我太天真了,认为EC2实例可以不受限制地访问S3,从它到S3的任何web请求都不需要任何身份验证。是的,这个想法是所有资产都是私有的,因此访问它们的唯一方法应该是通过EC2实例。我是否正确地认为我走在正确的道路上,我错过了这一点
g使用amazon身份验证头来自nginx的请求?使用John的其他答案或我的方法,在我可以扩展为完整答案的评论中,如果需要-我使用HAProxy背后的策略,您应该能够通过使用不同的信任机制避免对请求签名。。。但是是的,按照最初的计划使用实例角色需要使用来自实例角色的临时凭据对请求进行签名,但是这些临时凭据会定期过期,您必须重新获取。凌乱,似乎合法。我还没有测试VPC端点和承载端点的网站之间的交互,假设这是正在使用的,但它似乎应该工作。似乎是合法的。我还没有测试VPC端点和承载端点的网站之间的交互,假设这就是正在使用的,但它似乎应该可以工作。