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

时间:2016-01-09 00:16:35

标签: amazon-web-services amazon-cloudfront

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

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

如果无法拥有多个策略声明,则很难为特定用户提供signed-cookie访问权限,即只使用CloudFront安全性的五个随机文件。有关如何做到这一点的任何提示将不胜感激。

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

4 个答案:

答案 0 :(得分:1)

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

尽管如此,我认为CloudFront策略可能包含多个语句。他们的架构类似于IAM策略,但我认为它不会完全符合您的期望。

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

  

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

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

访问五个随机文件将是一项挑战,我认为单独使用CloudFront访问策略无法实现。 The conditions available并未考虑此用例而设计。

正如Rodrigo M所指出的,使用脚本中的AWS API可以完成您尝试执行的操作。不幸的是,这是我能想象的唯一可以完成你正在尝试的路线。

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

答案 1 :(得分:1)

令人不安的是,文档中没有任何内容表明你只能在Statement数组中有一个项目,但那是AWS的文档!

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

更具体地说,您需要使用您的Cloudfront访问密钥ID创建一个CloudFront-Key-Pair-Id Cookie,并将Cookie path的范围设置为您将设置为策略的最高级别。 使用AWS CloudFront SDK为每个Resource签署一个cookie。为与CloudFront-Policy路径对应的每条路径创建一对CloudFront-SignatureResource Cookie。

假设我有以下两个Resource,并想要同时访问它们: https://cfsub.cloudfront.net/animals/dogs/* https://cfsub.cloudfront.net/animals/cats/*

我要创建:

  • 1 CloudFront-Key-Pair-Id Cookie,路径为/animals
  • 1 CloudFront-Policy Cookie,其中包含通过cloudfront签名者运行自定义策略生成的base64策略。此Cookie的路径应为/animals/dogs
  • 1 CloudFront-Policy
  • 同样的事情
  • 1 CloudFront-Signature Cookie,其中包含通过cloudfront签名者运行自定义策略生成的签名。此Cookie的路径应为/animals/cats
  • 1 CloudFront-Signature
  • 同样的事情

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

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

答案 2 :(得分:0)

我有类似的要求,并且使用固定策略测试AWS CloudFront包含多个资源以限制对不同网址的访问。 该策略是一个有效的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>

答案 3 :(得分:0)

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

相关问题