将安全的亚马逊网关API仅限于只能从S3存储桶中的内容访问

4
我有一个通过亚马逊网关API服务创建的公开API。API调用会触发Lambda函数来查询后端数据库。我创建的API被S3静态网页用于获取数据。
我想保护我的API,只允许我的S3存储桶(index.html)访问我的API。我希望防止人们直接使用curl请求等方式查询我的API并抓取数据。我已经了解了IAM角色、Cognito和Lambda权限模型的一些内容,但我不确定如何使用这些不同的工具来保护我的API。
什么是最好的方法来保护我的API,使得只有S3存储桶中的内容有权限访问我的API?
2个回答

8

根据您的设置,您可以尝试在API Gateway的资源策略中使用AWS的条件密钥之一或多个。例如,您只能允许引用程序为您的S3静态网站的请求:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/{{stageNameOrWildcard*}}/{{httpVerbOrWildcard*}}/{{resourcePathOrWildcard*}}"
            ],
            "Condition": {
                "StringLike": {
                    "aws:Referer": [
                        "<bucket-name>.s3-website-<AWS-region>.amazonaws.com/*"
                    ]
                }
            }
        }
    ]
}

非常棒的想法,但在实践中并不起作用。AWS默认使API网关公开,因此这只会在已经允许流量时允许特定站点引用程序的流量。之所以这种类型的策略适用于S3存储桶,是因为S3存储桶默认是私有的,因此您提供的策略仅允许引用者,而所有其他请求都将被默认拒绝。不幸的是,这种逻辑无法转移到API Gateway上。 - suntzu

7
您无法授权S3访问API,因为S3并不访问您的API - S3将html(js / css和其他静态资源)提供给访问您网站的用户的客户端(Web浏览器)。然后从客户端发起对您的API的调用。
此外,亚马逊要求API Gateway必须是公共的(有道理,但您不能在VPC之后放置API)
我建议您仔细阅读常见问题解答中的安全和授权 您可以执行以下操作:
- 签署对API Gateway的请求,但需要有其他东西生成向客户端的html代码(据我所知,S3本身无法执行此操作,但我可能错了) - Amazon API Gateway可以生成客户端SSL证书以验证后端请求 - 设置一些限制(请参见下文)
如果您担心滥用,也可以从常见问题解答中获取信息
引用如下: Q:如何解决或防止API威胁或滥用? Amazon API Gateway支持每个API方法的限流设置。您可以为REST API中的每个方法设置标准速率限制和每秒突发速率限制。此外,Amazon API Gateway会自动保护您的后端系统免受分布式拒绝服务(DDoS)攻击,无论是通过伪造请求(第7层)还是SYN洪水攻击(第3层)。

@turtle 你有机会解决这个问题吗?我遇到了类似的问题,需要帮助来保护我的S3内容,防止我的移动应用程序被公共API访问。 - Kirtikumar A.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接