我想知道是否可以在存储桶策略中组合两个语句来实现以下方案:
我不确切知道 cdn.example.com 将使用哪些IP地址,因此我不能仅仅依赖IP地址政策。
假设存储桶名为 public ,我尝试了以下策略
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "Allow CDN referrer",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::public/*",
"Condition": {
"StringLike": {
"aws:Referer": "http://cdn.example.com/*"
}
}
},
{
"Sid": "Deny everyone except for a.b.c.d",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::public/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "a.b.c.d"
}
}
}
]
}
这两个陈述的行为与预期一致,但结合后的结果是只有 abcd 能够公开访问存储桶,可能是因为 cdn.example.com IP地址被第二个语句阻止。
此时,我想知道我想要实现的目标是否可行,可能使用不同的陈述,或者根本不可能。
a.b.c.d IP地址不属于cdn.example.com,它是另一个组织的IP地址。
在策略中,我想启用评估HTTP referer OR IP地址的主机。
在重述了这些陈述后,我有以下内容
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "Allow CDN referrer",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::public/*",
"Condition": {
"StringLike": {
"aws:Referer": "http://cdn.example.com/*"
},
"IpAddress": {
"aws:SourceIp": "a.b.c.d"
}
}
}
]
}
然而,问题是两个方案StringLike
和IpAddress
是在 AND 中评估的,而我需要 OR 。
修改
然而,问题是两个方案
StringLike
和IpAddress
是在 AND 中评估的,而我需要 OR 。
根据文档,使用逻辑AND评估更多条件,而在OR中评估单个条件中的更多选项,并且我找不到实现我想要的方法。
答案 0 :(得分:1)
要记住的关键是效果的优先顺序是先拒绝,允许第二(默认拒绝最后)。任何拒绝效果都将覆盖允许效果,如果您没有明确允许访问,则默认情况下会拒绝。
您可能想要做的是将您的第二个条件改为允许政策 - 而不是“拒绝”不是来自该IP的所有人,特别是“允许”该IP。
也可以使用复合条件定义您想要的内容(有关详细信息,请参阅documentation),但在此特定情况下,我认为将第二个策略重新定义为允许将最有效。
答案 1 :(得分:1)
您可以使用2个单独的允许条件作为 OR 条件
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "Allow CDN referrer Http",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::public/*",
"Condition": {
"StringLike": {
"aws:Referer": "http://cdn.example.com/*"
}
}
},
{
"Sid": "Allow CDN referrer IP",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::public/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "a.b.c.d"
}
}
}
]
}