Amazon s3受IP地址限制的预签名URL

use*_*402 3 ip-address amazon-s3 amazon-web-services pre-signed-url

客户端应用程序请求S3的预签名URL.目前,我们限制URL有效的时间,但也希望将其限制为客户端的IP地址.

是否可以创建限于特定IP地址的S3预签名URL?

据我所知,只有CloudFront会让我这样做.

Joh*_*ein 9

是!

首先,值得解释一个预签名URL的概念.

默认情况下,Amazon S3中的对象是私有的.因此,如果有人试图在不提供凭据的情况下访问它,则访问将被拒绝.

例如,这不适用于私有对象:

https://my-bucket.s3.amazonaws.com/foo.json
Run Code Online (Sandbox Code Playgroud)

要授予对对象的临时访问权限,可以生成预签名URL.它看起来类似于:

https://my-bucket.s3.amazonaws.com/x.json?AWSAccessKeyId=AKIAIVJQM12345CY3A3Q&Expires=1531965074&Signature=g7Jz%2B%2FYyqc%2FDeL1rzo7WM61RusM%3D
Run Code Online (Sandbox Code Playgroud)

URL说"我是*这个*特定的访问密钥,我授权临时访问,直到*这个*时间,这是我计算的签名,以证明它是我".

使用预签名URL时,它会临时使用签名实体的权限来访问该对象.这意味着我可以生成,我允许访问的对象的有效预标识的URL,但前期标识的URL将不会如我一般不允许访问对象的工作.

因此,要"创建限制为特定IP地址的S3预签名URL",您应该:

  • 创建一个IAM实体(例如IAM用户),该实体可以访问具有IP地址限制的对象(或整个存储桶),并且
  • 使用该实体生成预签名URL

以下是IAM用户的示例策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "IPAllow",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my-bucket/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "54.22.33.44/32"
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

结果将是一个预先签名的URL,可以成功访问该对象,但由于不符合IP地址限制,S3会拒绝该URL.用户将收到"拒绝访问"消息.