Php 是否可以基于域或IP访问私有S3文件?

Php 是否可以基于域或IP访问私有S3文件?,php,laravel,amazon-web-services,amazon-s3,Php,Laravel,Amazon Web Services,Amazon S3,我在S3有一个私人水桶。我可以在S3中上传文件,但当我想查看/下载文件时,我会得到一个“拒绝访问” 现在,我无法使用signedURL 我想允许根据我的服务器IP/域下载我的文件。是否可以在bucket策略级别对其进行管理?我在互联网上找到的所有东西都将我的水桶转换成了公共的,这不是我想要的。不确定我们是否有所有细节来了解您的问题,例如,您是否拥有水桶的所有权等 如果您询问IP白名单,这里有一个指南: 因此,是的,如果您对s3拥有必要的所有权,这一切都应该是可能的,您可以使用s3,如所示: 然

我在S3有一个私人水桶。我可以在S3中上传文件,但当我想查看/下载文件时,我会得到一个“拒绝访问”

现在,我无法使用signedURL


我想允许根据我的服务器IP/域下载我的文件。是否可以在bucket策略级别对其进行管理?我在互联网上找到的所有东西都将我的水桶转换成了公共的,这不是我想要的。

不确定我们是否有所有细节来了解您的问题,例如,您是否拥有水桶的所有权等

如果您询问IP白名单,这里有一个指南:

因此,是的,如果您对s3拥有必要的所有权,这一切都应该是可能的,您可以使用s3,如所示:

然而,这很容易规避保护,不应依赖于绝对安全:

aws:referer不应用于阻止未经授权的方直接提出aws请求。它只允许客户保护他们的数字内容,例如存储在Amazon S3中的内容,不被未经授权的第三方网站引用


您可以使用NotIpAddress条件将特定的IP地址限制到bucket。如果您仍然被拒绝访问,请检查文件内容是否未使用KMS密钥加密,如果您没有访问KMS密钥的权限,这将阻止用户通过UI下载文件

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

根据您希望如何使用它,您可以使用以下选项

签名Cookies

如果您试图限制对资产的访问,除非有人公开访问您的网站,那么理想的解决方案是在您的S3存储桶前面添加CloudFront(最好为S3使用一个源,为您的应用程序使用另一个源,但都在同一个域下)

一旦你采用这种方法,你就可以利用它来强制用户至少通过一个安全的签名者进行访问。与签名URL不同,此操作只执行一次,不会影响现有的代码库(资产没有自定义URL)

参考标题

虽然不理想,但当连接到CloudFront发行版时,您可以将referer标头用作bucket策略的条件或规则。很明显,这只是一个标题,任何人都可以设置。如果任何信息敏感,则不要使用此选项

文档中提供了有关此选项的更多信息

专有网络网关端点

如果与S3的唯一通信是通过连接到S3API的实例(例如通过SDK或CLI),则保持S3存储桶私有的首选方法是。如果您从S3在浏览器中公开向用户提供内容,则这将不起作用

通过为S3创建条件,您可以在S3 bucket策略中为
aws:SourceVpce
创建条件,这将允许您将
GetObject
操作仅限于此连接

IP地址

正如您可以通过
referer
标题列出白名单一样,您也可以通过源IP地址列出白名单。此选项仅适用于访问对象的源是固定IP地址的情况,例如EC2实例通过NAT连接出站。如果您正在运行一个公共网站,并且该资产在浏览器中提供服务,则此选项不可行,因为需要列入白名单的IP将是客户端而不是服务器

这可以通过使用
IpAddress
条件的bucket策略来执行,也可以通过将连接到连接到CloudFront的WAF来执行

摘要


以上是所有可用选项,其中一些选项优于其他选项。这一切都取决于您如何使用S3,并且您可以使用多个S3来进一步锁定它。

文件是如何提供的?它们是直接通过浏览器提供的还是你私下下载到服务器上的?我不确定,我必须调查我正在使用的组件…我昨天做了,但发现在应用此策略后我的bucket是公共的…@Juliatzin当然是公共的,仅限于给定的推荐人。如果您不想使用预先签名的URL,唯一的另一个选项是通过CloudFront.NotIpAddress为您的文件提供服务器,但这并不意味着它是一个黑名单?以下示例拒绝任何用户对指定S3存储桶中的对象执行任何Amazon S3操作的权限,除非该请求源自条件中指定的IP地址范围。它更像是一个白名单,拒绝一切,但允许此IPT。此策略甚至会拒绝经过身份验证的访问,除非它来自该IP范围。目标是允许从特定IP进行未经验证的访问(即允许从特定IP进行
s3:GetObject
)。完全不同。在他的问题中没有谈到经过身份验证/未经身份验证的访问
{
  "Version": "2012-10-17",
  "Id": "S3PolicyId1",
  "Statement": [
    {
      "Sid": "IPAllow",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
     "arn:aws:s3:::awsexamplebucket1",
         "arn:aws:s3:::awsexamplebucket1/*"
      ],
      "Condition": {
     "NotIpAddress": {"aws:SourceIp": "54.240.143.0/24"}
      }
    }
  ]
}