为 RDS Custom for SQL Server 实例设置 Windows 身份验证 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为 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
  1. 以域管理员身份连接到您的域 AD。

  2. 打开 Active Directory 用户和计算机,然后选择要在其中创建 OU 的域。

  3. 右键单击该域并选择新建,然后选择组织单位

  4. 为 OU 输入名称。

    启用保护容器免遭意外删除

  5. 选择确定。您的新 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 域用户
  1. 打开 Active Directory 用户和计算机,然后选择要在其中创建用户的域和 OU。

  2. 右键单击用户对象并选择新建,然后选择用户

  3. 输入用户的名字、姓氏和登录名。单击下一步

  4. 输入用户的密码。请勿选择用户下次登录时必须更改密码账户已禁用。单击下一步

  5. 单击确定。您的新用户将出现在您的域下。

步骤 3:将控制权委派给自托管式 AD 或 Amazon Managed Microsoft AD 中的 AD 用户

将控制权委派给域中的 AD 域用户
  1. 打开 Active Directory 用户和计算机 MMC 管理单元,然后选择您的域。

  2. 右键单击您之前创建的 OU,然后选择委派控制权

  3. 委派控制权向导中,单击下一步

  4. 用户或组部分,单击添加

  5. 选择用户、计算机或组中,输入您创建的 AD 用户,然后单击检查名称。如果您的 AD 用户检查成功,请单击确定

  6. 用户或组部分,确认您的 AD 用户已添加,然后单击下一步

  7. 要委派的任务部分,选择创建要委派的自定义任务,然后单击下一步

  8. Active Directory 对象类型部分:

    选择仅文件夹中的以下对象

    选择计算机对象

    选择在此文件夹中创建选定对象

    选择删除此文件夹中的选定对象,然后单击下一步

  9. 权限部分:

    常规保持为选中状态。

    选择已验证写入 DNS 主机名

    选择已验证写入服务主体名称,然后单击下一步

  10. 完成控制权委派向导中,请确认您的设置,然后单击完成

步骤 4:创建密钥

在包含要加入 Active Directory 的 RDS Custom for SQL Server 数据库实例的同一 Amazon Web Services 账户和区域中创建密钥。存储在步骤 2:创建 AD 域用户中创建的 AD 域用户的凭证。

Console
  • 在 Amazon Secrets Manager 中,选择存储新密钥

  • 对于密钥类型,请选择其他密钥类型

  • 对于键/值对,请添加两个键:

    • 对于第一个键,输入 SELF_MANAGED_ACTIVE_DIRECTORY_USERNAME,然后输入您的 AD 用户名作为值。

    • 对于第二个键,输入 SELF_MANAGED_ACTIVE_DIRECTORY_PASSWORD,然后输入域中 AD 用户的密码。

  • 加密密钥中,输入创建 RDS Custom for SQL Server 实例时所用的相同 Amazon KMS 密钥。

  • 对于密钥名称,选择以 do-not-delete-rds-custom- 开头的密钥名称,以允许您的实例配置文件访问此密钥。如果您想为密钥选择一个不同的名称,请更新 RDSCustomInstanceProfile 以访问密钥名称

  • (可选)对于描述,输入密钥名称的描述。

  • 添加标签 Key="AWSRDSCustom",Value="custom-sqlserver"

  • 单击保存,然后单击下一步

  • 对于配置轮换设置,保留原定设置值并选择下一步

  • 查看密钥的设置,然后单击存储

  • 选择新密钥,然后复制密钥 ARN 的值。下一步将用它来设置您的 Active Directory。

CLI

在 CLI 中运行以下命令来创建密钥:

# Linux based aws secretsmanager create-secret \ --name do-not-delete-rds-custom-DomainUserCredentails \ --description "Active directory user credentials for managing RDS Custom" \ --secret-string "{\"SELF_MANAGED_ACTIVE_DIRECTORY_USERNAME\":\"tester\",\"SELF_MANAGED_ACTIVE_DIRECTORY_PASSWORD\":\"xxxxxxxx\"}" \ --kms-key-id <RDSCustomKMSKey> \ --tags Key="AWSRDSCustom",Value="custom-sqlserver" # Windows based aws secretsmanager create-secret ^ --name do-not-delete-rds-custom-DomainUserCredentails ^ --description "Active directory user credentials for managing RDS Custom" ^ --secret-string "{\"SELF_MANAGED_ACTIVE_DIRECTORY_USERNAME\":\"tester\",\"SELF_MANAGED_ACTIVE_DIRECTORY_PASSWORD\":\"xxxxxxxx\"}" ^ --kms-key-id <RDSCustomKMSKey> ^ --tags Key="AWSRDSCustom",Value="custom-sqlserver"

步骤 5:创建或修改 RDS Custom for SQL Server 数据库实例

创建或修改 RDS Custom for SQL Server 数据库实例,以便与您的目录一起使用。您可以使用控制台、CLI 或 RDS API 将数据库实例与目录关联。您可以通过下列方式之一来执行该操作:

注意

如果已手动将 RDS Custom for SQL Server 实例加入 AD,请检查 网络配置端口规则网络验证 的设置,然后完成步骤 1 至步骤 4。将 --domain-fqdn--domain-ou--domain-auth-secret-arn 更新到您的 AD,以便在 RDS Custom 中注册域加入凭证和配置,以监控、注册 CNAME 并采取恢复操作。

使用 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-username my-master-username \ --master-user-password my-master-password \ --kms-key-id my-RDSCustom-key-id \ --custom-iam-instance-profile AWSRDSCustomInstanceProfileForRdsCustomInstance \ --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-name my-DB-subnet-grp \ --vpc-security-group-ids my-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-password my-master-password ^ --kms-key-id my-RDSCustom-key-id ^ --custom-iam-instance-profile AWSRDSCustomInstanceProfileForRdsCustomInstance ^ --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-name my-DB-subnet-grp ^ --vpc-security-group-ids my-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 身份验证以查看以下选项。

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 端点为 rds-instance-name.account-region-hash.aws-region.rds.amazonaws.com,则相应基于 Kerberos 的端点将为 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。

浏览 awsrdsaws-region,以及账户和区域特定的哈希值

如果您要连接 RDS Custom EC2 实例并尝试使用 CNAME 在本地连接到数据库,则您的连接将使用 NTLM 身份验证而不是 Kerberos。

如果从远程客户端连接 CNAME 后返回了 NTLM 连接,请检查所需端口是否已列入允许列表。

要检查您的连接是否使用 Kerberos,请运行以下查询:

SELECT net_transport, auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@SSPID;