Amazon RDS:如何限制 RDS 实例对 AWS Lambda 函数和对我的计算机的访问?
Amazon RDS: How can I limit the RDS instance access to AWS Lambda functions and TO My computer?
我正在使用 AWS Lambda
、API Gateway
和 Amazon RDS(MySQL)
开发 REST API。我正在使用 AWS Sam 进行配置和所有操作。
我通过访问亚马逊网站的 RDS 部分创建了数据库。它按预期工作正常。我还设法部署了 Lambda 函数并将它们与数据库连接起来。
我的数据库设置为Publicly Accessible = Yes
但是,我注意到数据库是对全世界开放的。见下图。
安全组规则
在默认安全组内
嗯,这看起来很可怕,我没有安全措施。
如果是数据库安全,我需要的就是这个
- 我的所有 Lambda 函数都可以访问数据库
- MySQLWorkBench可以访问数据库
- 我在本地测试这个,所以我可能需要在本地 运行 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 安全组
- All of my Lambda functions can access the database
最安全的方法是将您的 RDS 放在 私有子网 中,并将您的函数与 VPC 相关联。如果您希望这些函数也可以通过 NAT 访问互联网,那么它们也必须位于私有子网中。
- MySQL WorkBench can access the database
如果您将 RDS 置于私有子实体中,您将无法直接从 VPC 外部访问它。最安全的方法是在本地工作站和 VPC 之间设置 VPN 或 ssh 隧道。 ssh 隧道最容易设置,最常用于测试和开发。
- 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 服务器使用端口转发(使用用于身份验证的私钥对)。
我正在使用 AWS Lambda
、API Gateway
和 Amazon RDS(MySQL)
开发 REST API。我正在使用 AWS Sam 进行配置和所有操作。
我通过访问亚马逊网站的 RDS 部分创建了数据库。它按预期工作正常。我还设法部署了 Lambda 函数并将它们与数据库连接起来。
我的数据库设置为Publicly Accessible = Yes
但是,我注意到数据库是对全世界开放的。见下图。
安全组规则
在默认安全组内
嗯,这看起来很可怕,我没有安全措施。
如果是数据库安全,我需要的就是这个
- 我的所有 Lambda 函数都可以访问数据库
- MySQLWorkBench可以访问数据库
- 我在本地测试这个,所以我可能需要在本地 运行 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 安全组
- All of my Lambda functions can access the database
最安全的方法是将您的 RDS 放在 私有子网 中,并将您的函数与 VPC 相关联。如果您希望这些函数也可以通过 NAT 访问互联网,那么它们也必须位于私有子网中。
- MySQL WorkBench can access the database
如果您将 RDS 置于私有子实体中,您将无法直接从 VPC 外部访问它。最安全的方法是在本地工作站和 VPC 之间设置 VPN 或 ssh 隧道。 ssh 隧道最容易设置,最常用于测试和开发。
- 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 服务器使用端口转发(使用用于身份验证的私钥对)。