6

我想将WAF放在API网关前面,并且通过(little) info我发现只有在APIG前面手动添加一个启用了WAF的额外Cloudfront分配。这有点令人遗憾,尤其是因为APIG现在支持本地的自定义域名,但它应该可以工作。AWS Cloudfront(带WAF)+ API网关:如何通过Cloudfront强制访问?

我们使解决方案的安全,而不仅仅是模糊的,我想执行这些API只能通过发行的Cloudfront进行访问。 这样做的最佳选择是什么?

  • 我一直希望能够使用类似于S3的'Origin Access Identities',但没有看到如何做到这一点。
  • 如果我能分配一个IAM用户(或角色?)给的Cloudfront发行版,我可以用APIG IAM功能,但我看不出如何可以做到这一点。
  • 我可能需要APIG中的API密钥,并将其作为来自Cloudfront的原始自定义标头传递。这可以起作用,只要我们不希望将API密钥用于其他目的,所以我并不完全为此感到高兴。
  • 可以使用虚拟(!)自定义授权者,令牌验证表达式实际检查作为Cloudfront的原始自定义标头传递的秘密。应该工作,它更灵活,但有点肮脏...或不?

更好的想法?或者,也许“正确的方式”做到这一点,但我忽略了它?

+1

子弹1和2是不合格的。 CloudFront使用原始访问身份*代替IAM角色/用户,但仅适用于S3 ...因此子弹3和4是获胜者。我很惭愧地承认,虽然4对我来说很明显,但我没有想到3,除非你想要API密钥,否则这似乎更好。 –

回答

4

我来自API网关。

不幸的是,我们截至目前就是最好的解决方案注入的CloudFront的原点自定义页眉和验证,在一个自定义的认证器(选项4在你的问题)。

我们已经意识到这种限制和不太好的解决方法。我们期待在未来提供更好的WAF集成,但我们没有ETA。

+2

您不知道这对我们有多大麻烦,请添加WAF集成API网关ASAP – sscarduzio

+3

现在您可以使用区域域名并创建面向区域域端点的自己的CloudFront分布。您可以在CloudFront分配中设置WAF。欲了解更多详情,请参阅https://aws.amazon.com/about-aws/whats-new/2017/11/amazon-api-gateway-supports-regional-api-endpoints/ – Balaji

+0

@Balaji我希望更多的信息这应该如何配置。我正在做这些事情,WAF,CloudFront,APIG和REGIONAL。我的DNS指向CloudFront,并正确阻止WAF规则之外的网络流量。但是,我仍然可以通过4G上的手机访问APIG终端... –

1

您可以使用自定义域名并将DNS指向带有WAF的分发。然后直接请求原始API网关分配将不起作用。

+1

这并不完全正确,因为自定义域名与与API本身关联的隐藏CloudFront分配相关联,并且自定义域名与您创建并指向DNS的CloudFront分配相关联。全球只有一个CloudFront分配可以与给定的域名关联。 –

+0

@Michael或多或少地抛开:我从来没有意识到这一点,但这是很好的知道。对于记录,尝试这样会导致“com.amazonaws.services.cloudfront.model.CNAMEAlreadyExistsException:您提供的一个或多个CNAME已与不同的资源相关联(服务:AmazonCloudFront;状态码:409;错误代码: CNAMEAlreadyExists; ...“ –

+1

@Vitalii即使它可能不起作用,我必须说我看不到你的观点:如果你在APIG中创建一个自定义域名,你仍然可以直接通过它的https:// xxx.execute-api.eu-west-1.amazonaws.com端点,对吗? –

1

“正确”的方法是使用自定义authorizo​​r在API网关如其他人所说。

“便宜”的方式是子弹3,api键。如果您试图抵御ddos攻击,您可能只会提供waf - > cloudfront - > api网关。所以如果有人发现你的api网关url,并决定使用ddos而不是cloudfront,那么定制的授权者意味着你现在正在攻击lambda中受到冲击。 Api网关每秒可处理超过10k个请求,默认的lambda限制为每秒100个。即使你有亚马逊增加你的限制,你是否愿意支付每秒10k lambda的持续攻击?

AWS代表会告诉你,“API密钥用于鉴定,不进行身份验证。该键不用于签名的请求,并且不应该被用来作为一种安全机制” https://aws.amazon.com/blogs/aws/new-usage-plans-for-amazon-api-gateway/

但说实话,如果你是不要在你的lambda中做更好的事情,而不是去验证一些巨大的混乱的字符串,为什么不把这个负担和成本留给其他人。 (最大密钥长度为128个字符)

也许你可以有计划的lambda函数发出一个新的API密钥和更新CloudFront的的头,每6小时?

如果你想使用api密钥作为其他的事情,那么只需要一个api网关来源进行认证,另一个来源和api网关的一切。通过这种方式,在ddos攻击中,您可以每秒向auth api处理10k个请求,而所有其他已登录的客户每秒都有10k个集体使用您的api。 Cloudfront和waf每秒可以处理100K,因此在这种情况下它们不会阻止你。

另一个需要注意的地方是,如果你在api网关后面使用lambda,你可以使用lambda @ edge并且只是一起跳过api网关。 (这不适合大多数场景,因为lambda @ edge是严格限制的,但我想我会把它扔出去的。)

但最终我们需要WAF与API网关集成! :)

+0

感谢您的回复。关于自定义授权者意味着lambda获得所有匹配的事实:自定义授权者响应可以被缓存,所以每TTL秒只能有一个lambda请求(仍然是dummy),对吧?请参阅http://docs.aws.amazon.com/apigateway/latest/developerguide/use-custom-authorizer.html#configure-api-gateway-custom-authorization-with-console –

+0

已认证的用户被缓存。有人提出你的系统只会为每个请求创建随机令牌。 https://stackoverflow.com/questions/44687654/secure-aws-api-gateway-with-lambda-integration。这个论坛也深入到这个主题:https://forums.aws.amazon.com/thread.jspa?messageID=703917 – Neo

+0

lambda是虚拟的 - 实际的检查是由令牌验证表达式完成的。只有当缓存未被命中并且验证表达式成功时,才会调用Lambda。对? –