

# 将 Active Directory 用于 RDS for SQL Server
<a name="User.SQLServer.ActiveDirectoryWindowsAuth"></a>

您可以将 RDS for SQL Server 数据库实例加入 Microsoft Active Directory（AD）域。您的 AD 域可以托管在 AWS 内的 AWS Managed AD 上，也可以托管在您所选位置（包括您的企业数据中心、AWS EC2 或其他云提供商）的自托管式 AD 上。

您可以使用自托管式 Active Directory 和 AWS Managed Microsoft AD，通过 NTLM 身份验证和 Kerberos 身份验证对域用户进行身份验证。

在以下各节中，您可以找到有关将自托管式 Active Directory 和 AWS Managed Active Directory 用于 Amazon RDS 上的 Microsoft SQL Server 的信息。

**Topics**
+ [将自托管式 Active Directory 用于 Amazon RDS for SQL Server 数据库实例](USER_SQLServer_SelfManagedActiveDirectory.md)
+ [将 AWS Managed Active Directory 用于 RDS for SQL Server](USER_SQLServerWinAuth.md)

# 将自托管式 Active Directory 用于 Amazon RDS for SQL Server 数据库实例
<a name="USER_SQLServer_SelfManagedActiveDirectory"></a>

无论您的 AD 托管在数据中心、Amazon EC2 上还是其他云提供商处，Amazon RDS for SQL Server 都可与您的自托管式 Active Directory（AD）域无缝集成。这种集成支持通过 NTLM 或 Kerberos 协议直接进行用户身份验证，无需复杂的中间域或林信任。当您连接到 RDS SQL Server 数据库实例时，身份验证请求会安全地转发到您指定的 AD 域，从而在利用 Amazon RDS 托管数据库功能的同时保持现有的身份管理结构。

