代码之家  ›  专栏  ›  技术社区  ›  danielgormly

绕过在cloudfront中的S3身份验证中包含x-amz-cf-id头的需要

  •  6
  • danielgormly  · 技术社区  · 6 年前

    我有一个不完全正统的CF->S3设置。此处的相关组件包括:

    1. Cloudfront发行版 origin s3.ap-southeast-2.amazonaws.com

    2. Lambda@Edge函数(原始请求),用于添加S3授权(版本2)查询字符串(使用函数使用的S3策略签名)。

    Lambda返回的请求完全正确。如果我记录uri、主机和查询字符串,就会得到我请求的文件。但是,如果我直接通过Cloudfront链接访问它,请求将失败,因为它不再使用 AWSAccessKeyID ,而是选择使用 x-amz-cf-id (但使用相同的签名、Amz安全令牌等)。 更正:可能无法更换,但需要补充。

    我知道是这样的,因为我已经归还了 StringToSign 以及 SignatureProvided 。除了 AWSAccessKeyID 已替换为 x-amz-cf-id

    这显然是一个非常具体的问题。我可能不得不考虑改造这一架构,但我宁愿不这样做。有几个要求使我陷入了这种不完全正常的设置。

    3 回复  |  直到 5 年前
        1
  •  1
  •   Tamás Sallai    5 年前

    我相信 AWSAccessKeyID => x-amz-cf-id 更换是两种机制的结果:

    首先,您需要配置CloudFront以将查询参数转发到源站。否则,它将剥离所有参数。如果使用S3签名的URL,请确保还基于所有参数进行缓存,否则最终将无法进行任何访问控制。

    其次,CloudFront连接 x-amz-cf-id 对请求的响应 不是S3原点 。您可以在CloudFront控制台上仔细检查源类型,并需要确保它报告为S3。我有一个 blog post 详细描述。

    但在所有请求中添加S3签名时Lambda@Edge违背了目的。如果您希望保持bucket私有,并且只允许CloudFront访问它,那么请使用源访问标识,这正是针对用例的。

        2
  •  0
  •   Yves M. Coder_Naveed    5 年前

    因此,对于身份验证V2或V4 x-amz-cf-id 附加到原始请求且无法访问的标头Lambda@Edge身份验证字符串中必须包含源站请求函数。这是不可能的。

    简单的解决方案是使用Cloudflare中的内置S3集成,使用Lambda@Edgeorigin request函数可以切换存储桶,如果你喜欢我,这就是你想要的目标。对于要使用的每个bucket,添加以下策略以允许CF分发访问bucket中的对象。

    {
        "Version": "2008-10-17",
        "Id": "PolicyForCloudFrontPrivateContent",
        "Statement": [
            {
                "Sid": "1",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <CloudfrontID>"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::<bucket-name>/*"
            }
        ]
    }
    

    CloudfrontID 指的是 身份证件 在下面 源访问标识 ,而不是 Amazon S3规范ID

        3
  •  0
  •   merryzm    4 年前

    X-amz-cf-id是cf的保留标头,它可以通过事件作为事件['Records'][0]['cf']['config']['requestId']获取。您不必使用X-amz-cf-id计算身份验证V4。