Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

Amazon RDS 个安全组

安全组控制着流量在数据库实例内外拥有的访问权限。与 Amazon RDS 配合使用的安全组有三种类型:数据库安全组、VPC 安全组及 EC2 安全组。简单来说,数据库安全组会控制不在 VPC 中的 EC2-Classic 数据库实例的访问权限,VPC 安全组会控制 VPC 内的数据库实例和 EC2 实例的访问权限,而 EC2 安全组会控制 EC2 实例的访问权限。

默认情况下,数据库实例的网络访问处于关闭状态。您可以在安全组中指定规则,允许从 IP 地址范围、端口或 EC2 安全组进行访问。配置传入规则后,与该安全组关联的所有数据库实例将应用这些规则。您最多可以在一个安全组中指定 20 个规则。

数据库安全组

数据库安全组用于不在 VPC 中但在 EC2-Classic 平台上的数据库实例。各项数据库安全组规则都允许特定源访问与该数据库安全组关联的数据库实例。源可以是一个地址范围 (如 203.0.113.0/24) 或 EC2 安全组。在指定作为源的 EC2 安全组后,就可以允许从使用此 EC2 安全组的所有 EC2 实例中传入流量。请注意,数据库安全组规则仅适用于入站流量;数据库实例当前不允许出站流量。

在创建数据库安全组规则时,不需要指定目标端口号;为数据库实例定义的端口号可用作针对数据库安全组定义的所有规则的目标端口号。可以使用 Amazon RDS API 或 AWS 管理控制台 的 Amazon RDS 页面创建数据库安全组。

有关使用数据库安全组的更多信息,请参阅 使用数据库安全组 (EC2-Classic 平台).

VPC 安全组

每个 VPC 安全组规则都允许特定的源访问 VPC 中与此 VPC 安全组关联的数据库实例。源可以是一个地址范围 (如 203.0.113.0/24) 或 VPC 安全组。指定作为源的 VPC 安全组后,就可以允许从使用此源 VPC 安全组的所有实例 (通常为应用程序服务器) 中传入流量。虽然 VPC 安全组具有管理入站和出站流量的规则,但是出站流量规则并不适用于数据库实例。请注意,您必须使用 VPC 控制台中的 Amazon EC2 APISecurity Group 选项创建 VPC 安全组。

当您为 VPC 安全组创建允许访问 VPC 中的实例的规则时,必须为规则允许访问的每个地址范围指定一个端口。例如,如果您要对 VPC 中的实例启用 SSH 访问,则应为指定的地址范围创建一条允许访问 TCP 端口 22 的规则。

您可以为 VPC 中不同的实例配置允许访问不同端口的多个 VPC 安全组。例如,您可以为 VPC 中的 Web 服务器创建一个允许访问 TCP 端口 80 的 VPC 安全组,并为 VPC 中的 RDS MySQL 数据库实例创建另一个允许访问 TCP 端口 3306 的 VPC 安全组。

有关 VPC 安全组的更多信息,请参阅 Amazon Virtual Private Cloud 用户指南中的安全组

数据库安全组与 VPC 安全组

下表显示了数据库安全组与 VPC 安全组之间的主要区别。

数据库安全组 VPC 安全组
控制对 VPC 之外数据库实例的访问. 控制对 VPC 中数据库实例的访问。
使用 Amazon RDS API 或 AWS 管理控制台 的 Amazon RDS 页创建和管理组/规则. 使用 Amazon EC2 API 或 AWS 管理控制台 的 Amazon VPC 页创建和管理组/规则。
在将规则添加到组时,不需要指定端口号或协议。 在将规则添加到组时,应指定用作 TCP 的协议,并指定端口号,且该端口号应与您在创建欲添加为该组成员的数据库实例 (或选项) 时所用的端口号相同。
组允许从 AWS 账户或其他账户中的 EC2 安全组进行访问。 组仅允许从 VPC 中的 VPC 安全组进行访问。

安全组情况

VPC 中的 RDS 实例通常用于与相同 VPC 中运行于 EC2 实例中的应用程序服务器共享数据,这些数据可通过 VPC 外的客户端应用程序进行访问。对于这种情况,可以执行以下操作创建必要的实例和安全组。可以使用 AWS 控制台上的 RDS 和 VPC 页面或 RDS 和 EC2 API。

  1. 创建一个 VPC 安全组 (例如“sg-appsrv1”),然后定义用作客户端应用程序 IP 地址源的入站规则。通过此安全组,客户端应用程序可连接到使用此安全组的 VPC 中的 EC2 实例。

  2. 创建一个适用于该应用程序的 EC2 实例,然后将该 EC2 实例添加到上一步骤中创建的 VPC 安全组 (“sg-appsrv1”)。VPC 中的 EC2 实例与数据库实例共享该 VPC 安全组。

  3. 创建第二个 VPC 安全组 (例如“sg-dbsrv1”),然后将步骤 1 中创建的 VPC 安全组 (“sg-appsrv1”) 指定为源,从而创建一个新的规则。

  4. 创建一个新数据库实例,然后将该数据库实例添加到上一步骤中创建的 VPC 安全组 ("sg-dbsrv1")。在创建实例时,使用的端口号应与指定给您在步骤 3 中创建的 VPC 安全组 (“sg-dbsrv1”) 规则的端口号相同。

