

# 将 Microsoft Active Directory 用于 RDS Custom for SQL Server
<a name="custom-sqlserver-WinAuth"></a>

RDS Custom for SQL Server 允许将您的实例加入自托管式 Active Directory（AD）或 AWS Managed Microsoft AD。无论您的 AD 托管在哪里，例如本地数据中心、Amazon EC2 或任何其他云服务提供商，都是如此。

要对用户和服务进行身份验证，您可以在 RDS Custom for SQL Server 数据库实例上使用 NTLM 或 Kerberos 身份验证，而无需使用中间域和林信任。当用户尝试使用自加入的 Active Directory 在您的 RDS Custom for SQL Server 数据库实例上进行身份验证时，身份验证请求将转发到您指定的自托管式 AD 或 AWS Managed Microsoft AD。

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

**Topics**
+ [区域和版本可用性](#custom-sqlserver-WinAuth.Regions)
+ [配置自托管式 AD 或本地 AD](custom-sqlserver-WinAuth.config-Self-Managed.md)
+ [使用 Directory Service 配置 Microsoft Active Directory](custom-sqlserver-WinAuth.config-ADS.md)
+ [网络配置端口规则](custom-sqlserver-WinAuth.NWConfigPorts.md)
+ [网络验证](custom-sqlserver-WinAuth.NWValidation.md)
+ [为 RDS Custom for SQL Server 实例设置 Windows 身份验证](custom-sqlserver-WinAuth.settingUp.md)
+ [在域中管理数据库实例](custom-sqlserver-WinAuth.ManagingDBI.md)
+ [了解域成员资格](custom-sqlserver-WinAuth.Understanding.md)
+ [Active Directory 故障排除](custom-sqlserver-WinAuth.Troubleshoot.md)

## 区域和版本可用性
<a name="custom-sqlserver-WinAuth.Regions"></a>

RDS Custom for SQL Server 支持自托管式 AD 和 AWS Managed Microsoft AD，在所有支持 RDS Custom for SQL Server 的区域中使用 NTLM 或 Kerberos。有关更多信息，请参阅 [支持 RDS Custom 的区域和数据库引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSCustom.md)。

# 配置自托管式 AD 或本地 AD
<a name="custom-sqlserver-WinAuth.config-Self-Managed"></a>

要将本地或自托管式 Microsoft AD 加入 RDS Custom for SQL Server 数据库实例，您的活动域必须按以下方式进行配置：
+ 在自托管式或本地 AD 中定义与 RDS Custom for SQL Server 数据库实例关联的 VPC 中的子网。确认您的 VPC 中的子网与 AD 站点中的子网之间没有任何冲突。
+ 您 AD 域控制器的域功能级别为 Windows Server 2008 R2 或更高版本。
+ 您的 AD 域名不能采用单标签域（SLD）格式。RDS Custom for SQL Server 不支持 SLD 域。
+ AD 的完全限定域名（FQDN）不能超过 47 个字符。

## 配置您的网络连接
<a name="custom-sqlserver-WinAuth.config-Self-Managed.network"></a>

按以下方式配置您的自托管式或本地 AD 网络连接：
+ 在 Amazon VPC（其中运行 RDS Custom for SQL Server 实例）和您的 AD 之间设置连接。使用 Direct Connect、Site-to-Site VPN AWS Transit Gateway 和 VPC 对等连接。
+ RDS Custom for SQL Server 安全组和网络 ACL 允许端口上的流量流向您的自托管式或本地 AD。有关更多信息，请参阅 [网络配置端口规则](custom-sqlserver-WinAuth.NWConfigPorts.md)。  
![\[Microsoft SQL Server Windows 身份验证目录\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/custom-sqs-SM-NC.png)

## 配置 DNS 解析
<a name="custom-sqlserver-WinAuth.config-Self-Managed.DNS"></a>

设置以下要求以使用自托管式或本地 AD 配置 DNS 解析：
+ 在 VPC 内配置 DNS 解析，以解析自托管式 Active Directory 的完全限定域名（FQDN）。FQDN 的一个例子是 `corp.example.local`。要配置 DNS 解析，请将 VPC DNS 解析程序配置为使用 Amazon Route 53 出站端点和解析程序规则转发对某些域的查询。有关更多信息，请参阅[配置 Route 53 Resolver 出站端点以解析 DNS 记录](https://repost.aws/knowledge-center/route53-resolve-with-outbound-endpoint)。
+ 对于同时利用 VPC 和本地资源的工作负载，您必须解析本地托管的 DNS 记录。本地资源可能需要解析托管在 AWS 上的名称。

  要创建混合云设置，请使用解析程序端点和条件转发规则解析本地资源与自定义 VPC 之间的 DNS 查询。有关更多信息，请参阅《Amazon Route 53 开发人员指南》**中的[解析 VPC 与网络之间的 DNS 查询](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-overview-DSN-queries-to-vpc.html)。

**重要**  
修改 RDS Custom for SQL Server 上网络接口的 DNS 解析程序设置会导致启用了 DNS 的 VPC 端点不再正常运行。无法访问互联网的私有子网中的实例需要启用了 DNS 的 VPC 端点。

# 使用 Directory Service 配置 Microsoft Active Directory
<a name="custom-sqlserver-WinAuth.config-ADS"></a>

AWS Managed Microsoft AD 在 AWS 中创建完全托管的 Microsoft Active Directory，由 Windows Server 2019 提供支持并在 2012 R2 林和域功能级别运行。Directory Service 在 Amazon VPC 的不同子网中创建域控制器，使您的目录即使在出现故障时也具有很高的可用性。

要使用 AWS Managed Microsoft AD 创建目录，请参阅《AWS Directory Service 管理指南》**中的 [AWS Managed Microsoft AD 入门](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started.html)。

## 配置您的网络连接
<a name="custom-sqlserver-WinAuth.config-ADS.network"></a>

### 在目录和数据库实例之间启用跨 VPC 流量
<a name="custom-sqlserver-WinAuth.config-ADS.network.x-vpc"></a>

要在同一 VPC 中查找目录和数据库实例，请跳过该步骤，然后转到[网络配置端口规则](custom-sqlserver-WinAuth.NWConfigPorts.md)中的下一步。

要在不同的 VPC 中查找目录和数据库实例，请使用 VPC 对等连接或 AWS Transit Gateway 配置跨 VPC 流量。有关使用 VPC 对等连接的更多信息，请参阅《Amazon VPC 对等连接指南》**中的[什么是 VPC 对等连接？](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)和《Amazon VPC Transit Gateways》**中的[什么是 AWS Transit Gateway？](https://docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html)。

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

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

1. 允许数据库实例的安全组从目录的安全组接收入站流量。有关更多信息，请参阅 [网络配置端口规则](custom-sqlserver-WinAuth.NWConfigPorts.md)。

1. 网络访问控制列表（ACL）不得阻止流量。

如果该目录由不同的 AWS 账户拥有，则您必须共享该目录。要与 AWS 账户共享 RDS Custom for SQL Server 实例所在的目录，请按照《AWS Directory Service 管理指南》**中的[教程：共享 AWS Managed Microsoft AD 以便无缝地加入 EC2 域](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_tutorial_directory_sharing.html)操作。

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

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

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

## 配置 DNS 解析
<a name="custom-sqlserver-WinAuth.config-ADS.DNS"></a>

当您使用 AWS Managed Microsoft AD 创建目录时，Directory Service 将代表您创建两个域控制器并添加 DNS 服务。

如果您已有 AWS Managed Microsoft AD 或计划在 VPC 中启动一个（除 RDS Custom for SQL Server 数据库实例之外），请将 VPC DNS 解析程序配置为使用 Route 53 出站和解析程序规则转发对某些域的查询，请参阅[配置 Route 53 Resolver 出站端点以解析 DNS 记录](https://repost.aws/knowledge-center/route53-resolve-with-outbound-endpoint)。

# 网络配置端口规则
<a name="custom-sqlserver-WinAuth.NWConfigPorts"></a>

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

  下表确定了每个端口的作用。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/custom-sqlserver-WinAuth.NWConfigPorts.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 Custom for SQL Server 数据库实例的出站流量。确保这些流量规则也镜像到适用于每个 AD 域控制器、DNS 服务器和 RDS Custom for SQL Server 数据库实例的防火墙上。  
虽然 VPC 安全组要求仅在发起网络流量的方向打开端口，但大多数 Windows 防火墙和 VPC 网络 ACL 要求双向打开端口。

# 网络验证
<a name="custom-sqlserver-WinAuth.NWValidation"></a>

在将 RDS Custom 实例加入自托管式 AD 或AWS Managed Microsoft AD 之前，请从与您计划启动 RDS Custom for SQL Server 实例所在的同一 VPC 中的 EC2 实例中检查以下内容。
+ 检查您能否将完全限定域名（FQDN）解析为域控制器 IP。

  ```
  nslookup corp.example.com
  ```

  该命令必须返回类似的输出：

  ```
  Server:  ip-10-0-0-2.us-west-2.compute.internal
  Address:  25.0.0.2
  
  Non-authoritative answer:
  Name:    corp.example.com
  Addresses:  40.0.9.25 (DC1 IP)
              40.0.50.123 (DC2 IP)
  ```
+ 解析您要启动 RDS Custom 实例所在的同一 VPC 中的 EC2 实例中的 AWS 服务：

  ```
  $region='input-your-aws-region'
  $domainFQDN='input-your-domainFQDN'
   
  function Test-DomainPorts {
      param (
          [string]$Domain,
          [array]$Ports
      )
   
      foreach ($portInfo in $Ports) {
          try {
              $conn = New-Object System.Net.Sockets.TcpClient
              $connectionResult = $conn.BeginConnect($Domain, $portInfo.Port, $null, $null)
              $success = $connectionResult.AsyncWaitHandle.WaitOne(1000) # 1 second timeout
              if ($success) {
                  $conn.EndConnect($connectionResult)
                  $result = $true
              } else {
                  $result = $false
              }
          }
          catch {
              $result = $false
          }
          finally {
              if ($null -ne $conn) {
                  $conn.Close()
              }
          }
          Write-Host "$($portInfo.Description) port open: $result"
      }
  }
   
  # Check if ports can be reached 
  $ports = @(
      @{Port = 53;   Description = "DNS"},
      @{Port = 88;   Description = "Kerberos"},
      @{Port = 389;  Description = "LDAP"},
      @{Port = 445;  Description = "SMB"},
      @{Port = 5985; Description = "WinRM"},
      @{Port = 636;  Description = "LDAPS"},
      @{Port = 3268; Description = "Global Catalog"},
      @{Port = 3269; Description = "Global Catalog over SSL"},
      @{Port = 9389; Description = "AD DS"}
  )
   
  function Test-DomainReachability {
      param (
          [string]$DomainName
      )
      
      try {
          $dnsResults = Resolve-DnsName -Name $DomainName -ErrorAction Stop
          Write-Host "Domain $DomainName is successfully resolving to following IP addresses: $($dnsResults.IpAddress)"
          Write-Host ""
          return $true
      } 
      catch {
          Write-Host ""
          Write-Host "Error Message: $($_.Exception.Message)"
          Write-Host "Domain $DomainName reachability check failed, please Configure DNS resolution"
          return $false
      }
  }
   
  $domain = (Get-WmiObject Win32_ComputerSystem).Domain
  if ($domain -eq 'WORKGROUP') {
      Write-Host ""    
      Write-Host "Host $env:computername is still part of WORKGROUP and not part of any domain"
      }
  else {
      Write-Host ""
      Write-Host "Host $env:computername is joined to $domain domain"
      Write-Host ""
      }
   
   
  $isReachable = Test-DomainReachability -DomainName $domainFQDN  
  if ($isReachable) {
      write-Host "Checking if domain $domainFQDN is reachable on required ports  "
      Test-DomainPorts -Domain $domainFQDN -Ports $ports
  }
  else {
      Write-Host "Port check skipped. Domain not reachable"
  }   
   
   
   
  # Get network adapter configuration
  $networkConfig = Get-WmiObject Win32_NetworkAdapterConfiguration | 
                   Where-Object { $_.IPEnabled -eq $true } |
                   Select-Object -First 1
   
  # Check DNS server settings
  $dnsServers = $networkConfig.DNSServerSearchOrder
   
  if ($dnsServers) {
      Write-Host "`nDNS Server settings:"
      foreach ($server in $dnsServers) {
          Write-Host "  - $server"
      }
  } else {
      Write-Host "`nNo DNS servers configured or unable to retrieve DNS server information."
  }
   
  write-host ""
   
  # Checks reachability to dependent services
  $services = "s3", "ec2", "secretsmanager", "logs", "events", "monitoring", "ssm", "ec2messages", "ssmmessages"
   
  function Get-TcpConnectionAsync {
      param (
          $ServicePrefix,
          $region
      )
      $endpoint = "${ServicePrefix}.${region}.amazonaws.com"
      $tcp = New-Object Net.Sockets.TcpClient
      $result = $false
   
      try {
          $connectTask = $tcp.ConnectAsync($endpoint, 443)
          $timedOut = $connectTask.Wait(3000)
          $result = $tcp.Connected
      } 
      catch {
          $result = $false
      } 
      return $result
  }
   
  foreach ($service in $services) {
      $validationResult = Get-TcpConnectionAsync -ServicePrefix $service -Region $region
      Write-Host "Reachability to $service is $validationResult"
  }
  ```

  对于 `s3`、`ec2`、`secretsmanager`、`logs`、`events`、`monitoring`、`ssm`、`ec2messages` 和 `ssmmessages`，`TcpTestSucceeded` 值必须返回 `True`。

# 为 RDS Custom for SQL Server 实例设置 Windows 身份验证
<a name="custom-sqlserver-WinAuth.settingUp"></a>

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

Active Directory 级别的组策略可能与 AWS 自动化和权限发生冲突。我们建议选择仅适用于您为 RDS Custom for SQL Server 创建的 OU 的 GPO。
+ 要在自托管式或本地 AD 中创建 OU 和 AD 域用户，您可以以域管理员身份连接域控制器。
+ 要在 Directory Service 目录中创建用户和组，必须连接到管理实例，还必须已作为有权创建用户和组的用户登录。有关更多信息，请参阅《AWS Directory Service 管理指南》**中的 [AWS Managed Microsoft AD 中的用户和组管理](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_manage_users_groups.html)。
+ 要从 Amazon EC2 Windows Server 实例中管理 Active Directory，您需要在 EC2 实例上安装 Active Directory Domain Services 和 Active Directory Lightweight Directory Services 工具。有关更多信息，请参阅《AWS Directory Service 管理指南》**中的[为 AWS Managed Microsoft AD 安装 Active Directory 管理工具](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_install_ad_tools.html)。
+ 为了便于管理，建议您将这些工具安装在单独的 EC2 实例上，而不是 RDS Custom for SQL Server 数据库实例上。

AD 域服务账户的要求如下：
+ 您必须在 AD 域中有一个服务账户，该账户具有将计算机加入该域的委派权限。域服务账户是您的 AD 中的一个用户账户，该账户具有执行某些任务的委派权限。
+ 在您要加入 RDS Custom for SQL Server 实例的组织单位中向域服务账户委派以下权限：
  + 验证写入 DNS 主机名的能力
  + 验证写入服务主体名称的能力
  + 创建和删除计算机对象
+ 对于自托管式和本地 AD，域服务账户必须是“AWS 域名系统委托管理员”组的成员。
+ 对于 AWS Managed Microsoft AD，域名服务账户应是“DnsAdmins”组的成员。

这些是将计算机对象加入自托管式 AD 和 AWS Managed Microsoft AD 至少需要具备的一组权限。有关更多信息，请参阅 Microsoft Windows Server 文档中的[错误：当已委派控制的非管理员用户尝试将计算机加入域控制器时，访问被拒绝](https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/access-denied-when-joining-computers)。

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

**Topics**
+ [步骤 1：在 AD 中创建组织单位（OU）](#custom-sqlserver-WinAuth.settingUp.CreateOU)
+ [步骤 2：创建 AD 域用户](#custom-sqlserver-WinAuth.settingUp.ADuser)
+ [步骤 3：将控制权委派给自托管式 AD 或 AWS Managed Microsoft AD 中的 AD 用户](#custom-sqlserver-WinAuth.settingUp.Delegate)
+ [步骤 4：创建密钥](#custom-sqlserver-WinAuth.settingUp.ASM)
+ [步骤 5：创建或修改 RDS Custom for SQL Server 数据库实例](#custom-sqlserver-WinAuth.settingUp.CreateDBInstance)
+ [步骤 6：创建 Windows 身份验证 SQL Server 登录名](#custom-sqlserver-WinAuth.settingUp.CreateLogins)
+ [步骤 7：使用 Kerberos 或 NTLM 身份验证](#custom-sqlserver-WinAuth.settingUp.KerbNTLM)

## 步骤 1：在 AD 中创建组织单位（OU）
<a name="custom-sqlserver-WinAuth.settingUp.CreateOU"></a>

请按照以下步骤在 AD 中创建组织单位：

**在 AD 中创建 OU**

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

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

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

1. 为 OU 输入名称。

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

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

对于 AWS Managed Microsoft AD，此 OU 的名称基于您在创建目录时键入的 NetBIOS 名称。此 OU 属于 AWS 并且包含您有权完全控制的所有 AWS 相关目录对象。默认情况下，此 OU 下存在两个子 OU，名为 **Computers 和 Users**。RDS Custom 创建的新 OU 是基于 NetBIOS 的 OU 的子级。

## 步骤 2：创建 AD 域用户
<a name="custom-sqlserver-WinAuth.settingUp.ADuser"></a>

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

**在您的 AD 中创建 AD 域用户**

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

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

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

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

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

## 步骤 3：将控制权委派给自托管式 AD 或 AWS Managed Microsoft AD 中的 AD 用户
<a name="custom-sqlserver-WinAuth.settingUp.Delegate"></a>

**将控制权委派给域中的 AD 域用户**

1. 打开 **Active Directory 用户和计算机** MMC 管理单元，然后选择您的域。

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

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

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

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

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

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

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

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

   选择**计算机对象**

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

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

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

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

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

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

1. 在**完成控制权委派向导**中，请确认您的设置，然后单击**完成**。

## 步骤 4：创建密钥
<a name="custom-sqlserver-WinAuth.settingUp.ASM"></a>

在包含要加入 Active Directory 的 RDS Custom for SQL Server 数据库实例的同一 AWS 账户和区域中创建密钥。存储在[步骤 2：创建 AD 域用户](#custom-sqlserver-WinAuth.settingUp.ADuser)中创建的 AD 域用户的凭证。

------
#### [ Console ]
+ 在 AWS Secrets Manager 中，选择**存储新密钥**。
+ 对于**密钥类型**，请选择**其他密钥类型**。
+ 对于**键/值对**，请添加两个键：
  + 第一个键，即 `SELF_MANAGED_ACTIVE_DIRECTORY_USERNAME`，并对于值输入您的 AD 用户的名称（不带域前缀）。
  + 对于第二个键，输入 `SELF_MANAGED_ACTIVE_DIRECTORY_PASSWORD`，然后输入域中 AD 用户的密码。
+ 在**加密密钥**中，输入创建 RDS Custom for SQL Server 实例时所用的相同 AWS 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 数据库实例
<a name="custom-sqlserver-WinAuth.settingUp.CreateDBInstance"></a>

创建或修改 RDS Custom for 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)。

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

使用 AWS CLI 时，数据库实例需要以下参数才能使用您创建的目录：
+ 对于 `--domain-fqdn` 参数，请使用自托管式 AD 的完全限定域名。
+ 对于 `--domain-ou` 参数，请使用您在自托管式 AD 中创建的 OU。
+ 对于 `--domain-auth-secret-arn` 参数，请使用您创建的**密钥 ARN** 的值。

**重要**  
如果您修改数据库实例，以加入自托管式 AD 域或 AWS Managed Microsoft AD 或者从中删除，则需要重启数据库实例才能使修改生效。您可以选择立即应用更改，也可以等到下一个维护时段。选择**立即应用**选项会导致单可用区数据库实例停机。多可用区数据库实例集群会在完成重启之前执行失效转移。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

以下 CLI 命令创建一个新的 RDS Custom for SQL Server 数据库实例并将其加入自托管式或 AWS 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
```

**重要**  
如果您的 AWS Managed Microsoft AD 的 NetBIOS 为 **corpexample**，那么它本身就会显示为 OU。之前创建的任何新 OU 都将显示为嵌套 OU。对于 AWS 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 身份验证目录\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/custom-sqs-WinAuth.png)


您负责确保您的域 FQDN 解析为域控制器 IP 地址。如果域控制器 IP 未解析，则域加入操作将失败，但会成功创建 RDS Custom for SQL Server 实例。有关问题排查信息，请参阅[Active Directory 故障排除](custom-sqlserver-WinAuth.Troubleshoot.md)。

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

使用 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 身份验证
<a name="custom-sqlserver-WinAuth.settingUp.KerbNTLM"></a>

### 使用 RDS 端点进行 NTLM 身份验证
<a name="custom-sqlserver-WinAuth.settingUp.KerbNTLM.NTLM"></a>

每个 Amazon RDS 数据库实例都有一个端点，每个端点都包含数据库实例的 DNS 名称和端口号。要使用 SQL 客户端应用程序连接到数据库实例，您需要该数据库实例的 DNS 名称和端口号。要使用 NTLM 身份验证进行身份验证，必须连接到 RDS 端点。

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

### Kerberos 身份验证
<a name="custom-sqlserver-WinAuth.settingUp.KerbNTLM.Kerb"></a>

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
<a name="custom-sqlserver-WinAuth.settingUp.KerbNTLM.CNAME"></a>

要查找您的 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;
```

# 在域中管理数据库实例
<a name="custom-sqlserver-WinAuth.ManagingDBI"></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 操作。

## 还原 RDS Custom for SQL Server 数据库实例并将其添加到 Active Directory 域
<a name="custom-sqlserver-WinAuth.ManagingDBI.Restoring"></a>

您可以还原数据库快照或对 SQL Server 数据库实例执行时间点故障恢复（PITR），然后将其添加到 Active Directory 域。数据库实例还原后，使用[步骤 5：创建或修改 RDS Custom for SQL Server 数据库实例](custom-sqlserver-WinAuth.settingUp.md#custom-sqlserver-WinAuth.settingUp.CreateDBInstance)中介绍的过程修改此实例以将数据库实例添加到 AD 域中。

# 了解域成员资格
<a name="custom-sqlserver-WinAuth.Understanding"></a>

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

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

# Active Directory 故障排除
<a name="custom-sqlserver-WinAuth.Troubleshoot"></a>

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


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