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

Posted

技术标签:

【中文标题】Amazon s3 预签名 URL 受 IP 地址限制【英文标题】:Amazon s3 Pre-signed URL restricted by IP address 【发布时间】:2018-12-26 16:19:44 【问题描述】:

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

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

据我所知,只有 CloudFront 允许我这样做。

【问题讨论】:

【参考方案1】:

是的!

首先,有必要解释一下预签名 URL 的概念。

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

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

https://my-bucket.s3.amazonaws.com/foo.json

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

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

URL 显示 “我是 *this* 特定的访问密钥,我授权临时访问直到 *this* 时间,这是我计算的签名以证明它是我”

在使用预签名 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"
                
            
        
    ]

结果将是一个成功访问对象的预签名 URL,但随后被 S3 拒绝,因为不满足 IP 地址限制。用户将收到 Access Denied 消息。

【讨论】:

但是如果我们要动态限制 IP 地址给发出请求的特定最终用户呢? @openwonk 可能是通过以编程方式创建具有 ip 限制的用户并在切换用户后生成签名 url @openwonk 不,这不是为用户的特定 IP 地址生成预签名 URL 的方法。预签名 URL 的目的是时间限制将授予用户对对象的临时访问权限。虽然该用户可以将 URL 发布到世界各地并且其他人将能够在该时间段内访问该对象,但该用户同样可以将文件分发给其他人。因此,假设时间限制足以保护大多数用例,而无需进一步将预签名 URL 限制为特定 IP 地址。 澄清一下:我的提议不要求生成预签名 URL 的应用程序“在同一个 IP 中”。相反,生成预签名 URL 的应用程序只需要使用一组凭据,该凭据具有限制允许访问的内容的策略。尝试访问对象时,使用预签名 URL 的客户端将受到类似限制。 (在生成预签名 URL 时,应用可以使用一组特殊的受限凭据,这可能与应用在其其余操作中使用的身份不同。) @jbooker 是的,我刚刚对其进行了测试,它适用于多个 IP 地址。要指定多个 IP 地址,请使用Cloudflare IP Range Whitelist to S3 bucket through CloudFront : aws 中所示的格式。我为 3 个 IP 地址创建了一个具有 S3 权限的用户,并创建了一个预签名 URL。它可以通过这些 IP 地址工作,但不能通过其他 IP 地址工作。

以上是关于Amazon s3 预签名 URL 受 IP 地址限制的主要内容,如果未能解决你的问题,请参考以下文章

如何使用预签名的 url 将对象放入 amazon s3?

Amazon S3 预签名 URL - 手动或一次性上传无效

使用预签名 URL 上传到 Amazon S3 时限制对象大小

使用预签名 URL 将文件上传到 Amazon S3 时出现 CORS 错误

Android 中 Amazon S3 预签名 URL 的改进

由于授权,无法访问 S3 预签名 URL [重复]