对签名Cookie(非签名网址)使用CloudFront自定义策略时,是否可以创建包含多个语句的策略?
我已阅读documentation,虽然所有示例都只有一个语句,但我看不到关于允许的语句数量的明确规则。
如果无法拥有多个策略声明,则很难为特定用户提供signed-cookie访问权限,即只使用CloudFront安全性的五个随机文件。有关如何做到这一点的任何提示将不胜感激。
此问题在此处交叉发布:https://forums.aws.amazon.com/thread.jspa?threadID=223440&tstart=0
答案 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-Signature
和Resource
Cookie。
假设我有以下两个Resource
,并想要同时访问它们:
https://cfsub.cloudfront.net/animals/dogs/*
https://cfsub.cloudfront.net/animals/cats/*
我要创建:
CloudFront-Key-Pair-Id
Cookie,路径为/animals
CloudFront-Policy
Cookie,其中包含通过cloudfront签名者运行狗自定义策略生成的base64策略。此Cookie的路径应为/animals/dogs
。CloudFront-Policy
猫 CloudFront-Signature
Cookie,其中包含通过cloudfront签名者运行狗自定义策略生成的签名。此Cookie的路径应为/animals/cats
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对具有很大的变化以达到标头限制。