2017-01-25 33 views
2

我有一个要由前端JavaScript应用访问的API网关。考虑到这一点,我们不能限制访问API密钥(我不认为?),所以我真的想限制它的IP地址......但我找不到一种方法来做到这一点。这甚至可能,因为它实际上不是来自服务器?限制公共API网关到特定IP

所以该网站是在接待托管在S3用的Cloudfront。 API网关接受几个密钥,并打到一个lambda脚本并保存到dynamodb。如果有人想要,他们可以用价值观来诋毁它。我只希望网络应用程序能够与之交谈。我仍然在学习很多AWS!我希望我可以使用Shield或WAF,但它似乎是不行的。有什么建议么?

回答

3

当然,在您的应用程序中对任何凭据或API密钥进行硬编码并不是一个好主意,大多数情况下,您会找到说明如何使用Web联合身份提供程序授权API的文章通过API网关进行呼叫(请参阅Setting Credentials in a Web Browser),但由于您使用的是CloudFront,因此还有另一种解决方法。

你可以存储在S3上一个单独的文件API密钥(甚至IAM凭证),但限制其特定的IP地址访问权限,使你的脚本就可以拿到钥匙并进行API调用。所有其他IP地址无法检索API密钥。因此,不能调用API方法。

  1. 要求您的用户只能通过CloudFront访问您的内容。参见:Using an Origin Access Identity to Restrict Access to Your Amazon S3 Content这样,无法使用S3 URL来检索API密钥。
  2. 指定要用于创建签名URL的AWS账户。参见:Specifying the AWS Accounts That Can Create Signed URLs and Signed Cookies (Trusted Signers)
  3. 创建使用带有长期有效日期自定义策略签署的URL。参见:Creating a Signed URL Using a Custom Policy。使用自定义策略(而不是固定策略)允许您指定可以访问您的内容的用户的IP地址或IP地址范围。 只要您想调用API方法,就会使用此生成的签名URL。
  4. 选择CloudFront的分发,并添加行为路径模式指向您的API密钥文件,例如,api-key.json。确保限制浏览器访问设置为的行为。 确保此bahavior通过将其放置在顶部的列表中有过默认行为优先,即优先级为0
  5. 确保限制浏览器访问设置为没有默认缓存行为,这将使所有内容的公共的,除了上面的API密钥文件。

注意:如果您确定您的标识的URL被安全地存储,没有人可以访问它,您可以从您的自定义策略中删除IP地址请求,因为这将是多余的检查IP地址在这种情况下。当然,这将允许您使用罐装策略。

+0

包装盒外。我喜欢。 –

+0

感谢您的支持。但我不确定这个或者任何解决方案是否能够在这个设置中起作用。由于应用程序是前端,服务器IP永远不可用于发送,我不认为? –

+0

由于您的前端应用程序是静态的,因此客户端脚本会在本地计算机上执行。因此,在这种情况下,IP地址是* YOUR * IP,而不是S3/CloudFront。如果您的位置没有静态IP,则可以保存签名的URL并配置您的应用程序将其作为参数接受以检索API密钥文件。我希望现在这种方法很明确。 –