Amazon Relational Database Service
用户指南 (API 版本 2014-10-31)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

Amazon RDS 个安全组

安全组控制着流量在数据库实例内外拥有的访问权限。与 Amazon RDS 配合使用的安全组有三种类型:数据库安全组、VPC 安全组及 Amazon 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 安全组可以具有管理入站和出站流量的规则,但是出站流量规则通常并不适用于数据库实例。仅在数据库实例充当客户端时,出站流量规则才适用。例如,出站流量规则适用于具有出站数据库链接的 Oracle 数据库实例。您必须使用 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 中运行于 Amazon 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 安全组情况

有关使用 VPC 的更多信息,请参阅 Amazon Virtual Private Cloud (VPCs) 和 Amazon RDS

创建 VPC 安全组

您可以使用 VPC 控制台为数据库实例创建 VPC 安全组。有关创建安全组的信息,请参阅《Amazon Virtual Private Cloud 用户指南》 中的通过创建安全组提供对 VPC 中的数据库实例的访问安全组

将安全组与数据库实例关联

您可使用 RDS 控制台的 Modify 选项、ModifyDBInstance Amazon RDS API 或 AWS CLI modify-db-instance 命令将安全组与数据库实例关联。有关修改 数据库实例的信息,请参阅修改 Amazon RDS 数据库实例和使用“立即应用”参数。有关从数据库快照还原数据库实例时的安全组注意事项,请参阅安全组注意事项

删除数据库 VPC 安全组

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

注意

数据库 VPC 安全组已弃用,它们与数据库安全组、VPC 安全组和 EC2 安全组不同。

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

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

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

在此情况下,您可以调用 describe-db-security-groups AWS CLI 命令 (将 JSON 指定为输出格式)。如果调用,您可按安全组第二行输出中的 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 安全组?

由于在 RDS 控制台中不显示数据库 VPC 安全组,您必须调用 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" ] } ] }