首页 > 解决方案 > 如何限制对 lambda 的访问

问题描述

我有一个前端应用程序,该应用程序将使用 lambda 服务,端点启用了 cors,如下所示:

// serverless.yml

functions:
  test:
  handler: functions/test.handler
  events:
  - http:
      path: /test
      method: get
      cors: true

测试函数的处理程序具有如下标头:

// ./functions/test.js
headers: {
        'Access-Control-Allow-Origin': 'https://example.com',
    },

当我构建/部署无服务器项目时,我可以将生成的 URL 放在浏览器中并查看响应。ACAO 标头确实存在,我还没有尝试从站点使用它,可能会在那里被阻止,但 CORS 还不够——它只是基于浏览器的,如果以其他方式请求,lambda 响应仍然可见.

我想要做的是限制对那些(生产)lambda 函数的访问,除非请求来自我的应用程序,该应用程序(静态)托管在 s3 存储桶中,存储桶链接到云端,云端链接到域(使用路由 53为域。

我的应用程序没有用户,我只是不希望那里提供的数据可以从 3rd 方服务访问。我考虑构建一个我在每个函数中导​​入的函数,如果状态为 prod,它将检查 IP,但我不确定这是否是一个好习惯。

我还能做些什么来保护这些 lambda?解决方案不必在 lambda 中,也许我可以使用 cloudfront 中的某些东西,目前没有指向 lambda 的子域 api.example.com。

标签: amazon-web-servicessecurityaws-lambdaserverless

解决方案


找到了一个我实际上喜欢的解决方案,不知道我以前是怎么想到的。

在 serverless.yml 中,资源策略如下所示:

provider:
  name: aws
  runtime: nodejs8.10
  memorySize: 128
  stage: dev
  resourcePolicy:
    - Effect: Allow
      Principal: '*'
      Action: execute-api:Invoke
      Resource:
        - execute-api:/*/*/*
      Condition:
        IpAddress:
          aws:SourceIp:
            - 'your ip here'

部署时,策略设置在 API Gateway -> Your service -> Resource Policy。如果某些 lambdas/endpoints 应该允许不同/完全访问,我相信你可以添加多个,这样我也可以根据部署阶段拥有不同的 IP。


推荐阅读