将自托管式 Active Directory 用于 Amazon RDS for SQL Server 数据库实例 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将自托管式 Active Directory 用于 Amazon RDS for SQL Server 数据库实例

无论您的 AD 托管在企业数据中心、Amazon EC2 上还是其他云提供商处,您都可以将 RDS for SQL Server 数据库实例直接加入到您的自托管式 Active Directory(AD)域。借助自托管式 AD,您可以使用 NTLM 身份验证直接控制 RDS for SQL Server 数据库实例上的用户和服务的身份验证,而无需使用中间域和林信任。当用户在加入您自托管式 AD 域的 RDS for SQL Server 数据库实例上进行身份验证时,身份验证请求将会转发到您指定的自托管式 AD 域中。

区域和版本可用性

Amazon RDS 在所有 Amazon Web Services 区域都支持通过自托管式 AD 使用 NTLM 控制 SQL Server 的身份验证。

要求

在将 RDS for SQL Server 数据库实例加入自托管式 AD 域之前,请确保您已满足以下要求。

配置您的本地 AD

确保您有一个本地或其他自托管式 Microsoft AD,您可以在其中加入 Amazon RDS for SQL Server 实例。您的本地 AD 应具有以下配置:

  • 如果您定义了 Active Directory 站点,请确保在 Active Directory 站点中定义与 RDS for SQL Server 数据库实例关联的 VPC 中的子网。确认您的 VPC 中的子网与您其他 AD 站点中的子网之间没有任何冲突。

  • 您 AD 域控制器的域功能级别为 Windows Server 2008 R2 或更高版本。

  • 您的 AD 域名不能采用单标签域(SLD)格式。RDS for SQL Server 不支持 SLD 域。

  • 您 AD 的完全限定域名(FQDN)和组织单位(OU)不能超过 64 个字符。

配置您的网络连接

确保您满足以下网络配置:

  • 在您要在其中创建 RDS for SQL Server 数据库实例的 Amazon VPC 与自托管式 Active Directory 之间配置了连接。您可以使用 Amazon Direct Connect、Amazon VPN、VPC 对等或 Amazon Transit Gateway 设置连接。

  • 对于 VPC 安全组,原定设置 Amazon VPC 的原定设置安全组已添加到控制台中的 RDS for SQL Server 数据库实例。确保要在其中创建 RDS for SQL Server 数据库实例的子网的安全组和 VPC 网络 ACL 在端口上允许有下图所示方向的流量。

    
    						自托管式 Active Directory 网络配置端口规则。

    下表确定了每个端口的作用。

    协议 端口 角色
    TCP/UDP 53 域名系统(DNS)
    TCP/UDP 88 Kerberos 身份验证
    TCP/UDP 464 更改/设置密码
    TCP/UDP 389 轻型目录访问协议(LDAP)
    TCP 135 分布式计算环境/端点映射器(DCE/EPMAP)
    TCP 445 目录服务 SMB 文件共享
    TCP 636 基于 TLS/SSL 的轻型目录访问协议(LDAPS)
    TCP 49152 - 65535 RPC 的临时端口
  • 通常,域 DNS 服务器位于 AD 域控制器中。您无需配置 VPC DHCP 选项集即可使用此功能。有关更多信息,请参阅《Amazon VPC 用户指南》中的 DHCP 选项集

重要

如果您使用的是 VPC 网络 ACL,则还必须允许动态端口(49152-65535)上有来自 RDS for SQL Server 数据库实例的出站流量。确保这些流量规则也镜像到适用于每个 AD 域控制器、DNS 服务器和 RDS for SQL Server 数据库实例的防火墙上。

虽然 VPC 安全组要求仅在发起网络流量的方向打开端口,但大多数 Windows 防火墙和 VPC 网络 ACL 要求双向打开端口。

配置您的 AD 域服务账户

确保您的 AD 域服务账户满足以下要求:

  • 确保您在自托管式 AD 域中有一个服务账户,该账户具有将计算机加入该域的委派权限。域服务账户是您的自托管式 AD 中的一个用户账户,该账户已被委派执行某些任务的权限。

  • 需要在您要加入 RDS for SQL Server 数据库实例的组织单位(OU)中向域服务账户委派以下权限:

    • 验证写入 DNS 主机名的能力

    • 验证写入服务主体名称的能力

    • 创建和删除计算机对象

    这些权限代表将计算机对象加入到您自托管式 Active Directory 至少需要具备的一组权限。有关更多信息,请参阅 Microsoft Windows Server 文档中的尝试将计算机加入域时出现错误

