为 RDS Custom for SQL Server 实例设置 Windows 身份验证
我们建议为任何拥有已加入 AD 域的 RDS Custom for SQL Server 数据库实例的 Amazon Web Services 账户创建专用 OU 以及作用域为该 OU 的服务凭证。通过专用 OU 和服务凭证,您可以避免权限冲突并遵循最低权限原则。
Active Directory 级别的组策略可能与 Amazon 自动化和权限发生冲突。我们建议选择仅适用于您为 RDS Custom for SQL Server 创建的 OU 的 GPO。
要在自托管式或本地 AD 中创建 OU 和 AD 域用户,您可以以域管理员身份连接域控制器。
-
要在 Amazon Directory Service 目录中创建用户和组,必须连接到管理实例,还必须已作为有权创建用户和组的用户登录。有关更多信息,请参阅《Amazon Directory Service 管理指南》中的 Amazon Managed Microsoft AD 中的用户和组管理。
-
要从 Amazon EC2 Windows Server 实例中管理 Active Directory,您需要在 EC2 实例上安装 Active Directory Domain Services 和 Active Directory Lightweight Directory Services 工具。有关更多信息,请参阅《Amazon Directory Service 管理指南》中的为 Amazon Managed Microsoft AD 安装 Active Directory 管理工具。
-
为了便于管理,建议您将这些工具安装在单独的 EC2 实例上,而不是 RDS Custom for SQL Server 数据库实例上。
AD 域服务账户的要求如下:
您必须在 AD 域中有一个服务账户,该账户具有将计算机加入该域的委派权限。域服务账户是您的 AD 中的一个用户账户,该账户具有执行某些任务的委派权限。
-
在您要加入 RDS Custom for SQL Server 实例的组织单位中向域服务账户委派以下权限:
验证写入 DNS 主机名的能力
验证写入服务主体名称的能力
创建和删除计算机对象
-
对于自托管式和本地 AD,域服务账户必须是“Amazon 域名系统委托管理员”组的成员。
-
对于 Amazon Managed Microsoft AD,域名服务账户应是“DnsAdmins”组的成员。
这些是将计算机对象加入自托管式 AD 和 Amazon Managed Microsoft AD 至少需要具备的一组权限。有关更多信息,请参阅 Microsoft Windows Server 文档中的错误:当已委派控制的非管理员用户尝试将计算机加入域控制器时,访问被拒绝
重要
创建数据库实例后,请勿移动 RDS Custom for SQL Server 在组织单位(OU)中创建的计算机对象。移动关联对象可能会导致您的 RDS Custom for SQL Server 数据库实例出现配置错误。如果您需要移动 Amazon RDS 创建的计算机对象,请通过 ModifyDBInstance 操作用计算机对象所需位置修改域参数。
主题
步骤 1:在 AD 中创建组织单位(OU)
请按照以下步骤在 AD 中创建组织单位:
在 AD 中创建 OU
-
以域管理员身份连接到您的域 AD。
-
打开 Active Directory 用户和计算机,然后选择要在其中创建 OU 的域。
-
右键单击该域并选择新建,然后选择组织单位。
-
为 OU 输入名称。
启用保护容器免遭意外删除。
-
选择确定。您的新 OU 将出现在您的域下。
对于 Amazon Managed Microsoft AD,此 OU 的名称基于您在创建目录时键入的 NetBIOS 名称。此 OU 属于 Amazon 并且包含您有权完全控制的所有 Amazon 相关目录对象。默认情况下,此 OU 下存在两个子 OU,名为 Computers 和 Users。RDS Custom 创建的新 OU 是基于 NetBIOS 的 OU 的子级。
步骤 2:创建 AD 域用户
域用户凭证用于 Secrets Manager 中的密钥。
在您的 AD 中创建 AD 域用户
打开 Active Directory 用户和计算机,然后选择要在其中创建用户的域和 OU。
右键单击用户对象并选择新建,然后选择用户。
输入用户的名字、姓氏和登录名。单击下一步。
输入用户的密码。请勿选择用户下次登录时必须更改密码或账户已禁用。单击下一步。
单击确定。您的新用户将出现在您的域下。
步骤 3:将控制权委派给自托管式 AD 或 Amazon Managed Microsoft AD 中的 AD 用户
将控制权委派给域中的 AD 域用户
-
打开 Active Directory 用户和计算机 MMC 管理单元,然后选择您的域。
-
右键单击您之前创建的 OU,然后选择委派控制权。
-
在委派控制权向导中,单击下一步。
-
在用户或组部分,单击添加。
-
在选择用户、计算机或组中,输入您创建的 AD 用户,然后单击检查名称。如果您的 AD 用户检查成功,请单击确定。
-
在用户或组部分,确认您的 AD 用户已添加,然后单击下一步。
-
在要委派的任务部分,选择创建要委派的自定义任务,然后单击下一步。
-
在 Active Directory 对象类型部分:
选择仅文件夹中的以下对象。
选择计算机对象
选择在此文件夹中创建选定对象
选择删除此文件夹中的选定对象,然后单击下一步。
-
在权限部分:
将常规保持为选中状态。
选择已验证写入 DNS 主机名。
选择已验证写入服务主体名称,然后单击下一步。
-
在完成控制权委派向导中,请确认您的设置,然后单击完成。
步骤 4:创建密钥
在包含要加入 Active Directory 的 RDS Custom for SQL Server 数据库实例的同一 Amazon Web Services 账户和区域中创建密钥。存储在步骤 2:创建 AD 域用户中创建的 AD 域用户的凭证。
步骤 5:创建或修改 RDS Custom for SQL Server 数据库实例
创建或修改 RDS Custom for 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 数据库实例还原到某个时间点。
有关说明,请参阅将 Amazon RDS 的数据库实例还原到指定时间。
注意
使用 Amazon CLI 时,数据库实例需要以下参数才能使用您创建的目录:
-
对于
--domain-fqdn
参数,请使用自托管式 AD 的完全限定域名。 -
对于
--domain-ou
参数,请使用您在自托管式 AD 中创建的 OU。 -
对于
--domain-auth-secret-arn
参数,请使用您创建的密钥 ARN 的值。
重要
如果您修改数据库实例,以加入自托管式 AD 域或 Amazon Managed Microsoft AD 或者从中删除,则需要重启数据库实例才能使修改生效。您可以选择立即应用更改,也可以等到下一个维护时段。选择立即应用选项会导致单可用区数据库实例停机。多可用区数据库实例集群会在完成重启之前执行失效转移。有关更多信息,请参阅 修改 Amazon RDS 数据库实例。
以下 CLI 命令创建一个新的 RDS Custom for SQL Server 数据库实例并将其加入自托管式或 Amazon Managed Microsoft AD 域。
对于 Linux、macOS 或 Unix:
aws rds create-db-instance \ --engine custom-sqlserver-se \ --engine-version 15.00.4312.2.v1 \ --db-instance-identifier
my-custom-instance
\ --db-instance-class db.m5.large \ --allocated-storage 100 --storage-type io1 --iops 1000 \ --master-usernamemy-master-username
\ --master-user-passwordmy-master-password
\ --kms-key-idmy-RDSCustom-key-id
\ --custom-iam-instance-profileAWSRDSCustomInstanceProfileForRdsCustomInstance
\ --domain-fqdn"corp.example.com"
\ --domain-ou"OU=RDSCustomOU,DC=corp,DC=example,DC=com"
\ --domain-auth-secret-arn"arn:aws:secretsmanager:region:account-number:secret:do-not-delete-rds-custom-my-AD-test-secret-123456"
\ --db-subnet-group-namemy-DB-subnet-grp
\ --vpc-security-group-idsmy-securitygroup-id
\ --no-publicly-accessible \ --backup-retention-period 3 \ --port 8200 \ --region us-west-2 \ --no-multi-az
对于 Windows:
aws rds create-db-instance ^ --engine custom-sqlserver-se ^ --engine-version 15.00.4312.2.v1 ^ --db-instance-identifier
my-custom-instance
^ --db-instance-class db.m5.large ^ --allocated-storage 100 --storage-type io1 --iops 1000 ^ --master-usernamemy-master-username
^ --master-user-passwordmy-master-password
^ --kms-key-idmy-RDSCustom-key-id
^ --custom-iam-instance-profileAWSRDSCustomInstanceProfileForRdsCustomInstance
^ --domain-fqdn"corp.example.com"
^ --domain-ou"OU=RDSCustomOU,DC=corp,DC=example,DC=com"
^ --domain-auth-secret-arn"arn:aws:secretsmanager:region:account-number:secret:do-not-delete-rds-custom-my-AD-test-secret-123456"
^ --db-subnet-group-namemy-DB-subnet-grp
^ --vpc-security-group-idsmy-securitygroup-id
^ --no-publicly-accessible ^ --backup-retention-period 3 ^ --port 8200 ^ --region us-west-2 ^ --no-multi-az
重要
如果您的 Amazon Managed Microsoft AD 的 NetBIOS 为 corpexample,那么它本身就会显示为 OU。之前创建的任何新 OU 都将显示为嵌套 OU。对于 Amazon Managed Microsoft AD,将 --domain-ou
设置为 "OU=RDSCustomOU,OU=corpexample,DC=corp,DC=example,DC=com"
。
以下命令将现有 RDS Custom for SQL Server 数据库实例修改为使用 Active Directory 域。
对于 Linux、macOS 或 Unix:
aws rds modify-db-instance \ --db-instance-identifier
my-custom-instance
\ --domain-fqdn"corp.example.com"
\ --domain-ou"OU=RDSCustomOU,DC=corp,DC=example,DC=com"
\ --domain-auth-secret-arn"arn:aws:secretsmanager:region:account-number:secret:do-not-delete-rds-custom-my-AD-test-secret-123456"
\
对于 Windows:
aws rds modify-db-instance ^ --db-instance-identifier
my-custom-instance
^ --domain-fqdn"corp.example.com"
^ --domain-ou"OU=RDSCustomOU,DC=corp,DC=example,DC=com"
^ --domain-auth-secret-arn"arn:aws:secretsmanager:region:account-number:secret:do-not-delete-rds-custom-my-AD-test-secret-123456"
^
以下 CLI 命令从 Active Directory 域中删除 RDS Custom for SQL Server 数据库实例。
对于 Linux、macOS 或 Unix:
aws rds modify-db-instance \ --db-instance-identifier
my-custom-instance
\ --disable-domain
对于 Windows:
aws rds modify-db-instance ^ --db-instance-identifier
my-custom-instance
^ --disable-domain
使用控制台创建或修改实例时,单击启用 Microsoft SQL Server Windows 身份验证以查看以下选项。
您负责确保您的域 FQDN 解析为域控制器 IP 地址。如果域控制器 IP 未解析,则域加入操作将失败,但会成功创建 RDS Custom for SQL Server 实例。有关故障排除信息,请参阅Active Directory 故障排除。
步骤 6:创建 Windows 身份验证 SQL Server 登录名
使用 Amazon RDS 主用户凭证连接 SQL Server 数据库实例,就像连接任何其他数据库实例一样。由于数据库实例已加入 AD 域,因此您可以预配置 SQL Server 登录名和用户。您可以通过 AD 域中的 AD 用户和组实用程序执行此操作。通过对这些 Windows 登录名授予和撤销标准 SQL Server 权限来管理数据库权限。
对于 AD 用户,要对 SQL Server 进行身份验证,AD 用户或其所属的 Active Directory 组必须存在 SQL Server Windows 登录名。访问权限的精细控制是通过对这些 SQL Server 登录名授予和撤销权限来处理的。AD 用户没有 SQL Server 登录名,或者用户所属 AD 组中的登录名无法访问 SQL Server 数据库实例。
创建 AD SQL Server 登录名需要 ALTER ANY LOGIN
权限。如果您尚未使用此权限创建任何登录名,请使用 SQL Server 身份验证以数据库实例的主用户身份进行连接,并在主用户的上下文下创建 AD SQL Server 登录名。
您可以运行数据定义语言(DDL)命令(如以下示例),为 AD 用户或组创建 SQL Server 登录名。
USE [master] GO CREATE LOGIN [mydomain\myuser] FROM WINDOWS WITH DEFAULT_DATABASE = [master], DEFAULT_LANGUAGE = [us_english]; GO
域中用户(人和应用程序)现在均可从加入域的客户端计算机使用 Windows 身份验证连接到 RDS Custom for SQL Server 实例。
步骤 7:使用 Kerberos 或 NTLM 身份验证
使用 RDS 端点进行 NTLM 身份验证
每个 Amazon RDS 数据库实例都有一个端点,每个端点都包含数据库实例的 DNS 名称和端口号。要使用 SQL 客户端应用程序连接到数据库实例,您需要该数据库实例的 DNS 名称和端口号。要使用 NTLM 身份验证进行身份验证,必须连接到 RDS 端点。
在计划内数据库维护或计划外服务中断期间,Amazon RDS 将自动失效转移到最新辅助数据库,以便操作能够在不进行手动干预的情况下快速恢复。主实例和辅助实例使用相同的端点,其物理网络地址作为失效转移过程的一部分转换到辅助实例。在故障转移时,您不必重新配置应用程序。
Kerberos 身份验证
RDS Custom for SQL Server 的基于 Kerberos 的身份验证要求连接到特定的服务主体名称(SPN)。但是,在失效转移事件发生后,应用程序可能不知道新 SPN。为了解决这个问题,RDS Custom for SQL Server 提供了一个基于 Kerberos 的端点。
基于 Kerberos 的端点遵循一种特定的格式。如果您的 RDS 端点为
,则相应基于 Kerberos 的端点将为 rds-instance-name
.account-region-hash
.aws-region
.rds.amazonaws.com
。rds-instance-name
.account-region-hash
.aws-region
.awsrds.fully qualified domain name (FQDN)
例如,如果 RDS 端点为 ad-test.cocv6zwtircu.us-east-1.rds.amazonaws.com
,域名为 corp-ad.company.com
,则基于 Kerberos 的端点将为 ad-test.cocv6zwtircu.us-east-1.awsrds.corp-ad.company.com
。
这个基于 Kerberos 的端点可用于使用 Kerberos 对 SQL Server 实例进行身份验证,即使在失效转移事件发生后也是如此,因为端点会自动更新为指向主 SQL Server 实例的新 SPN。
查找您的 CNAME
要查找您的 CNAME,请连接到域控制器并打开 DNS 管理器。导航到正向查找区域和您的 FQDN。
浏览 awsrds、aws-region,以及账户和区域特定的哈希值。
如果您要连接 RDS Custom EC2 实例并尝试使用 CNAME 在本地连接到数据库,则您的连接将使用 NTLM 身份验证而不是 Kerberos。
如果从远程客户端连接 CNAME 后返回了 NTLM 连接,请检查所需端口是否已列入允许列表。
要检查您的连接是否使用 Kerberos,请运行以下查询:
SELECT net_transport, auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@SSPID;