**Topics**
+ [区域和版本可用性](#USER_SQLServer_SelfManagedActiveDirectory.RegionVersionAvailability)
+ [要求](USER_SQLServer_SelfManagedActiveDirectory.Requirements.md)
+ [注意事项](#USER_SQLServer_SelfManagedActiveDirectory.Limitations)
+ [设置自托管式 Active Directory](USER_SQLServer_SelfManagedActiveDirectory.SettingUp.md)
+ [将数据库实例加入自托管式 Active Directory](USER_SQLServer_SelfManagedActiveDirectory.Joining.md)
+ [在自托管式 Active Directory 域中管理数据库实例](USER_SQLServer_SelfManagedActiveDirectory.Managing.md)
+ [了解自托管式 Active Directory 域成员资格](#USER_SQLServer_SelfManagedActiveDirectory.Understanding)
+ [自托管式 Active Directory 问题排查](USER_SQLServer_SelfManagedActiveDirectory.TroubleshootingSelfManagedActiveDirectory.md)
+ [还原 SQL Server 数据库实例，然后将其添加到自托管式 Active Directory 域](#USER_SQLServer_SelfManagedActiveDirectory.Restore)

## 区域和版本可用性
<a name="USER_SQLServer_SelfManagedActiveDirectory.RegionVersionAvailability"></a>

Amazon RDS 在所有商业 AWS 区域和 AWS GovCloud (US) Regions中都支持通过自托管式 AD 使用 NTLM 控制 SQL Server 的身份验证。

# 要求
<a name="USER_SQLServer_SelfManagedActiveDirectory.Requirements"></a>

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

**Topics**
+ [配置您的本地 AD](#USER_SQLServer_SelfManagedActiveDirectory.Requirements.OnPremConfig)
+ [配置您的网络连接](#USER_SQLServer_SelfManagedActiveDirectory.Requirements.NetworkConfig)
+ [配置您的 AD 域服务账户](#USER_SQLServer_SelfManagedActiveDirectory.Requirements.DomainAccountConfig)
+ [通过 LDAPS 配置安全通信](#USER_SQLServer_SelfManagedActiveDirectory.Requirements.LDAPS)

## 配置您的本地 AD
<a name="USER_SQLServer_SelfManagedActiveDirectory.Requirements.OnPremConfig"></a>

确保您有一个本地或其他自托管式 Microsoft AD，您可以在其中加入 Amazon RDS for SQL Server 实例。您的本地 AD 应具有以下配置：
+ 如果您定义了 AD 站点，请确保在 AD 站点中定义与 RDS for SQL Server 数据库实例关联的 VPC 中的子网。确认您的 VPC 中的子网与您其他 AD 站点中的子网之间没有任何冲突。
+ 您 AD 域控制器的域功能级别为 Windows Server 2008 R2 或更高版本。
+ 您的 AD 域名不能采用单标签域（SLD）格式。RDS for SQL Server 不支持 SLD 域。
+ AD 的完全限定域名（FQDN）不能超过 47 个字符。

## 配置您的网络连接
<a name="USER_SQLServer_SelfManagedActiveDirectory.Requirements.NetworkConfig"></a>

确保您满足以下网络配置：
+ 在您要在其中创建 RDS for SQL Server 数据库实例的 Amazon VPC 与自托管式 AD 之间配置了连接。您可以使用 AWS Direct Connect、AWS VPN、VPC 对等或 AWS Transit Gateway 设置连接。
+ 对于 VPC 安全组，原定设置 Amazon VPC 的原定设置安全组已添加到控制台中的 RDS for SQL Server 数据库实例。确保要在其中创建 RDS for SQL Server 数据库实例的子网的安全组和 VPC 网络 ACL 在端口上允许有下图所示方向的流量。  
![\[自托管式 AD 网络配置端口规则。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/SQLServer_SelfManagedActiveDirectory_Requirements_NetworkConfig.png)

  下表确定了每个端口的作用。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_SQLServer_SelfManagedActiveDirectory.Requirements.html)
+ 通常，域 DNS 服务器位于 AD 域控制器中。您无需配置 VPC DHCP 选项集即可使用此功能。有关更多信息，请参阅《Amazon VPC 用户指南》**中的 [DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html)。

**重要**  
如果您使用的是 VPC 网络 ACL，则还必须允许动态端口（49152-65535）上有来自 RDS for SQL Server 数据库实例的出站流量。确保这些流量规则也镜像到适用于每个 AD 域控制器、DNS 服务器和 RDS for SQL Server 数据库实例的防火墙上。  
虽然 VPC 安全组要求仅在发起网络流量的方向打开端口，但大多数 Windows 防火墙和 VPC 网络 ACL 要求双向打开端口。

## 配置您的 AD 域服务账户
<a name="USER_SQLServer_SelfManagedActiveDirectory.Requirements.DomainAccountConfig"></a>

确保您的 AD 域服务账户满足以下要求：
+ 确保您在自托管式 AD 域中有一个域服务账户，该账户具有将计算机加入该域的委派权限。域服务账户是您的自托管式 AD 中的一个用户账户，该账户已被委派执行某些任务的权限。
+ 需要在您要加入 RDS for SQL Server 数据库实例的组织单位（OU）中向域服务账户委派以下权限：
  + 验证写入 DNS 主机名的能力
  + 验证写入服务主体名称的能力
  + 创建和删除计算机对象

  这些权限代表将计算机对象加入到自托管式 AD 至少需要具备的一组权限。有关更多信息，请参阅 Microsoft Windows Server 文档中的[尝试将计算机加入域时出现错误](https://learn.microsoft.com/en-US/troubleshoot/windows-server/identity/access-denied-when-joining-computers)。
+ 要使用 Kerberos 身份验证，您需要向 AD 域服务账户提供服务主体名称（SPN）和 DNS 权限：
  + **写入 SPN**：将**写入 SPN** 权限委托给需要加入 RDS for SQL Server 数据库实例的 OU 中的 AD 域服务账户。此权限与经过验证的写入 SPN 不同。
  + **DNS 权限**：在域控制器的服务器级 DNS 管理器中，为 AD 域服务账户提供以下权限：
    + 列出内容
    + 读取所有属性
    + 读取权限

**重要**  
创建数据库实例后，请勿移动 RDS for SQL Server 在组织单位中创建的计算机对象。移动关联对象将导致您的 RDS for SQL Server 数据库实例出现配置错误。如果您需要移动 Amazon RDS 创建的计算机对象，请通过 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) RDS API 操作用计算机对象所需位置修改域参数。

## 通过 LDAPS 配置安全通信
<a name="USER_SQLServer_SelfManagedActiveDirectory.Requirements.LDAPS"></a>

建议通过 LDAPS 进行通信，让 RDS 查询和访问域控制器中的计算机对象以及 SPN。要使用安全 LDAP，请在域控制器上使用符合安全 LDAPS 要求的有效 SSL 证书。如果域控制器上不存在有效的 SSL 证书，则 RDS for SQL Server 数据库实例将默认为使用 LDAP。有关证书有效性的更多信息，请参阅 [LDAPS 证书的要求](https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/enable-ldap-over-ssl-3rd-certification-authority#requirements-for-an-ldaps-certificate)。

## 注意事项
<a name="USER_SQLServer_SelfManagedActiveDirectory.Limitations"></a>

将 RDS for SQL Server 数据库实例添加到自托管式 AD 时，请注意以下几点：
+ 您的数据库实例与 AWS 的 NTP 服务同步，而不是与 AD 域的时间服务器同步。对于 AD 域内链接 SQL Server 实例之间的数据库连接，您只能进行 SQL 身份验证，而不能进行 Windows 身份验证。
+ 来自自托管式 AD 域的组策略对象设置不会传播到 RDS for SQL Server 实例。

# 设置自托管式 Active Directory
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp"></a>

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

**Topics**
+ [步骤 1：在 AD 中创建组织单位](#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateOU)
+ [步骤 2：在您的 AD 中创建 AD 域服务账户](#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateADuser)
+ [步骤 3：将控制权委派给 AD 域服务账户](#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.DelegateControl)
+ [步骤 4：创建 AWS KMS 密钥](#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateKMSkey)
+ [步骤 5：创建 AWS 密钥](#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateSecret)

## 步骤 1：在 AD 中创建组织单位
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateOU"></a>

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

**在 AD 中创建 OU**

1. 以域管理员身份连接到您的 AD 域。

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

1. 右键单击该域并选择**新建**，然后选择**组织单位**。

1. 为 OU 输入名称。

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

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

## 步骤 2：在您的 AD 中创建 AD 域服务账户
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateADuser"></a>

域服务账户凭证将用于 AWS Secrets Manager 中的密钥。

**在 AD 中创建 AD 域服务账户**

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

1. 右键单击**用户**对象并选择**新建**，然后选择**用户**。

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

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

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

## 步骤 3：将控制权委派给 AD 域服务账户
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.DelegateControl"></a>

**将控制权委派给域中的 AD 域服务账户**

1. 打开 **Active Directory 用户和计算机** MMC 管理单元，然后选择要在其中创建用户的域。

1. 右键单击您之前创建的 OU，然后选择**委派控制权**。

1. 在**委派控制权向导**页面上，单击**下一步**。

1. 在**用户或组**部分，单击**添加**。

1. 在**选择用户、计算机或组**部分，输入您创建的 AD 域服务账户，然后单击**检查名称**。如果您的 AD 域服务账户检查成功，请单击**确定**。

1. 在**用户或组**部分，确认您的 AD 域服务账户已添加，然后单击**下一步**。

1. 在**要委派的任务**部分，选择**创建要委派的自定义任务**，然后选择**下一步**。

1. 在 **Active Directory 对象类型**部分：

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

   1. 选择**计算机对象**。

   1. 选择**在此文件夹中创建选定对象**。

   1. 选择**删除此文件夹中的选定对象**，然后单击**下一步**。

1. 在**权限**部分：

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

   1. 选择**已验证写入 DNS 主机名**。

   1. 选择**已验证写入服务主体名称**，然后单击**下一步**。

   1. 要启用 Kerberos 身份验证，请选中**特定于属性**，然后从列表中选择**写入 servicePrincipalName**。

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

1. 要进行 Kerberos 身份验证，请打开 DNS 管理器并打开**服务器**属性。

   1. 在 Windows 对话框中，输入 `dnsmgmt.msc`。

   1. 在**安全**选项卡下添加 AD 域服务账户。

   1. 选择**读取**权限并应用您的更改。

## 步骤 4：创建 AWS KMS 密钥
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateKMSkey"></a>

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

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

1. 在 AWS KMS 控制台中，选择**创建密钥**。

1. 对于**密钥类型**，选择**对称**。

1. 对于**密钥用法**，选择**加密和解密**。

1. 对于 **Advanced options (高级选项)**：

   1. 对于**密钥材料源**，选择 **KMS**。

   1. 对于**区域性**，选择**单区域密钥**，然后单击**下一步**。

1. 对于**别名**，提供 KMS 密钥的名称。

1. (可选）对于**描述**，提供 KMS 密钥的描述。

1. （可选）对于**标签**，提供 KMS 密钥的标签，然后单击**下一步**。

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

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

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

1. 审核配置。

1. 对于**密钥策略**，请在策略**声明**中包括以下内容：

   ```
   {
       "Sid": "Allow use of the KMS key on behalf of RDS",
       "Effect": "Allow",
       "Principal": {
           "Service": [
               "rds.amazonaws.com"
           ]
       },
       "Action": "kms:Decrypt",
       "Resource": "*"
   }
   ```

1. 单击 **Finish (完成)**。

## 步骤 5：创建 AWS 密钥
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateSecret"></a>

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

1. 在 AWS Secrets Manager 下，选择**存储新密钥**。

1. 对于**密钥类型**，请选择**其他密钥类型**。

1. 对于**键/值对**，请添加您的两个密钥：

   1. 对于第一个密钥，请输入 `SELF_MANAGED_ACTIVE_DIRECTORY_USERNAME`。

   1. 对于第一个密钥的值，请仅输入 AD 用户的用户名（不带域前缀）。请勿包含域名，因为这会导致实例创建失败。

   1. 对于第二个密钥，请输入 `SELF_MANAGED_ACTIVE_DIRECTORY_PASSWORD`。

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

1. 对于**加密密钥**，输入您在上一步中创建的 KMS 密钥，然后单击**下一步**。

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

1. （可选）对于**描述**，输入密钥名称的描述。

1. 对于**资源权限**，请单击**编辑**。

1. 将以下策略添加到权限策略中：
**注意**  
我们建议您在策略中使用 `aws:sourceAccount` 和 `aws:sourceArn` 条件，以避免出现*混淆代理人*问题。将您的 AWS 账户用于 `aws:sourceAccount`，并将 RDS for SQL Server 数据库实例 ARN 用于 `aws:sourceArn`。有关更多信息，请参阅 [防范跨服务混淆代理问题](cross-service-confused-deputy-prevention.md)。

------
#### [ JSON ]

****  

   ```
   {
       "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:*"
                   }
               }
           }
       ]
   }
   ```

------

1. 单击**保存**，然后单击**下一步**。

1. 对于**配置轮换设置**，保留原定设置值并选择**下一步**。

1. 查看密钥的设置，然后单击**存储**。

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

# 将数据库实例加入自托管式 Active Directory
<a name="USER_SQLServer_SelfManagedActiveDirectory.Joining"></a>

要将 RDS for SQL Server 数据库实例加入自托管式 AD，请执行以下步骤：

## 步骤 1：创建或修改 SQL Server 数据库实例
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateModify"></a>

您可以使用控制台、CLI 或 RDS API 将 RDS for SQL Server 数据库实例与自托管式 AD 域关联。您可以通过下列方式之一来执行该操作：
+ 使用控制台、[create-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) CLI 命令或 [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) RDS API 操作创建新的 SQL Server 数据库实例。

  有关说明，请参阅[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。
+ 使用控制台、[modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) CLI 命令或 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) RDS API 操作修改现有 SQL Server 数据库实例。

  有关说明，请参阅[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。
+ 使用控制台、[restore-db-instance-from-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html) CLI 命令或 [RestoreDBInstanceFromDBSnapshot](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromDBSnapshot.html) RDS API 操作，从数据库快照还原 SQL Server 数据库实例。

  有关说明，请参阅[还原到数据库实例](USER_RestoreFromSnapshot.md)。
+ 使用控制台、[restore-db-instance-to-point-in-time](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html) CLI 命令或 [RestoreDBInstanceToPointInTime](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html) RDS API 操作，将 SQL Server 数据库实例还原到某个时间点。

  有关说明，请参阅[将 Amazon RDS 的数据库实例还原到指定时间](USER_PIT.md)。

使用 AWS CLI 时，数据库实例需要以下参数才能使用您创建的自托管式 AD 域：
+ 对于 `--domain-fqdn` 参数，请使用自托管式 AD 的完全限定域名（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 域中删除，则需要重启数据库实例才能使修改生效。您可以选择立即应用更改，也可以等到下一个维护时段。选择**立即应用**选项将导致单可用区数据库实例停机。多可用区数据库实例将在完成重启之前执行失效转移。有关更多信息，请参阅 [使用计划修改设置](USER_ModifyInstance.ApplyImmediately.md)。

以下 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 数据库实例修改为使用自托管式 AD 域。

对于 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 命令从自托管式 AD 域中删除 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
```

## 步骤 2：使用 Kerberos 或 NTLM 身份验证
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.KerbNTLM"></a>

### NTLM 身份验证
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.KerbNTLM.NTLM"></a>

每个 Amazon RDS 数据库实例都有一个端点，每个端点都包含数据库实例的 DNS 名称和端口号。要使用 SQL 客户端应用程序连接到数据库实例，您需要该数据库实例的 DNS 名称和端口号。要使用 NTLM 身份验证进行身份验证，必须连接到 RDS 端点，或者如果您使用多可用区部署，则必须连接到侦听器端点。

在计划内数据库维护或计划外服务中断期间，Amazon RDS 将自动失效转移到最新辅助数据库，以便操作能够在不进行手动干预的情况下快速恢复。主实例和辅助实例使用相同的端点，其物理网络地址作为失效转移过程的一部分转换到辅助实例。在失效转移时，您不必重新配置应用程序。

### Kerberos 身份验证
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.Kerb"></a>

RDS for SQL Server 的基于 Kerberos 的身份验证要求连接到特定的服务主体名称（SPN）。但是，在失效转移事件发生后，应用程序可能不知道新 SPN。为了解决这个问题，RDS 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
<a name="USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CNAME"></a>

要查找您的 CNAME，请连接到域控制器并打开 **DNS 管理器**。导航到**正向查找区域**和您的 FQDN。

浏览 **awsrds**、**aws-region**，以及**账户和区域特定的哈希值**。

![\[修改数据库实例的存储量\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/kerb-endpoint-selfManagedAD-RDSMS.png)


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

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

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

如果您的实例在连接到 Kerberos 端点时返回 NTLM 连接，请验证您的网络配置和用户配置。请参阅[配置您的网络连接](USER_SQLServer_SelfManagedActiveDirectory.Requirements.md#USER_SQLServer_SelfManagedActiveDirectory.Requirements.NetworkConfig)。

## 步骤 3：创建 Windows 身份验证 SQL Server 登录名
<a name="USER_SQLServer_SelfManagedActiveDirectory.CreateLogins"></a>

使用 Amazon RDS 主用户凭证连接 SQL Server 数据库实例，就像连接任何其他数据库实例一样。由于数据库实例已加入自托管式 AD 域，因此您可以预调配 SQL Server 登录名和用户。您可以通过自托管式 AD 域中的 AD 用户和组实用程序执行此操作。通过对这些 Windows 登录名授予和撤销标准 SQL Server 权限来管理数据库权限。

为了使自托管式 AD 域服务账户能够在 SQL Server 上进行身份验证，自托管式 AD 域服务账户或该用户所属的自托管式 AD 组必须存在 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)](https://msdn.microsoft.com/en-us/library/ms189751.aspx)。

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

# 在自托管式 Active Directory 域中管理数据库实例
<a name="USER_SQLServer_SelfManagedActiveDirectory.Managing"></a>

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

 例如，使用 Amazon RDS API，您可以执行下列操作：
+ 要重新尝试以失败的成员身份加入自托管式域，请使用 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) 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](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/DescribeDBInstances.html) API 操作。

## 了解自托管式 Active Directory 域成员资格
<a name="USER_SQLServer_SelfManagedActiveDirectory.Understanding"></a>

在创建或修改数据库实例并指定 AD 详细信息后，实例将成为自托管式 AD 域的成员。AWS 控制台将指示数据库实例的自托管式 Active Directory 域成员资格的状态。数据库实例的状态可以是以下状态之一：
+  **已加入** – 实例是 AD 域的成员。
+  **正在加入** – 实例正处于成为 AD 域成员的过程中。
+  **待联接** – 实例成员资格待定。
+  **pending-maintenance-join** – AWS 将在下一计划维护时段期间尝试使实例成为 AD 域成员。
+  **待删除** – 等待从 AD 域中删除实例。
+  **pending-maintenance-removal** – AWS将在下一计划维护时段期间尝试从 AD 域中删除实例。
+  **失败** – 配置问题阻碍实例加入 AD 域。在重新发出实例修改命令之前检查并修复配置。
+  **正在删除** – 正从自托管式 AD 域中删除实例。

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

# 自托管式 Active Directory 问题排查
<a name="USER_SQLServer_SelfManagedActiveDirectory.TroubleshootingSelfManagedActiveDirectory"></a>

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


****  

| 错误代码 | 描述 | 常见原因 | 故障排除建议 | 
| --- | --- | --- | --- | 
| 错误 2/0x2 | 系统找不到指定的文件。 | 使用 `—domain-ou` 参数指定的组织单位（OU）的格式或位置无效。通过 AWS Secrets Manager 指定的域服务账户缺少加入 OU 所需的权限。 | 查看 `—domain-ou` 参数。确保域服务账户拥有相应的 OU 权限。有关更多信息，请参阅 [配置您的 AD 域服务账户](USER_SQLServer_SelfManagedActiveDirectory.Requirements.md#USER_SQLServer_SelfManagedActiveDirectory.Requirements.DomainAccountConfig)。 | 
| 错误 5/0x5 | 访问被拒绝。 | 域服务账户的权限配置不正确，或者域中已经存在该计算机账户。 | 查看域中的域服务账户权限，并验证 RDS 计算机账户在域中是否重复。您可以通过在 RDS for SQL Server 数据库实例上运行 `SELECT @@SERVERNAME` 来验证 RDS 计算机账户的名称。如果您使用的是多可用区，请尝试通过失效转移重启，然后再次验证 RDS 计算机账户。有关更多信息，请参阅 [重启数据库实例](USER_RebootInstance.md)。 | 
| 错误 87/0x57 | 参数不正确。 | 通过 AWS Secrets Manager 指定的域服务账户不具备相应的权限。用户配置文件也可能已损坏。 | 查看域服务账户的要求。有关更多信息，请参阅 [配置您的 AD 域服务账户](USER_SQLServer_SelfManagedActiveDirectory.Requirements.md#USER_SQLServer_SelfManagedActiveDirectory.Requirements.DomainAccountConfig)。 | 
| 错误 234/0xEA | 指定的组织单位（OU）不存在。 | 使用 `—domain-ou` 参数指定的 OU 在您的自托管式 AD 中不存在。 | 查看 `—domain-ou` 参数并确保指定的 OU 在您的自托管式 AD 中存在。 | 
| 错误 1326/0x52E | 用户名或密码不正确。 | AWS Secrets Manager 中提供的域服务账户凭证包含未知的用户名或错误的密码。您的自托管式 AD 中也可能已禁用域账户。 | 确保 AWS Secrets Manager 中提供的凭证正确无误，并且在您的自托管式 AD 中启用了域账户。 | 
| 错误 1355/0x54B | 指定的域不存在或无法访问。 | 域已关闭、指定的 DNS IP 集无法访问，或指定的 FQDN 无法访问。 | 查看 `—domain-dns-ips` 和 `—domain-fqdn` 参数，确保正确。查看您的 RDS for SQL Server 数据库实例的网络配置，并确保您的自托管式 AD 可以访问。有关更多信息，请参阅 [配置您的网络连接](USER_SQLServer_SelfManagedActiveDirectory.Requirements.md#USER_SQLServer_SelfManagedActiveDirectory.Requirements.NetworkConfig)。 | 
| 错误 1722/0x6BA | RPC 服务器不可用。 | 连接您的 AD 域的 RPC 服务时出现问题。这可能由于服务或网络问题导致。 | 验证 RPC 服务是否正在您的域控制器上运行，以及是否可以在您的域上从 RDS for SQL Server 数据库实例访问 TCP 端口 `135` 和 `49152-65535`。 | 
|  错误 1727 / 0x6BF  |  远程过程调用失败且未执行。  |  网络连接问题或防火墙限制阻碍了与域控制器的 RPC 通信。  |  如果使用跨 VPC 域加入，请使用 VPC 对等连接或 Transit Gateway 验证跨 VPC 通信的设置是否正确。确保您的 RDS for SQL Server 数据库实例能访问域中的 TCP 高端口 `49152-65535`，包括任何可能的防火墙限制。  | 
| 错误 2224/0x8b0 | 用户账户已存在。 | 正在尝试添加到您自托管式 AD 的计算机账户已经存在。 | 通过在您的 RDS for SQL Server 数据库实例上运行 `SELECT @@SERVERNAME` 来识别计算机账户，然后小心地将其从您的自托管式 AD 中删除。 | 
| 错误 2242/0x8c2 | 此用户的密码已过期。 | 通过 AWS Secrets Manager 指定的域服务账户的密码已过期。 | 更新用于将 RDS for SQL Server 数据库实例加入自托管式 AD 的域服务账户的密码。 | 

将数据库实例加入自托管式 Active Directory 域后，您可能会收到与您的域运行状况相关的 RDS 事件。

```
Unhealthy domain state detected while attempt to verify or 
configure your Kerberos endpoint in your domain on 
node node_n. message
```

对于多可用区实例，您可能会注意到 node1 和 node2 的错误报告，这表明您的实例的 Kerberos 配置尚未准备好进行失效转移。在失效转移时，使用 Kerberos 可能会遇到身份验证问题。解决配置问题，确保 Kerberos 设置有效且最新。对于多可用区实例，只要所有网络和权限配置都已到位，则无需执行任何操作即可在新的主要主机上使用 Kerberos 身份验证。

对于单可用区实例，node1 是主节点。如果您的 Kerberos 身份验证未按预期运行，请检查实例事件并解决配置问题，确保 Kerberos 设置有效且最新。

## 还原 SQL Server 数据库实例，然后将其添加到自托管式 Active Directory 域
<a name="USER_SQLServer_SelfManagedActiveDirectory.Restore"></a>

您可以还原数据库快照或对 SQL Server 数据库实例执行时间点恢复（PITR），然后将其添加到自托管式 Active Directory 域。还原数据库实例后，使用[步骤 1：创建或修改 SQL Server 数据库实例](USER_SQLServer_SelfManagedActiveDirectory.Joining.md#USER_SQLServer_SelfManagedActiveDirectory.SettingUp.CreateModify)中介绍的过程修改此实例，以将数据库实例添加到自托管式 AD 域。

# 将 AWS Managed Active Directory 用于 RDS for SQL Server
<a name="USER_SQLServerWinAuth"></a>

当用户连接您的 RDS for SQL Server 数据库实例时，您可以使用 AWS Managed Microsoft AD 通过 Windows 身份验证对用户进行身份验证。数据库实例使用 AWS Directory Service for Microsoft Active Directory（也称为 AWS Managed Microsoft AD）来启用 Windows 身份验证。当用户对联接到信任域的 SQL Server 数据库实例进行身份验证时，身份验证请求将转发至您使用 Directory Service 创建的域目录。

## 区域和版本可用性
<a name="USER_SQLServerWinAuth.RegionVersionAvailability"></a>

Amazon RDS 支持仅使用 AWS Managed Microsoft AD 进行 Windows 身份验证。RDS 不支持使用 AD Connector。有关更多信息，请参阅下列内容：
+ [ 的应用程序兼容性策略AWS Managed Microsoft AD](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_app_compatibility.html)
+ [AD Connector 的应用程序兼容性策略](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ad_connector_app_compatibility.html)

有关版本和区域可用性的信息，请参阅 [RDS for SQL Server 的 Kerberos 身份验证](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RDS_Fea_Regions_DB-eng.Feature.KerberosAuthentication.html#Concepts.RDS_Fea_Regions_DB-eng.Feature.KerberosAuthentication.sq)。

## 设置 Windows 身份验证概述
<a name="USER_SQLServerWinAuth.overview"></a>

Amazon RDS 使用混合模式进行 Windows 身份验证。此方式意味着，*主用户*（用于创建 SQL Server 数据库实例的名称和密码）使用 SQL 身份验证。由于主用户账户是特权凭证，您应限制对此账户的访问。

要使用本地或自托管式 Microsoft Active Directory 获取 Windows 身份验证，请创建林信任。信任可以是单向或双向的。有关使用 Directory Service 设置林信任的更多信息，请参阅 *AWS Directory Service 管理指南* 中的[何时创建信任关系](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_setup_trust.html)。

要为 SQL Server 数据库实例设置 Windows 身份验证，请执行下列步骤（[为 SQL Server 数据库实例设置 Windows 身份验证](USER_SQLServerWinAuth.SettingUp.md) 中更为详细地介绍）：

1. 从 AWS Managed Microsoft AD或 AWS 管理控制台 API 使用 Directory Service 创建 AWS Managed Microsoft AD 目录。

1. 如果使用 AWS CLI 或 Amazon RDS API 创建 SQL Server 数据库实例，请创建 AWS Identity and Access Management（IAM）角色。此角色使用托管 IAM 策略 `AmazonRDSDirectoryServiceAccess` 并允许 Amazon RDS 调用您的目录。如果您使用控制台创建 SQL Server 数据库实例，则 AWS 将为您创建 IAM 角色。

   为了让角色允许访问，AWS Security Token Service (AWS STS) 终端节点必须在您的 AWS 账户的 AWS 区域中激活。AWS STS 终端节点默认在所有 AWS 区域中保持活跃，且您无需任何进一步动作即可使用它们。有关更多信息，请参阅《IAM 用户指南》**中的[在 AWS 区域中管理 AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)。

1. 使用 Microsoft Active Directory 工具在 AWS Managed Microsoft AD 目录中创建和配置用户与组。有关在 Microsoft Active Directory 中创建用户的更多信息，请参阅 *AWS Directory Service管理指南*中的[管理 AWS Managed Microsoft AD 中的用户和组](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_manage_users_groups.html)。

1. 如果您计划在不同 VPC 中查找目录和数据库实例，请启用跨 VPC 流量。

1. 使用 Amazon RDS 从控制台、AWS CLI 或 Amazon RDS API 新建 SQL Server 数据库实例。在创建请求中，提供在创建目录时生成的域标识符（“`d-*`”标识符）和您创建的角色的名称。通过为数据库实例设置域和 IAM 角色参数，您还可将现有 SQL Server 数据库实例修改为使用 Windows 身份验证。

1. 使用 Amazon RDS 主用户凭证连接到 SQL Server 数据库实例，就像连接到任何其他数据库实例一样。由于数据库实例已联接到 AWS Managed Microsoft AD 域，您可从域中的 Active Directory 用户和组中预配置 SQL Server 登录名和用户。（这称为 SQL Server“Windows”登录。） 通过对这些 Windows 登录名授予和撤销标准 SQL Server 权限来管理数据库权限。

当您使用 Amazon RDS 控制台创建与域连接的 RDS for SQL Server 数据库实例时，AWS 会自动创建 `rds-directoryservice-access-role` IAM 角色。此角色对于管理与域连接的实例至关重要，并且是以下操作所必需的：
+ 对与域连接的 SQL Server 实例进行配置更改
+ 管理 Active Directory 集成设置
+ 对加入域的实例执行维护操作

**重要**  
如果您删除 `rds-directoryservice-access-role` IAM 角色，则无法通过 Amazon RDS 控制台或 API 更改与域连接的 SQL Server 实例。尝试修改实例会导致一条错误消息，内容如下：You don't have permission to iam:CreateRole. To request access, copy the following text and send it to your AWS administrator.  
出现此错误是因为 Amazon RDS 需要重新创建该角色来管理域连接，但缺少必要的权限。此外，此错误不记录在 CloudTrail 中，而这会使故障排除变得更加困难。

如果您不小心删除了 `rds-directoryservice-access-role`，则必须拥有重新创建它的 `iam:CreateRole` 权限，然后才能对与域连接的 SQL Server 实例进行任何更改。要手动重新创建角色，请确保该角色已附加了 `AmazonRDSDirectoryServiceAccess` 托管式策略以及支持 RDS 服务代入该角色的相应信任关系。

# 为 Kerberos 身份验证创建终端节点
<a name="USER_SQLServerWinAuth.KerberosEndpoint"></a>

基于 Kerberos 的身份验证需要终端节点是客户指定的主机名、句点，然后是完全限定的域名 (FQDN)。例如，以下是您可以用于基于 Kerberos 身份验证的终端节点的示例。在此示例中，SQL Server 数据库实例主机名为 `ad-test`，域名为 `corp-ad.company.com`。

```
ad-test.corp-ad.company.com
```

如果您要确保连接使用的是 Kerberos，请运行以下查询：

```
1. SELECT net_transport, auth_scheme 
2.   FROM sys.dm_exec_connections 
3.  WHERE session_id = @@SPID;
```

# 为 SQL Server 数据库实例设置 Windows 身份验证
<a name="USER_SQLServerWinAuth.SettingUp"></a>

使用 AWS Directory Service for Microsoft Active Directory（也称为 AWS Managed Microsoft AD）为 SQL Server 数据库实例设置 Windows 身份验证。要设置 Windows 身份验证，请执行下列步骤。

## 步骤 1：使用 AWS Directory Service for Microsoft Active Directory 创建目录
<a name="USER_SQLServerWinAuth.SettingUp.CreateDirectory"></a>

Directory Service 将在 AWS 云中创建完全托管的 Microsoft Active Directory。创建 AWS Managed Microsoft AD 目录时，Directory Service 将代表您创建两个域控制器和域名服务 (DNS) 服务器。目录服务器在 VPC 内的两个不同可用区中的两个子网中创建。这种冗余有助于确保即使发生故障，目录仍可访问。

 创建 AWS Managed Microsoft AD 目录时，Directory Service 代表您执行以下任务：
+ 在 VPC 中设置 Microsoft Active Directory。
+ 使用用户名 Admin 和指定密码创建目录管理员账户。您可以使用此账户管理您的目录。
+ 为目录控制器创建安全组。

在启动 AWS Directory Service for Microsoft Active Directory 时，AWS 创建一个组织单位 (OU)，其中包含目录的所有对象。此 OU (具有您在创建目录时键入的 NetBIOS 名称) 位于域根目录中。此域根目录由 AWS 拥有和管理。

 使用您的 AWS Managed Microsoft AD 目录创建的 *admin* 账户对您的 OU 的最常见管理活动具有以下权限：
+ 创建、更新或删除用户、组和计算机。
+ 将资源添加到域 (如文件或打印服务器)，然后为 OU 中的用户和组分配这些资源的权限。
+ 创建额外的 OU 和容器。
+ 委托授权。
+ 创建和链接组策略。
+ 从 Active Directory 回收站还原删除的对象。
+ 在 Active Directory Web 服务上运行 AD 和 DNS Windows PowerShell 模块。

admin 账户还具有执行下列域范围活动的权限：
+ 管理 DNS 配置（添加、删除或更新记录、区域和转发器）。
+ 查看 DNS 事件日志。
+ 查看安全事件日志。

**使用 AWS Managed Microsoft AD 创建目录**

1. 在 [Directory Service 控制台](https://console.aws.amazon.com/directoryservicev2/)导航窗格中，选择**目录**，然后选择**设置目录**。

1. 选择 **AWS Managed Microsoft AD**。这是当前唯一支持用于 Amazon RDS 的选项。

1. 选择 **Next (下一步)**。

1. 在**输入目录信息**页面上，提供以下信息：  
**版本**  
 选择符合您要求的版本。  
**目录 DNS 名称**  
目录的完全限定名称，例如 `corp.example.com`。SQL Server 不支持超过 47 个字符的名称。  
**目录 NetBIOS 名称**  
可选的目录短名称，如 `CORP`。  
**目录描述**  
目录的可选描述。  
**管理员密码**  
目录管理员的密码。目录创建过程将使用用户名 Admin 和此密码创建一个管理员账户。  
目录管理员密码不能包含单词 `admin`。此密码区分大小写，且长度必须介于 8 – 64 个字符之间。至少，它还必须包含下列四种类别中三种类别的一个字符：  
   + 小写字母 (a-z)
   + 大写字母 (A-Z)
   + 数字 (0-9)
   + 非字母数字字符 (\$1\$1@\$1\$1%^&\$1\$1-\$1=`\$1\$1()\$1\$1[]:;"'<>,.?/)   
**确认密码**  
重新键入管理员密码。

1. 选择 **Next (下一步)**。

1. 在**选择 VPC 和子网**页面上，提供以下信息：  
**VPC**  
为目录选择 VPC。  
您可以在不同 VPC 中查找目录和数据库实例，但如果这样做，请确保启用跨 VPC 流量。有关更多信息，请参阅“[步骤 4：在目录和数据库实例之间启用跨 VPC 流量](#USER_SQLServerWinAuth.SettingUp.VPC-Peering)”。  
**子网**  
为目录服务器选择子网。两个子网必须位于不同的可用区。

1. 选择 **Next (下一步)**。

1. 检查目录信息。如果需要进行更改，请选择**上一步**。如果信息正确，请选择 **Create directory (创建目录)**。  
![\[审核和创建页面\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/WinAuth2.png)

目录创建需要几分钟时间。创建成功后，**Status (状态)** 值将更改为 **Active (活动)**。

要查看有关您的目录的信息，请在目录列表中选择目录。记下**目录 ID**。在创建或修改 SQL Server 数据库实例时，您将需要此值。

![\[“目录详细信息”页面\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/WinAuth3.png)


## 步骤 2：创建 Amazon RDS 使用的 IAM 角色
<a name="USER_SQLServerWinAuth.SettingUp.CreateIAMRole"></a>

如果您使用控制台创建您的 SQL Server 数据库实例，则可跳过此步。如果您已使用 CLI 或 RDS API 创建 SQL Server 数据库实例，则必须创建使用 `AmazonRDSDirectoryServiceAccess` 托管 IAM 策略的 IAM 角色。此角色允许 Amazon RDS 为您调用 Directory Service。

如果您使用自定义策略来加入域，而不是使用 AWS 托管的 `AmazonRDSDirectoryServiceAccess` 策略，请确保允许 `ds:GetAuthorizedApplicationDetails` 操作。由于 Directory Service API 发生变化，这一要求自 2019 年 7 月起生效。

以下 IAM 策略 `AmazonRDSDirectoryServiceAccess` 提供对 Directory Service 的访问权限。

**Example 用于提供 Directory Service 访问权限的 IAM 策略**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
            "ds:DescribeDirectories", 
            "ds:AuthorizeApplication", 
            "ds:UnauthorizeApplication",
            "ds:GetAuthorizedApplicationDetails"
        ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

我们建议在基于资源的信任关系中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以此限制服务对特定资源的权限。这是防范[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方法。

您可以使用这两个全局条件上下文键并让 `aws:SourceArn` 值包含账户 ID。在这种情况下，当 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户使用相同策略语句时，确保二者使用相同的账户 ID。
+ 如果您想对单个资源进行跨服务访问，请使用 `aws:SourceArn`。
+ 如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用 `aws:SourceAccount`。

在信任关系中，请务必使用 `aws:SourceArn` 全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。对于 Windows 身份验证，请确保包含数据库实例，如以下示例所示。

**Example 与 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 用户指南* 中的[创建客户托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#create-managed-policy-console)。

## 步骤 3：创建和配置用户和组
<a name="USER_SQLServerWinAuth.SettingUp.CreateUsers"></a>

您可以使用“Active Directory 用户和计算机”工具创建用户和组。该工具是 Active Directory Domain Services 和 Active Directory Lightweight Directory Services 工具之一。用户表示有权访问您的目录的独立个人或实体。对于针对用户组授予或拒绝权限非常有用，从而不必将这些权限应用于每个独立用户。

要在 Directory Service 目录中创建用户和组，您必须连接到属于 Directory Service 目录成员的 Windows EC2 实例。您还必须以具有创建用户和组权限的用户身份登录。有关更多信息，请参阅 *AWS Directory Service管理指南*中的[添加用户和组（Simple AD 和 AWS Managed Microsoft AD）](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/creating_ad_users_and_groups.html)。

## 步骤 4：在目录和数据库实例之间启用跨 VPC 流量
<a name="USER_SQLServerWinAuth.SettingUp.VPC-Peering"></a>

如果您打算将目录和数据库实例放在同一 VPC 中，请跳过该步骤，然后转到[步骤 5：创建或修改 SQL Server 数据库实例](#USER_SQLServerWinAuth.SettingUp.CreateModify)。

如果您计划在不同 VPC 中查找目录和数据库实例，请使用 VPC 对等连接或 [AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html) 配置跨 VPC 流量。

以下过程使用 VPC 对等连接启用 VPC 之间的流量。请按照 *Amazon Virtual Private Cloud 对等连接指南*中的[什么是 VPC 对等连接？](https://docs.aws.amazon.com/vpc/latest/peering/Welcome.html)操作。

**使用 VPC 对等连接启用跨 VPC 流量**

1. 设置适合的 VPC 路由规则，以便确保网络流量可以双向流动。

1. 确保数据库实例的安全组可以从目录的安全组接收入站流量。

1. 确保没有任何网络访问控制列表 (ACL) 规则会阻止流量。

如果该目录由不同的 AWS 账户拥有，则您必须共享该目录。

**在 AWS 账户之间共享目录**

1. 按照 *AWS 管理指南*中的[教程：共享 AWS Managed Microsoft AD 目录以实现无缝 EC2 域加入](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_tutorial_directory_sharing.html)中的说明，开始与将要在其中创建数据库实例的 Directory Service 账户共享目录。

1. 使用数据库实例的账户登录到 Directory Service 控制台，并确保在处理之前域具有 `SHARED` 状态。

1. 使用数据库实例的账户登录 Directory Service 控制台时，请记录**目录 ID** 值。您可以使用此目录 ID 将数据库实例加入域。

## 步骤 5：创建或修改 SQL Server 数据库实例
<a name="USER_SQLServerWinAuth.SettingUp.CreateModify"></a>

创建或修改 SQL Server 数据库实例，以便与您的目录一起使用。您可以使用控制台、CLI 或 RDS API 将数据库实例与目录关联。您可以通过下列方式之一来执行该操作：
+ 使用控制台、[create-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) CLI 命令或 [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) RDS API 操作创建新的 SQL Server 数据库实例。

  有关说明，请参阅[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。
+ 使用控制台、[modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) CLI 命令或 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) RDS API 操作修改现有 SQL Server 数据库实例。

  有关说明，请参阅[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。
+ 使用控制台、[restore-db-instance-from-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html) CLI 命令或 [RestoreDBInstanceFromDBSnapshot](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromDBSnapshot.html) RDS API 操作，从数据库快照还原 SQL Server 数据库实例。

  有关说明，请参阅[还原到数据库实例](USER_RestoreFromSnapshot.md)。
+ 使用控制台、[restore-db-instance-to-point-in-time](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html) CLI 命令或 [RestoreDBInstanceToPointInTime](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html) RDS API 操作，将 SQL Server 数据库实例还原到某个时间点。

  有关说明，请参阅[将 Amazon RDS 的数据库实例还原到指定时间](USER_PIT.md)。

 只有 VPC 中的 SQL Server 数据库实例才支持 Windows 身份验证。

 要使数据库实例能够使用您创建的域目录，需要满足以下条件：
+  对于**目录**，您必须选择创建目录时生成的域标识符 (`d-ID`)。
+  确保 VPC 安全组具有允许数据库实例与目录通信的出站规则。

![\[Microsoft SQL Server Windows 身份验证目录\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/WinAuth1.png)


使用 AWS 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-name role-name
```

对于：Windows

```
aws rds modify-db-instance ^
    --db-instance-identifier mydbinstance ^
    --domain d-ID ^
    --domain-iam-role-name role-name
```

**重要**  
如果您修改数据库实例以启用 Kerberos 身份验证，请在进行更改之后重启数据库实例。

## 步骤 6：创建 Windows 身份验证 SQL Server 登录名
<a name="USER_SQLServerWinAuth.CreateLogins"></a>

使用 Amazon RDS 主用户凭证连接到 SQL Server 数据库实例，就像连接到任何其他数据库实例一样。由于数据库实例已加入 AWS 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`*`@`*`DomainName`* 格式的用户主体名 (UPN)。  
您只能使用 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)](https://msdn.microsoft.com/en-us/library/ms189751.aspx)。

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

# 在域中管理数据库实例
<a name="USER_SQLServerWinAuth.Managing"></a>

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

 例如，使用 Amazon RDS API，您可以执行下列操作：
+  要为失败的成员资格重新尝试域加入，请使用 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) API 操作并指定当前成员资格的目录 ID。
+  要为成员资格更新 IAM 角色名称，请使用 `ModifyDBInstance` API 操作并指定当前成员资格的目录 ID 和新的 IAM 角色。
+  要从域中删除数据库实例，请使用 `ModifyDBInstance` API 操作并指定 `none` 作为域参数。
+  要将数据库实例从一个域移至另一个域，请使用 `ModifyDBInstance` API 操作并指定新域的域标识符作为域参数。
+  要列出每个数据库实例的成员资格，请使用 [DescribeDBInstances](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/DescribeDBInstances.html) API 操作。

## 了解域成员资格
<a name="USER_SQLServerWinAuth.Understanding"></a>

 在创建或修改数据库实例后，实例将成为域的成员。AWS 控制台将指示数据库实例的域成员资格状态。数据库实例的状态可以是以下状态之一：
+  **已联接** – 实例是域的成员。
+  **正在联接** – 实例正处于成为域成员的过程中。
+  **待联接** – 实例成员资格待定。
+  **pending-maintenance-join** – AWS将在下一计划维护期间尝试使实例成为域成员。
+  **待删除** – 等待从域中删除实例。
+  **pending-maintenance-removal** – AWS将在下一计划维护期间尝试从域中删除实例。
+  **失败** – 配置问题阻碍实例联接域。在重新发出实例修改命令之前检查并修复配置。
+  **正在删除** – 正从域中删除实例。

成为域成员的请求可能因网络连接问题或不正确的 IAM 角色而失败。例如，您可能会创建数据库实例或修改现有实例，并且尝试使数据库成为某个域的成员会失败。在这种情况下，您重新发出命令以创建或修改数据库实例，或者修改新创建的实例以加入域。

# 使用 Windows 身份验证连接到 SQL Server
<a name="USER_SQLServerWinAuth.Connecting"></a>

要使用 Windows 身份验证连接到 SQL Server，您必须作为域用户登录联接域的计算机。在启动 SQL Server Management Studio 之后，请选择 **Windows 身份验证**作为身份验证类型，如下所示。

![\[使用 Windows 身份验证连接到 SQL Server\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/WinAuth4.png)


## 还原 SQL Server 数据库实例，然后将其添加到域中
<a name="USER_SQLServerWinAuth.Restore"></a>

您可还原数据库快照或为 SQL Server 数据库实例执行时间点恢复 (PITR)，然后将其添加到域中。数据库实例还原后，使用[步骤 5：创建或修改 SQL Server 数据库实例](USER_SQLServerWinAuth.SettingUp.md#USER_SQLServerWinAuth.SettingUp.CreateModify)中介绍的过程修改此实例以将数据库实例添加到域中。