重要

创建数据库实例后,请勿移动 RDS for SQL Server 在组织单位中创建的计算机对象。移动关联对象将导致您的 RDS for SQL Server 数据库实例出现配置错误。如果您需要移动 Amazon RDS 创建的计算机对象,请通过 ModifyDBInstance RDS API 操作用计算机对象所需位置修改域参数。

限制

以下限制适用于面向 SQL Server 的自托管式 AD。

  • NTLM 是唯一支持的身份验证类型。不支持 Kerberos 身份验证。如果您需要使用 kerberos 身份验证,则可以使用 Amazon Managed AD,而不是自托管式 AD。

  • 不支持 Microsoft 分布式事务协调器(MSDTC)服务,因为此服务需要 Kerberos 身份验证。

  • 您的 RDS for SQL Server 数据库实例不使用自托管式 AD 域的网络时间协议(NTP)服务器。而是使用 Amazon NTP 服务。

  • SQL Server 链接服务器必须使用 SQL 身份验证连接加入自托管式 AD 域的其他 RDS for SQL Server 数据库实例。

  • 来自自托管式 AD 域的 Microsoft 组策略对象(GPO)设置不适用于 RDS for SQL Server 数据库实例。

设置自托管式 Active Directory 概述

要为 RDS for SQL Server 数据库实例设置自托管式 AD,请执行以下步骤,详情请参阅设置自托管式 Active Directory

在您的 AD 域中:

  • 创建组织单位(OU)。

  • 创建 AD 域用户。

  • 将控制权委派给 AD 域用户。

从 Amazon Web Services Management Console或 API:

  • 创建 Amazon KMS 密钥。

  • 使用 Amazon Secrets Manager 创建密钥。

  • 创建或修改 RDS for SQL Server 数据库实例,然后将其加入自托管式 AD 域。

设置自托管式 Active Directory

要设置自托管式 AD,请执行以下步骤。

步骤 1:在 AD 中创建组织单位

重要

我们建议为任何拥有已加入您自托管式 AD 域的 RDS for SQL Server 数据库实例的 Amazon 账户创建专用 OU 以及作用域为该 OU 的服务凭证。通过专用 OU 和服务凭证,您可以避免权限冲突并遵循最低权限原则。

在 AD 中创建 OU
  1. 以域管理员身份连接到您的 AD 域。

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

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

  4. 为 OU 输入名称。

  5. 选中保护容器免遭意外删除复选框。

  6. 单击 确定。您的新 OU 将出现在您的域下。

步骤 2:在您的 AD 中创建 AD 域用户

域用户凭证将用于 Amazon Secrets Manager 中的密钥。

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

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

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

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

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

步骤 3:将控制权委派给 AD 用户

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

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

  3. 委派控制权向导页面上,单击下一步

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

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

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

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

  8. Active Directory 对象类型部分:

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

    2. 选择计算机对象

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

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

  9. 权限部分:

    1. 常规保持为选中状态。

    2. 选择已验证写入 DNS 主机名

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

  10. 对于完成控制权委派向导,请检查并确认您的设置,然后单击完成

步骤 4:创建 Amazon KMS 密钥

KMS 密钥用于加密您的 Amazon 密钥。

要创建 Amazon KMS 密钥
注意

对于加密密钥,请勿使用 Amazon 原定设置 KMS 密钥。确保在包含要加入自托管式 AD 的 RDS for SQL Server 数据库实例的 Amazon 账户中创建 Amazon KMS 密钥。

  1. 在 Amazon KMS 控制台中,选择创建密钥

  2. 对于密钥类型,选择对称

  3. 对于密钥用法,选择加密和解密

  4. 对于 Advanced options (高级选项)

    1. 对于密钥材料源,选择 KMS

    2. 对于区域性,选择单区域密钥,然后单击下一步

  5. 对于别名,提供 KMS 密钥的名称。

  6. (可选)对于描述,提供 KMS 密钥的描述。

  7. (可选)对于标签,提供 KMS 密钥的标签,然后单击下一步

  8. 对于密钥管理员,提供 IAM 用户的名称并将其选中。

  9. 对于密钥删除,确保选中允许密钥管理员删除此密钥复选框,然后单击下一步

  10. 对于密钥用户,请提供上一步中的 IAM 用户并将其选中。单击下一步

  11. 审核配置。

  12. 对于密钥策略,请在策略声明中包括以下内容:

    { "Sid": "Allow use of the KMS key on behalf of RDS", "Effect": "Allow", "Principal": { "Service": [ "rds.amazonaws.com" ] }, "Action": "kms:Decrypt", "Resource": "*" }
  13. 单击 Finish (完成)

