Amazon RDS:如何限制 RDS 实例对 AWS Lambda 函数和对我的计算机的访问?

Amazon RDS: How can I limit the RDS instance access to AWS Lambda functions and TO My computer?

我正在使用 AWS LambdaAPI GatewayAmazon RDS(MySQL) 开发 REST API。我正在使用 AWS Sam 进行配置和所有操作。

我通过访问亚马逊网站的 RDS 部分创建了数据库。它按预期工作正常。我还设法部署了 Lambda 函数并将它们与数据库连接起来。

我的数据库设置为Publicly Accessible = Yes

但是,我注意到数据库是对全世界开放的。见下图。

安全组规则

在默认安全组内

嗯,这看起来很可怕,我没有安全措施。

如果是数据库安全,我需要的就是这个

  1. 我的所有 Lambda 函数都可以访问数据库
  2. MySQLWorkBench可以访问数据库
  3. 我在本地测试这个,所以我可能需要在本地 运行 lambda 并连接到 RDS

如果你需要,下面是我的template.yaml文件

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  abcd-restapi

  Sample SAM Template for abcd-restapi

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 100

Resources:
  GetAllAccountTypesLambda:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: abcd-restapi
      Handler: com.abcd.dao.accountingtype.GetAllAccountTypesLambda::getAllAccountTypes
      Runtime: java11
      MemorySize: 1024
      Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object
        Variables:
          PARAM1: VALUE
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /accounttype
            Method: get

我应该怎么做才能取消“全球免费访问”并实现我上面提到的访问?

------------更新----------

在听从 John 的建议后,现在这是我的安全组。但是Lambda不能访问数据库,MySQLworkbench可以

Lambda-SG 安全组

  1. All of my Lambda functions can access the database

最安全的方法是将您的 RDS 放在 私有子网 中,并将您的函数与 VPC 相关联。如果您希望这些函数也可以通过 NAT 访问互联网,那么它们也必须位于私有子网中。

  1. MySQL WorkBench can access the database

如果您将 RDS 置于私有子实体中,您将无法直接从 VPC 外部访问它。最安全的方法是在本地工作站和 VPC 之间设置 VPN 或 ssh 隧道。 ssh 隧道最容易设置,最常用于测试和开发。

  1. I test this locally, so I may need to run the lambda locally and connect to RDS

同第2点。需要VPN或ssh隧道。

如果您的 Amazon RDS 数据库位于 public 子网 中并且设置为 Publicly Accessible = Yes,那么您可以 使用安全组控制对数据库服务器的访问.

  • 使用默认的“允许所有出站”设置在 Lambda 函数 (Lambda-SG) 上放置一个安全组
  • 在 RDS 数据库 (DB-SG) 上放置一个安全组,其入站规则允许从 Lambda-SG 访问端口 3306 (MySQL)。即 DB-SG 具体引用 Lambda-SG.
  • 将您自己的 public IP 地址添加到 DB-SG 入站规则以允许在端口 3306 (MySQL) 上进行访问。

虽然 public 仅可访问的数据库从安全角度来看并不理想,但安全组将帮助您限制对服务器的访问。数据库服务器还需要身份验证才能连接到数据库,这是一个额外的安全层。

私有子网与 Public 子网

来自The layered defense approach to security - IBM Documentation

Using a layered approach when you plan your Internet security strategy ensures that an attacker who penetrates one layer of defense will be stopped by a subsequent layer.

无法从 Internet 访问 私有子网 中的资源。这是所有公司网络中使用的一个重要概念。它为合法用户引入了额外的障碍(例如需要 VPN 连接或通过堡垒服务器的连接),但在考虑资源安全时是值得的。

使用public子网的好处纯粹是让的访问更简单。但是,它还通过移除一层安全性使未经授权的用户的访问更加简单。是的,安全组 是一个可以限制访问的防火墙,但它可能配置错误或允许过多的访问。这是您的选择,基于您的风险偏好

更安全的方法是将您的数据库放在私有子网中。然后,如果您需要从 VPC 外部访问数据库,则需要使用 VPN 连接或通过 Bastion 服务器使用端口转发(使用用于身份验证的私钥对)。