下图演示了此情形。

 VPC 和 EC2 安全组情况

有关使用数据库安全组的更多信息,请参阅使用数据库安全组 (EC2-Classic 平台)

删除数据库 VPC 安全组

数据库 VPC 安全组是一种 RDS 机制,用于将安全信息与 VPC 安全组同步。不过,现在已经不再需要此同步,因为 RDS 进行了更新,可直接使用 VPC 安全组信息。

我们强烈建议您删除当前使用的所有数据库 VPC 安全组。如果您不删除数据库 VPC 安全组,则 RDS 数据库实例可能发生意外的行为,严重时可能失去对数据库实例的访问。意外行为因某种操作引起,例如更新数据库实例或选项组等操作,这些操作会导致 RDS 将数据库 VPC 安全组与 VPC 安全组重新同步。这种重新同步可能会导致用错误和过时的安全信息覆盖您的安全信息,严重影响您对 RDS 数据库实例的访问。

如何确定我是否有数据库 VPC 安全组?

由于数据库 VPC 安全组已弃用,因此它们不会显示在 RDS 控制台中。但是,您可以调用 describe-db-security-groups AWS CLI 命令或 DescribeDBSecurityGroups API 操作以确定您是否有任何 VPC 数据库安全组。

如果您调用将输出格式指定为 JSON 的 describe-db-security-groups AWS CLI 命令,则可以通过安全组输出的第二行上的 VPC 标识符来识别数据库 VPC 安全组,如下例所示。

{ "DBSecurityGroups": [ { "VpcId": "vpc-abcd1234", "DBSecurityGroupDescription": "default:vpc-abcd1234", "IPRanges": [ { "Status": "authorized", "CIDRIP": "xxx.xxx.xxx.xxx/n" }, { "Status": "authorized", "CIDRIP": "xxx.xxx.xxx.xxx/n " } ], "OwnerId": "123456789012", "EC2SecurityGroups": [], "DBSecurityGroupName": "default:vpc-abcd1234" } ] }

如果您执行 DescribeDBSecurityGroups API 操作,则可以使用 <VpcId> 响应元素识别数据库 VPC 安全组,如以下示例所示。

<DBSecurityGroup> <EC2SecurityGroups/> <DBSecurityGroupDescription>default:vpc-abcd1234</DBSecurityGroupDescription> <IPRanges> <IPRange> <CIDRIP>xxx.xxx.xxx.xxx/n</CIDRIP> <Status>authorized</Status> </IPRange> <IPRange> <CIDRIP>xxx.xxx.xxx.xxx/n</CIDRIP> <Status>authorized</Status> </IPRange> </IPRanges> <VpcId>vpc-abcd1234</VpcId> <OwnerId>123456789012</OwnerId> <DBSecurityGroupName>default:vpc-abcd1234</DBSecurityGroupName> </DBSecurityGroup>

如何删除数据库 VPC 安全组?

数据库 VPC 安全组不会显示在 RDS 控制台中,因此必须通过调用 delete-db-security-group AWS CLI 命令或 DeleteDBSecurityGroup API 操作来删除 VPC 数据库安全组。

删除数据库 VPC 安全组之后,VPC 中的数据库实例会继续由该 VPC 的 VPC 安全组进行保护。已删除的数据库 VPC 安全组不过是 VPC 安全组信息的副本。

查看 AWS CloudFormation 模板

较旧版本的 AWS CloudFormation 模板可能包含用于创建数据库 VPC 安全组的指令。因为数据库 VPC 安全组尚未彻底弃用,所以仍然可以创建它们。请确保您用于预置包含安全设置的数据库实例的任何 AWS CloudFormation 模板没有同时创建数据库 VPC 安全组。请勿使用创建具有 EC2VpcId 的 RDS DBSecurityGroup 的 AWS CloudFormation 模板,如以下示例所示。

"DbSecurityByEC2SecurityGroup" : { Type" : "AWS::RDS::DBSecurityGroup", "Properties" : { "GroupDescription" : "Ingress for Amazon EC2 security group", "EC2VpcId" : { "MyVPC" }, "DBSecurityGroupIngress" : [ { "EC2SecurityGroupId" : "sg-b0ff1111", "EC2SecurityGroupOwnerId" : "111122223333" }, { "EC2SecurityGroupId" : "sg-ffd722222", "EC2SecurityGroupOwnerId" : "111122223333" } ] } }

正确的做法是使用 VPC 安全组为 VPC 中的 RDS 数据库实例添加安全信息,如以下示例所示。

"DBInstance" : { "Type": "AWS::RDS::DBInstance", "Properties": { "DBName" : { "Ref" : "DBName" }, "Engine" : "MySQL", "MultiAZ" : { "Ref": "MultiAZDatabase" }, "MasterUsername" : { "Ref" : "<master_username>" }, "DBInstanceClass" : { "Ref" : "DBClass" }, "AllocatedStorage" : { "Ref" : "DBAllocatedStorage" }, "MasterUserPassword": { "Ref" : "<master_password>" }, "VPCSecurityGroups" : [ { "Fn::GetAtt": [ "VPCSecurityGroup", "GroupId" ] } ] }