【问题标题】:Multiple Policy Statements for CloudFront Custom Policy (Signed Cookies)CloudFront 自定义策略的多个策略声明(签名 Cookie)
【发布时间】:2016-04-13 19:06:21
【问题描述】:

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

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

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

这个问题在这里交叉发布:https://forums.aws.amazon.com/thread.jspa?threadID=223440&tstart=0

【问题讨论】:

  • 你使用 Python 吗?脚本化的解决方案可能是可能的。
  • @RodrigoM 我不确定这个问题有什么关系。一种编程语言可以解决这个问题,但我更感兴趣的是我是否可以通过 CloudFront 策略声明来做到这一点。
  • 每份保单您只能使用一份声明。作为克服限制的一种方式,可能有一种方法可以构建该策略以允许使用某种自动化方法签署任意 URL。
  • 好吧,我可能仅限于每个政策的一项声明——这就是问题所在。但是,如果我是,您能否提供一个示例来说明您在克服限制方面的意思?我不明白。
  • 文档(现在)明确指出:"You can include only one statement."

标签: amazon-web-services amazon-cloudfront


【解决方案1】:

仅供参考

我遇到了同样的问题,并联系了官方 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 自定义策略设置多个策略声明。

【讨论】:

  • 感谢您的明确答复!
【解决方案2】:

令人沮丧的是,文档中没有任何内容表明您只能在 Statement 数组中拥有一项,但这是为您准备的 AWS 文档!

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

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

假设我有以下两个 Resources 并希望同时访问它们: https://cfsub.cloudfront.net/animals/dogs/*https://cfsub.cloudfront.net/animals/cats/*

我会创建:

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

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

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

【讨论】:

  • 您是否针对云端对此进行了测试?
  • 是的,进行了有限的测试,但当时在 ios 和 android 应用程序上保持不变。不过最终还是默默无闻地获得了安全性:) 另外,值得一试新的 lambda @ edge。允许您在云端请求前抛出 lambda,因此如果您的权限可以实时快速查找,您可以控制那里的门。
【解决方案3】:

我无法提供有关此主题的确切信息,这是一个明确的问题,亚马逊的某个人可以提供相关信息。

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

使用 IAM 策略,您可以将多个语句附加到一个策略,但它们在语句之间是 OR'd:

通常,策略中的每个语句都包含有关单个权限的信息。如果您的策略包含多个语句,则在评估时对语句应用逻辑 OR。同样,如果多个策略适用于一个请求,则在评估时跨策略应用逻辑 OR...IAM Policy Documentation

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

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

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

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

【讨论】:

  • 感谢您的回答。尽管这对 IAM 策略完全有意义,但我认为目前在 CloudFront 策略中不可能有多个 Statements。我将等待 AWS 确认并提供来源。
  • 解决此问题的方法是对我提供的内容使用 URL 重写,为每个受保护的 CloudFront 资源生成唯一的 CloudFront 签名 URL。
【解决方案4】:

我有类似的要求,并且使用预设策略测试了 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>

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2018-12-07
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多