步骤 5:创建 Amazon 密钥

创建密钥
注意

确保在包含要加入自托管式 AD 的 RDS for SQL Server 数据库实例的 Amazon 账户中创建密钥。

  1. 在 Amazon Secrets Manager 下,选择存储新密钥

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

  3. 对于键/值对,请添加您的两个密钥:

    1. 对于第一个密钥,请输入 CUSTOMER_MANAGED_ACTIVE_DIRECTORY_USERNAME

    2. 对于第一个密钥的值,请输入您在上一步中在域上创建的 AD 用户的名称。

    3. 对于第二个密钥,请输入 CUSTOMER_MANAGED_ACTIVE_DIRECTORY_PASSWORD

    4. 对于第二个密钥的值,请输入您在域中为 AD 用户创建的密码。

  4. 对于加密密钥,输入您在上一步中创建的 KMS 密钥,然后单击下一步

  5. 密钥名称中,输入一个描述性名称,以便您稍后查找自己的密钥。

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

  7. 对于资源权限,请单击编辑

  8. 将以下策略添加到权限策略中:

    注意

    我们建议您在策略中使用 aws:sourceAccountaws:sourceArn 条件,以避免出现混淆代理人问题。将您的 Amazon Web Services 账户用于 aws:sourceAccount,并将 RDS for SQL Server 数据库实例 ARN 用于 aws:sourceArn。有关更多信息,请参阅防范跨服务混淆代理问题

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "secretsmanager:GetSecretValue", "Resource": "*", "Condition": { "StringEquals": { "aws:sourceAccount": "123456789012" }, "ArnLike": { "aws:sourceArn": "arn:aws:rds:us-west-2:123456789012:db:*" } } } ] }
  9. 单击保存,然后单击下一步

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

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

  12. 选择您创建的密钥,然后复制密钥 ARN 的值。下一步将使用它来设置自托管式 Active Directory。

步骤 6:创建或修改 SQL Server 数据库实例

您可以使用控制台、CLI 或 RDS API 将 RDS for SQL Server 数据库实例与自托管式 AD 域关联。您可以通过下列方式之一来执行该操作:

使用 Amazon CLI 时,数据库实例需要以下参数才能使用您创建的自托管式 Active Directory 域:

  • 对于 --domain-fqdn 参数,请使用自托管式 Active Directory 的完全限定域名(FQDN)。

  • 对于 --domain-ou 参数,请使用您在自托管式 AD 中创建的 OU。

  • 对于 --domain-auth-secret-arn 参数,使用您在上一步中创建的密钥 ARN 的值。

  • 对于 --domain-dns-ips 参数,请使用自托管式 AD 的 DNS 服务器的主要 IPv4 地址和辅助 IPv4 地址。如果您没有辅助 DNS 服务器 IP 地址,请输入主 IP 地址两次。

以下示例 CLI 命令显示了如何创建、修改和删除已加入自托管式 AD 域的 RDS for SQL Server 数据库实例。

重要

如果您修改数据库实例,将其加入自托管式 AD 域或将其从自托管式 AD 域中删除,则需要重启数据库实例才能使修改生效。您可以选择立即应用更改,也可以等到下一个维护时段。选择立即应用选项将导致单可用区数据库实例停机。多可用区数据库实例将在完成重启之前执行失效转移。有关更多信息,请参阅使用“立即应用”设置

以下 CLI 命令创建一个新的 RDS for SQL Server 数据库实例并将其加入自托管式 AD 域。

对于 Linux、macOS 或 Unix:

aws rds create-db-instance \ --db-instance-identifier my-DB-instance \ --db-instance-class db.m5.xlarge \ --allocated-storage 50 \ --engine sqlserver-se \ --engine-version 15.00.4043.16.v1 \ --license-model license-included \ --master-username my-master-username \ --master-user-password my-master-password \ --domain-fqdn my_AD_domain.my_AD.my_domain \ --domain-ou OU=my-AD-test-OU,DC=my-AD-test,DC=my-AD,DC=my-domain \ --domain-auth-secret-arn "arn:aws:secretsmanager:region:account-number:secret:my-AD-test-secret-123456" \ --domain-dns-ips "10.11.12.13" "10.11.12.14"

