CloudFront 自定义策略(签名 Cookie)的多个策略声明

Multiple Policy Statements for CloudFront Custom Policy (Signed Cookies)

在对签名 cookie(非签名 URL)使用 CloudFront 自定义策略时,是否可以创建包含多个语句的策略?

我已经阅读了 documentation,虽然所有的示例都只有一个语句,但我看不到关于允许的语句数量的明确规则。

如果不可能有多个策略声明,将很难为特定用户提供签名 cookie 访问权限,比如仅使用 CloudFront 安全性的五个随机文件。任何关于如何做到这一点的提示将不胜感激。

此问题交叉发布于此:https://forums.aws.amazon.com/thread.jspa?threadID=223440&tstart=0

关于这个问题我不能给出明确的信息,这是一个明确的问题,亚马逊的人可以提供相关信息。

也就是说,我相信 CloudFront 政策可能包含多个声明。他们的架构类似于 IAM 策略,但我认为它不会完全按照您的期望工作。

使用 IAM 策略,您可以将多个语句附加到一个策略,但它们在语句之间进行或运算:

Generally, each statement in a policy includes information about a single permission. If your policy includes multiple statements, a logical OR is applied across the statements at evaluation time. Similarly, if multiple policies are applicable to a request, a logical OR is applied across the policies at evaluation time... IAM Policy Documentation

在您链接到的文档中,Statement 键的值是一个数组,您可以在其中包含多个语句,但它们将在它们之间进行“或”运算。有进一步的信息 on how the policies are evaluated 这将有助于限制对您正在处理的文件的访问。

授予对五个随机文件的访问权限将是一个挑战,我认为仅靠 CloudFront 访问策略是无法完成的。 The conditions available 在设计时并未考虑到此用例。

正如 指出的那样,从脚本中使用 AWS API 可以完成您想要做的事情。不幸的是,这是我能想象的唯一可以完成您正在尝试的方法。

如果您找到一种仅使用 CloudFront 策略(无需其他 AWS 服务)来完成此任务的方法,我将对该解决方案非常感兴趣。这将是一项富有创意的政策,非常有用。

我有类似的要求并使用固定策略测试了 AWS CloudFront,包括多个资源以限制对不同 url 的访问。 该政策是一个有效的 json 对象,如下所示:

{  
  "Statement":[  
    {  
      "Resource":"https://qssnkgp0nnr9vo.cloudfront.net/foo/*",
      "Condition":{  
        "DateLessThan":{  
          "AWS:EpochTime":1492666203
        }
      }
    },
    {  
      "Resource":"https://qssnkgp0nnr9vo.cloudfront.net/bar/*",
      "Condition":{  
        "DateLessThan":{  
          "AWS:EpochTime":1492666203
        }
      }
    }
  ]
}

在我签署政策并向 CloudFront 发送请求后,发现 AWS CloudFront 不支持它。它收到 403 响应,表示这是一个格式错误的策略。

HTTP/1.1 403 Forbidden

<?xml version="1.0" encoding="UTF-8"?><Error><Code>MalformedPolicy</Code><Message>Malformed Policy</Message></Error>

令人沮丧的是,文档中没有任何内容表明您只能在 Statement 数组中包含一个项目,但这是适合您的 AWS 文档!

无论如何,解决此限制的方法是在不同的路径级别设置多个 cookie。您需要为您想要的每个路径生成一个签名的 cookie,并在您使用的任何应用程序中设置每个 cookie。您可以想象 api 中的端点生成所有必要的 cookie,将它们全部设置在 header 中,然后您的前端设置所有这些 cookie。

更具体地说,您需要使用您的云端访问密钥 ID 创建一个 CloudFront-Key-Pair-Id cookie,并将该 cookie path 的范围限定为您的策略将设置的最高级别。 使用 AWS CloudFront SDK 为每个 Resource 签署一个 cookie。为对应于 Resource 路径的每个路径创建一对 CloudFront-PolicyCloudFront-Signature cookie。

假设我有以下两个 Resource 并且想授予对它们的访问权限: https://cfsub.cloudfront.net/animals/dogs/*https://cfsub.cloudfront.net/animals/cats/*

我会创建:

  • 1 CloudFront-Key-Pair-Id 路径为 /animals
  • 的 cookie
  • 1 CloudFront-Policy 带有 base64 策略的 cookie 通过云端签名者从 运行 dogs 自定义策略生成。此 cookie 的路径应为 /animals/dogs.
  • 1 CloudFront-Policy cats
  • 同样的事情
  • 1 CloudFront-Signature 带有签名的 cookie 通过云端签名者从 运行 dogs 自定义策略生成。此 cookie 的路径应为 /animals/cats
  • 1 CloudFront-Signature cats
  • 同样的事情

所有这些 cookie 都应将域设置为您的云端域 cfsub.cloudfront.net

将所有这些发送到您的网络应用程序或移动应用程序。

仅供参考

我也遇到了同样的问题,联系了AWS官方支持团队。

 Hello, thanks for offering us a great service. 
I am an software engineer from Japan. 

Can we have multiple custom policies, like below syntax? 

{ 
  "Statement": [ 
    { ... }, 
    { ... }, 
    { ... }, 
  ] 
} 

I have searched on the web, and found ones who are trying to 
do the same thing and forums/Q&A as well. 

However we found no answer from AWS official support teams 
nor documents saying about that. 

JSON syntax is array, so it seems to work with 
multiple statements but do not work. 

So, if it does not work, would you add a sentence 
about that on the official document?

然后,我昨天得到了答案:

I just heard back this morning. 

You're correct, adding more than one statement 
to a custom policy is not supported. 

I'm updating the documentation now.

因此,我认为几天后文档将更新为您不能为预签名 Cookie 的 CF 自定义策略设置多个策略声明。

AWS 官方只支持一项政策中的一项声明。但是,如果您需要 4 个或更少的语句,则有一个解决方法。对于每个语句,您可以创建一对单独的 CloudFront-Policy cookie 和 CloudFront-Signature 及其 自己的路径 。这对 cookie 的大小约为 600-900 字节。由于 Cookie header 有 4Kb 左右的限制,你绝对不能使用超过 5 对。使用 5 对有很大的变化,可以达到 header 限制。