将 Amazon Managed Active Directory 用于 RDS for SQL Server
当用户连接您的 RDS for SQL Server 数据库实例时,您可以使用 Amazon Managed Microsoft AD 通过 Windows 身份验证对用户进行身份验证。数据库实例使用 Amazon Directory Service for Microsoft Active Directory(也称为 Amazon Managed Microsoft AD)来启用 Windows 身份验证。当用户对联接到信任域的 SQL Server 数据库实例进行身份验证时,身份验证请求将转发至您使用 Amazon Directory Service 创建的域目录。
区域和版本可用性
Amazon RDS 支持仅使用 Amazon Managed Microsoft AD 进行 Windows 身份验证。RDS 不支持使用 AD Connector。有关更多信息,请参阅下列内容:
有关版本和区域可用性的信息,请参阅 RDS for SQL Server 的 Kerberos 身份验证。
设置 Windows 身份验证概述
Amazon RDS 使用混合模式进行 Windows 身份验证。此方式意味着,主用户(用于创建 SQL Server 数据库实例的名称和密码)使用 SQL 身份验证。由于主用户账户是特权凭证,您应限制对此账户的访问。
要使用本地或自托管式 Microsoft Active Directory 获取 Windows 身份验证,请创建林信任。信任可以是单向或双向的。有关使用 Amazon Directory Service 设置林信任的更多信息,请参阅 Amazon Directory Service 管理指南 中的何时创建信任关系。
要为 SQL Server 数据库实例设置 Windows 身份验证,请执行下列步骤(为 SQL Server 数据库实例设置 Windows 身份验证 中更为详细地介绍):
-
从 Amazon Managed Microsoft AD或 Amazon Web Services Management Console API 使用 Amazon Directory Service 创建 Amazon Managed Microsoft AD 目录。
-
如果使用 Amazon CLI 或 Amazon RDS API 创建 SQL Server 数据库实例,请创建 Amazon Identity and Access Management(IAM)角色。此角色使用托管 IAM 策略
AmazonRDSDirectoryServiceAccess
并允许 Amazon RDS 调用您的目录。如果您使用控制台创建 SQL Server 数据库实例,则 Amazon 将为您创建 IAM 角色。为了让角色允许访问,Amazon Security Token Service (Amazon STS) 终端节点必须在您的 Amazon 账户的 Amazon 区域中激活。Amazon STS 终端节点默认在所有 Amazon 区域中保持活跃,且您无需任何进一步动作即可使用它们。有关更多信息,请参阅《IAM 用户指南》中的在 Amazon Web Services 区域中管理 Amazon STS。
-
使用 Microsoft Active Directory 工具在 Amazon Managed Microsoft AD 目录中创建和配置用户与组。有关在 Microsoft Active Directory 中创建用户的更多信息,请参阅 Amazon Directory Service管理指南中的管理 Amazon Managed Microsoft AD 中的用户和组。
-
如果您计划在不同 VPC 中查找目录和数据库实例,请启用跨 VPC 流量。
-
使用 Amazon RDS 从控制台、Amazon CLI 或 Amazon RDS API 新建 SQL Server 数据库实例。在创建请求中,提供在创建目录时生成的域标识符(“
d-*
”标识符)和您创建的角色的名称。通过为数据库实例设置域和 IAM 角色参数,您还可将现有 SQL Server 数据库实例修改为使用 Windows 身份验证。 -
使用 Amazon RDS 主用户凭证连接到 SQL Server 数据库实例,就像连接到任何其他数据库实例一样。由于数据库实例已联接到 Amazon Managed Microsoft AD 域,您可从域中的 Active Directory 用户和组中预配置 SQL Server 登录名和用户。(这称为 SQL Server“Windows”登录。) 通过对这些 Windows 登录名授予和撤销标准 SQL Server 权限来管理数据库权限。
为 Kerberos 身份验证创建终端节点
基于 Kerberos 的身份验证需要终端节点是客户指定的主机名、句点,然后是完全限定的域名 (FQDN)。例如,以下是您可以用于基于 Kerberos 身份验证的终端节点的示例。在此示例中,SQL Server 数据库实例主机名为 ad-test
,域名为 corp-ad.company.com
。
ad-test.corp-ad.company.com
如果您要确保连接使用的是 Kerberos,请运行以下查询:
SELECT net_transport, auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@SPID;
为 SQL Server 数据库实例设置 Windows 身份验证
使用 Amazon Directory Service for Microsoft Active Directory(也称为 Amazon Managed Microsoft AD)为 SQL Server 数据库实例设置 Windows 身份验证。要设置 Windows 身份验证,请执行下列步骤。
步骤 1:使用 Amazon Directory Service for Microsoft Active Directory 创建目录
Amazon Directory Service 将在 Amazon 云中创建完全托管的 Microsoft Active Directory。创建 Amazon Managed Microsoft AD 目录时,Amazon Directory Service 将代表您创建两个域控制器和域名服务 (DNS) 服务器。目录服务器在 VPC 内的两个不同可用区中的两个子网中创建。这种冗余有助于确保即使发生故障,目录仍可访问。
创建 Amazon Managed Microsoft AD 目录时,Amazon Directory Service 代表您执行以下任务:
-
在 VPC 中设置 Microsoft Active Directory。
-
使用用户名 Admin 和指定密码创建目录管理员账户。您可以使用此账户管理您的目录。
注意
请务必保存此密码。Amazon Directory Service 不会存储此密码并且它无法取回或重置。
-
为目录控制器创建安全组。
在启动 Amazon Directory Service for Microsoft Active Directory 时,Amazon 创建一个组织单位 (OU),其中包含目录的所有对象。此 OU (具有您在创建目录时键入的 NetBIOS 名称) 位于域根目录中。此域根目录由 Amazon 拥有和管理。
使用您的 Amazon Managed Microsoft AD 目录创建的 admin 账户对您的 OU 的最常见管理活动具有以下权限:
-
创建、更新或删除用户、组和计算机。
-
将资源添加到域 (如文件或打印服务器),然后为 OU 中的用户和组分配这些资源的权限。
-
创建额外的 OU 和容器。
-
委托授权。
-
创建和链接组策略。
-
从 Active Directory 回收站还原删除的对象。
-
在 Active Directory Web 服务上运行 AD 和 DNS Windows PowerShell 模块。
admin 账户还具有执行下列域范围活动的权限:
-
管理 DNS 配置(添加、删除或更新记录、区域和转发器)。
-
查看 DNS 事件日志。
-
查看安全事件日志。
使用 Amazon Managed Microsoft AD 创建目录
-
在 Amazon Directory Service 控制台
导航窗格中,选择目录,然后选择设置目录。 -
选择 Amazon Managed Microsoft AD。这是当前唯一支持用于 Amazon RDS 的选项。
-
选择下一步。
-
在输入目录信息页面上,提供以下信息:
- 版本
-
选择符合您要求的版本。
- 目录 DNS 名称
-
目录的完全限定名称,例如
corp.example.com
。SQL Server 不支持超过 47 个字符的名称。 - 目录 NetBIOS 名称
-
可选的目录短名称,如
CORP
。 - 目录描述
-
目录的可选描述。
- 管理员密码
-
目录管理员的密码。目录创建过程将使用用户名 Admin 和此密码创建一个管理员账户。
目录管理员密码不能包含单词
admin
。此密码区分大小写,且长度必须介于 8 – 64 个字符之间。至少,它还必须包含下列四种类别中三种类别的一个字符:-
小写字母 (a-z)
-
大写字母 (A-Z)
-
数字 (0-9)
-
非字母数字字符 (~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/)
-
- 确认密码
-
重新键入管理员密码。
-
选择下一步。
-
在选择 VPC 和子网页面上,提供以下信息:
- VPC
-
为目录选择 VPC。
注意
您可以在不同 VPC 中查找目录和数据库实例,但如果这样做,请确保启用跨 VPC 流量。有关更多信息,请参阅“步骤 4:在目录和数据库实例之间启用跨 VPC 流量”。
- 子网
-
为目录服务器选择子网。两个子网必须位于不同的可用区。
-
选择下一步。
-
检查目录信息。如果需要进行更改,请选择上一步。如果信息正确,请选择 Create directory (创建目录)。
目录创建需要几分钟时间。创建成功后,Status (状态) 值将更改为 Active (活动)。
要查看有关您的目录的信息,请在目录列表中选择目录。记下目录 ID。在创建或修改 SQL Server 数据库实例时,您将需要此值。
![“目录详细信息”页面](images/WinAuth3.png)
步骤 2:创建 Amazon RDS 使用的 IAM 角色
如果您使用控制台创建您的 SQL Server 数据库实例,则可跳过此步。如果您已使用 CLI 或 RDS API 创建 SQL Server 数据库实例,则必须创建使用 AmazonRDSDirectoryServiceAccess
托管 IAM 策略的 IAM 角色。此角色允许 Amazon RDS 为您调用 Amazon Directory Service。
如果您使用自定义策略来加入域,而不是使用 Amazon 托管的 AmazonRDSDirectoryServiceAccess
策略,请确保允许 ds:GetAuthorizedApplicationDetails
操作。由于 Amazon Directory Service API 发生变化,这一要求自 2019 年 7 月起生效。
以下 IAM 策略 AmazonRDSDirectoryServiceAccess
提供对 Amazon Directory Service 的访问权限。
例 用于提供 Amazon Directory Service 访问权限的 IAM 策略
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ds:DescribeDirectories", "ds:AuthorizeApplication", "ds:UnauthorizeApplication", "ds:GetAuthorizedApplicationDetails" ], "Effect": "Allow", "Resource": "*" } ] }
我们建议在基于资源的信任关系中使用 aws:SourceArn
和 aws:SourceAccount
全局条件上下文键,以此限制服务对特定资源的权限。这是防范混淆代理问题最有效的方法。
您可以使用这两个全局条件上下文键并让 aws:SourceArn
值包含账户 ID。在这种情况下,当 aws:SourceAccount
值和 aws:SourceArn
值中的账户使用相同策略语句时,确保二者使用相同的账户 ID。
-
如果您想对单个资源进行跨服务访问,请使用
aws:SourceArn
。 -
如果您想允许该账户中的任何资源与跨服务使用操作相关联,请使用
aws:SourceAccount
。
在信任关系中,请务必使用 aws:SourceArn
全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。对于 Windows 身份验证,请确保包含数据库实例,如以下示例所示。
例 与 Windows 身份验证的全局条件上下文键的信任关系
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceArn": [ "arn:aws:rds:
Region
:my_account_ID
:db:db_instance_identifier
" ] } } } ] }
使用此 IAM 策略和信任关系创建 IAM 角色。有关创建 IAM 角色的更多信息,请参阅 IAM 用户指南 中的创建客户托管策略。
步骤 3:创建和配置用户和组
您可以使用“Active Directory 用户和计算机”工具创建用户和组。该工具是 Active Directory Domain Services 和 Active Directory Lightweight Directory Services 工具之一。用户表示有权访问您的目录的独立个人或实体。对于针对用户组授予或拒绝权限非常有用,从而不必将这些权限应用于每个独立用户。
要在 Amazon Directory Service 目录中创建用户和组,您必须连接到属于 Amazon Directory Service 目录成员的 Windows EC2 实例。您还必须以具有创建用户和组权限的用户身份登录。有关更多信息,请参阅 Amazon Directory Service管理指南中的添加用户和组(Simple AD 和 Amazon Managed Microsoft AD)。
步骤 4:在目录和数据库实例之间启用跨 VPC 流量
如果您打算将目录和数据库实例放在同一 VPC 中,请跳过该步骤,然后转到步骤 5:创建或修改 SQL Server 数据库实例。
如果您计划在不同 VPC 中查找目录和数据库实例,请使用 VPC 对等连接或 Amazon Transit Gateway 配置跨 VPC 流量。
以下过程使用 VPC 对等连接启用 VPC 之间的流量。请按照 Amazon Virtual Private Cloud 对等连接指南中的什么是 VPC 对等连接?操作。
使用 VPC 对等连接启用跨 VPC 流量
-
设置适合的 VPC 路由规则,以便确保网络流量可以双向流动。
-
确保数据库实例的安全组可以从目录的安全组接收入站流量。
-
确保没有任何网络访问控制列表 (ACL) 规则会阻止流量。
如果该目录由不同的 Amazon 账户拥有,则您必须共享该目录。
在 Amazon 账户之间共享目录
-
按照 Amazon 管理指南中的教程:共享 Amazon Managed Microsoft AD 目录以实现无缝 EC2 域加入中的说明,开始与将要在其中创建数据库实例的 Amazon Directory Service 账户共享目录。
-
使用数据库实例的账户登录到 Amazon Directory Service 控制台,并确保在处理之前域具有
SHARED
状态。 -
使用数据库实例的账户登录 Amazon Directory Service 控制台时,请记录目录 ID 值。您可以使用此目录 ID 将数据库实例加入域。
步骤 5:创建或修改 SQL Server 数据库实例
创建或修改 SQL Server 数据库实例,以便与您的目录一起使用。您可以使用控制台、CLI 或 RDS API 将数据库实例与目录关联。您可以通过下列方式之一来执行该操作:
-
使用控制台、create-db-instance CLI 命令或 CreateDBInstance RDS API 操作创建新的 SQL Server 数据库实例。
有关说明,请参阅创建 Amazon RDS 数据库实例。
-
使用控制台、modify-db-instance CLI 命令或 ModifyDBInstance RDS API 操作修改现有 SQL Server 数据库实例。
有关说明,请参阅修改 Amazon RDS 数据库实例。
-
使用控制台、restore-db-instance-from-db-snapshot CLI 命令或 RestoreDBInstanceFromDBSnapshot RDS API 操作,从数据库快照还原 SQL Server 数据库实例。
有关说明,请参阅还原到数据库实例。
-
使用控制台、restore-db-instance-to-point-in-time CLI 命令或 RestoreDBInstanceToPointInTime RDS API 操作,将 SQL Server 数据库实例还原到某个时间点。
有关说明,请参阅将数据库实例还原到指定时间。
只有 VPC 中的 SQL Server 数据库实例才支持 Windows 身份验证。
要使数据库实例能够使用您创建的域目录,需要满足以下条件:
-
对于目录,您必须选择创建目录时生成的域标识符 (
d-
)。ID
-
确保 VPC 安全组具有允许数据库实例与目录通信的出站规则。
![Microsoft SQL Server Windows 身份验证目录](images/WinAuth1.png)
使用 Amazon CLI 时,数据库实例需要以下参数才能使用您创建的目录:
-
对于
--domain
参数,请使用创建目录时生成的域标识符 (d-
)。ID
-
对于
--domain-iam-role-name
参数,请使用您通过托管 IAM 策略AmazonRDSDirectoryServiceAccess
创建的角色。
例如,以下 CLI 命令会修改数据库实例以使用目录。
对于 Linux、macOS 或 Unix:
aws rds modify-db-instance \ --db-instance-identifier
mydbinstance
\ --domain d-ID
\ --domain-iam-role-namerole-name
对于 Windows:
aws rds modify-db-instance ^ --db-instance-identifier
mydbinstance
^ --domain d-ID
^ --domain-iam-role-namerole-name
重要
如果您修改数据库实例以启用 Kerberos 身份验证,请在进行更改之后重启数据库实例。
步骤 6:创建 Windows 身份验证 SQL Server 登录名
使用 Amazon RDS 主用户凭证连接到 SQL Server 数据库实例,就像连接到任何其他数据库实例一样。由于数据库实例已加入 Amazon Managed Microsoft AD 域,因此您可以预配置 SQL Server 登录名和用户。您可以从域中的 Active Directory 用户和组执行此操作。通过对这些 Windows 登录名授予和撤销标准 SQL Server 权限来管理数据库权限。
对于 Active Directory 用户,要对 SQL Server 进行身份验证,此用户或其所属的组必须存在 SQL Server Windows 登录名。访问权限的精细控制是通过对这些 SQL Server 登录名授予和撤销权限来处理的。用户没有 SQL Server 登录名,或者用户所属组中的登录名无法访问 SQL Server 数据库实例。
创建 Active Directory SQL Server 登录名需要 ALTER ANY LOGIN 权限。如果您未使用此权限创建任何登录名,请使用 SQL Server 身份验证作为数据库实例的主用户进行连接。
运行数据定义语言 (DDL) 命令(如以下示例)为 Active Directory 用户或组创建 SQL Server 登录名。
注意
使用 Windows 2000 之前的登录名称指定用户和组,格式为
。您不能使用 domainName
\login_name
login_name
@
格式的用户主体名 (UPN)。DomainName
您只能使用 T-SQL 语句在 RDS for SQL Server 实例上创建 Windows 身份验证登录名。您无法使用 SQL Server Management Studio 创建 Windows 身份验证登录名。
USE [master] GO CREATE LOGIN [
mydomain
\myuser
] FROM WINDOWS WITH DEFAULT_DATABASE = [master], DEFAULT_LANGUAGE = [us_english]; GO
有关更多信息,请参阅 Microsoft 开发人员网络文档中的 CREATE LOGIN (Transact-SQL)
域中用户(人和应用程序)现在均可从加入域的客户端计算机使用 Windows 身份验证连接到 RDS for SQL Server 实例。
在域中管理数据库实例
您可以使用控制台、Amazon CLI 或 Amazon RDS API 来管理数据库实例及其与您的域的关系。例如,您可以将数据库实例移入域、移出域或在域之间移动。
例如,使用 Amazon RDS API,您可以执行下列操作:
-
要为失败的成员资格重新尝试域加入,请使用 ModifyDBInstance API 操作并指定当前成员资格的目录 ID。
-
要为成员资格更新 IAM 角色名称,请使用
ModifyDBInstance
API 操作并指定当前成员资格的目录 ID 和新的 IAM 角色。 -
要从域中删除数据库实例,请使用
ModifyDBInstance
API 操作并指定none
作为域参数。 -
要将数据库实例从一个域移至另一个域,请使用
ModifyDBInstance
API 操作并指定新域的域标识符作为域参数。 -
要列出每个数据库实例的成员资格,请使用 DescribeDBInstances API 操作。
了解域成员资格
在创建或修改数据库实例后,实例将成为域的成员。Amazon 控制台将指示数据库实例的域成员资格状态。数据库实例的状态可以是以下状态之一:
-
已联接 – 实例是域的成员。
-
正在联接 – 实例正处于成为域成员的过程中。
-
待联接 – 实例成员资格待定。
-
pending-maintenance-join – Amazon将在下一计划维护期间尝试使实例成为域成员。
-
待删除 – 等待从域中删除实例。
-
pending-maintenance-removal – Amazon将在下一计划维护期间尝试从域中删除实例。
-
失败 – 配置问题阻碍实例联接域。在重新发出实例修改命令之前检查并修复配置。
-
正在删除 – 正从域中删除实例。
成为域成员的请求可能因网络连接问题或不正确的 IAM 角色而失败。例如,您可能会创建数据库实例或修改现有实例,并且尝试使数据库成为某个域的成员会失败。在这种情况下,您重新发出命令以创建或修改数据库实例,或者修改新创建的实例以加入域。
使用 Windows 身份验证连接到 SQL Server
要使用 Windows 身份验证连接到 SQL Server,您必须作为域用户登录联接域的计算机。在启动 SQL Server Management Studio 之后,请选择 Windows 身份验证作为身份验证类型,如下所示。
![使用 Windows 身份验证连接到 SQL Server](images/WinAuth4.png)
还原 SQL Server 数据库实例,然后将其添加到域中
您可还原数据库快照或为 SQL Server 数据库实例执行时间点恢复 (PITR),然后将其添加到域中。数据库实例还原后,使用步骤 5:创建或修改 SQL Server 数据库实例中介绍的过程修改此实例以将数据库实例添加到域中。