对于 Windows:

aws rds create-db-instance ^ --db-instance-identifier my-DB-instance ^ --db-instance-class db.m5.xlarge ^ --allocated-storage 50 ^ --engine sqlserver-se ^ --engine-version 15.00.4043.16.v1 ^ --license-model license-included ^ --master-username my-master-username ^ --master-user-password my-master-password ^ --domain-fqdn my-AD-test.my-AD.mydomain ^ --domain-ou OU=my-AD-test-OU,DC=my-AD-test,DC=my-AD,DC=my-domain ^ --domain-auth-secret-arn "arn:aws:secretsmanager:region:account-number:secret:my-AD-test-secret-123456" \ ^ --domain-dns-ips "10.11.12.13" "10.11.12.14"

以下 CLI 命令将现有 RDS for SQL Server 数据库实例修改为使用自托管式 Active Directory 域。

对于 Linux、macOS 或 Unix:

aws rds modify-db-instance \ --db-instance-identifier my-DB-instance \ --domain-fqdn my_AD_domain.my_AD.my_domain \ --domain-ou OU=my-AD-test-OU,DC=my-AD-test,DC=my-AD,DC=my-domain \ --domain-auth-secret-arn "arn:aws:secretsmanager:region:account-number:secret:my-AD-test-secret-123456" \ --domain-dns-ips "10.11.12.13" "10.11.12.14"

对于 Windows:

aws rds modify-db-instance ^ --db-instance-identifier my-DBinstance ^ --domain-fqdn my_AD_domain.my_AD.my_domain ^ --domain-ou OU=my-AD-test-OU,DC=my-AD-test,DC=my-AD,DC=my-domain ^ --domain-auth-secret-arn "arn:aws:secretsmanager:region:account-number:secret:my-AD-test-secret-123456" ^ --domain-dns-ips "10.11.12.13" "10.11.12.14"

以下 CLI 命令从自托管式 Active Directory 域中删除 RDS for SQL Server 数据库实例。

对于 Linux、macOS 或 Unix:

aws rds modify-db-instance \ --db-instance-identifier my-DB-instance \ --disable-domain

对于 Windows:

aws rds modify-db-instance ^ --db-instance-identifier my-DB-instance ^ --disable-domain

步骤 7:创建 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 登录名。

注意

使用 Windows 2000 之前的登录名称指定用户和组,格式为 my_AD_domain\my_AD_domain_user。您不能使用 my_AD_domain_user@my_AD_domain 格式的用户主体名 (UPN)。

USE [master] GO CREATE LOGIN [my_AD_domain\my_AD_domain_user] FROM WINDOWS WITH DEFAULT_DATABASE = [master], DEFAULT_LANGUAGE = [us_english]; GO

有关更多信息,请参阅 Microsoft 开发人员网络文档中的 CREATE LOGIN (Transact-SQL)

域中用户(人和应用程序)现在均可从加入自托管式 AD 域的客户端计算机使用 Windows 身份验证连接到 RDS for SQL Server 实例。

在自托管式 Active Directory 域中管理数据库实例

您可以使用控制台、Amazon CLI 或 Amazon RDS API 来管理数据库实例及其与自托管式 AD 域的关系。例如,您可以将数据库实例移入域、移出域或在域之间移动。

例如,使用 Amazon RDS API,您可以执行下列操作:

  • 要重新尝试以失败的成员身份加入自托管式域,请使用 ModifyDBInstance API 操作并指定相同的参数集:

    • --domain-fqdn

    • --domain-dns-ips

    • --domain-ou

    • --domain-auth-secret-arn

  • 要从自托管式域中删除数据库实例,请使用 ModifyDBInstance API 操作并指定 --disable-domain 作为域参数。

  • 要将数据库实例从一个自托管式域移至另一个自托管式域,请使用 ModifyDBInstance API 操作并指定新域的域参数。

    • --domain-fqdn

    • --domain-dns-ips

    • --domain-ou

    • --domain-auth-secret-arn

  • 要列出每个数据库实例的自托管式 AD 域成员资格,请使用 DescribeDBInstances API 操作。

了解自托管式 Active Directory 域成员资格

在创建或修改数据库实例后,实例将成为自托管式 AD 域的成员。Amazon 控制台将指示数据库实例的自托管式 Active Directory 域成员资格的状态。数据库实例的状态可以是以下状态之一:

  • 已加入 – 实例是 AD 域的成员。

  • 正在加入 – 实例正处于成为 AD 域成员的过程中。

  • 待联接 – 实例成员资格待定。

  • pending-maintenance-join – Amazon 将在下一计划维护时段期间尝试使实例成为 AD 域成员。

  • 待删除 – 等待从 AD 域中删除实例。

  • pending-maintenance-removal – Amazon将在下一计划维护时段期间尝试从 AD 域中删除实例。

  • 失败 – 配置问题阻碍实例加入 AD 域。在重新发出实例修改命令之前检查并修复配置。

  • 正在删除 – 正从自托管式 AD 域中删除实例。

成为自托管式 AD 域成员的请求可能因网络连接问题而失败。例如,您可能会创建数据库实例或修改现有实例,并且尝试使数据库实例成为某个自托管式 AD 域的成员会失败。在这种情况下,您重新发出命令来创建或修改数据库实例,或者修改新创建的实例来加入自托管式 AD 域。

自托管式 Active Directory 问题排查

以下是您在设置或修改自托管式 AD 时可能遇到的问题。

错误代码 描述 常见原因 故障排除建议

错误 2/0x2

系统找不到指定的文件。

使用 —domain-ou 参数指定的组织单位(OU)的格式或位置无效。通过 Amazon Secrets Manager 指定的域服务账户缺少加入 OU 所需的权限。

查看 —domain-ou 参数。确保域服务账户拥有相应的 OU 权限。有关更多信息,请参阅配置您的 AD 域服务账户

错误 5/0x5

访问被拒绝。

域服务账户的权限配置不正确,或者域中已经存在该计算机账户。

查看域中的域服务账户权限,并验证 RDS 计算机账户在域中是否重复。您可以通过在 RDS for SQL Server 数据库实例上运行 SELECT @@SERVERNAME 来验证 RDS 计算机账户的名称。如果您使用的是多可用区,请尝试通过失效转移重启,然后再次验证 RDS 计算机账户。有关更多信息,请参阅重启中的数据库实例

错误 87/0x57

参数不正确。

通过 Amazon Secrets Manager 指定的域服务账户不具备相应的权限。用户配置文件也可能已损坏。

查看域服务账户的要求。有关更多信息,请参阅配置您的 AD 域服务账户

错误 234/0xEA

指定的组织单位(OU)不存在。

使用 —domain-ou 参数指定的 OU 在您的自托管式 AD 中不存在。

查看 —domain-ou 参数并确保指定的 OU 在您的自托管式 AD 中存在。

错误 1326/0x52E

用户名或密码不正确。

Amazon Secrets Manager 中提供的域服务账户凭证包含未知的用户名或错误的密码。您的自托管式 AD 中也可能已禁用域账户。

确保 Amazon Secrets Manager 中提供的凭证正确无误,并且在您的自托管式 Active Directory 中启用了域账户。

错误 1355/0x54B

指定的域不存在或无法访问。

域已关闭、指定的 DNS IP 集无法访问,或指定的 FQDN 无法访问。

查看 —domain-dns-ips—domain-fqdn 参数,确保正确。查看您的 RDS for SQL Server 数据库实例的网络配置,并确保您的自托管式 AD 可以访问。有关更多信息,请参阅配置您的网络连接

错误 1722/0x6BA

RPC 服务器不可用。

连接您的 AD 域的 RPC 服务时出现问题。这可能由于服务或网络问题导致。

验证 RPC 服务是否正在您的域控制器上运行,以及是否可以在您的域上从 RDS for SQL Server 数据库实例访问 TCP 端口 13549152-65535

错误 2224/0x8b0

用户账户已存在。

正在尝试添加到您自托管式 AD 的计算机账户已经存在。

通过在您的 RDS for SQL Server 数据库实例上运行 SELECT @@SERVERNAME 来识别计算机账户,然后小心地将其从您的自托管式 AD 中删除。

错误 2242/0x8c2

此用户的密码已过期。

通过 Amazon Secrets Manager 指定的域服务账户的密码已过期。

更新用于将 RDS for SQL Server 数据库实例加入自托管式 AD 的域服务账户的密码。

还原 SQL Server 数据库实例,然后将其添加到自托管式 Active Directory 域

您可以还原数据库快照或对 SQL Server 数据库实例执行时间点恢复(PITR),然后将其添加到自托管式 Active Directory 域。还原数据库实例后,使用步骤 6:创建或修改 SQL Server 数据库实例中介绍的过程修改此实例,以将数据库实例添加到自托管式 AD 域。