

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将亚马逊 EC2 Linux 实例加入您的 AWS 托管微软 AD 活动目录
<a name="joining_linux_instance"></a>

你可以在中启动 EC2 Linux 实例并将其加入你的 AWS 托管 Microsoft AD AWS 管理控制台。您也可以手动将 EC2 Linux 实例加入您的 AWS 托管微软 AD。也可以使用像 Winbind 这样的工具，这样你就可以将 EC2 Linux 实例加入你的 AWS 托管微软 AD。

支持以下 Linux 实例分发版和版本：
+ Amazon Linux AMI 2018.03.0
+ Amazon Linux 2（64 位 x86）
+ Red Hat Enterprise Linux 8 (HVM)（64 位 x86）
+ Ubuntu Server 18.04 LTS 和 Ubuntu Server 16.04 LTS
+ CentOS 7 x86-64
+ SUSE Linux 企业服务器 15 SP1

**注意**  
Ubuntu 14 和 Red Hat Enterprise Linux 7 和 8 之前的发行版不支持无缝域加入功能。

**Topics**
+ [将亚马逊 EC2 Linux 实例无缝加入你的 AWS 托管微软 AD 活动目录](seamlessly_join_linux_instance.md)
+ [将亚马逊 EC2 Linux 实例无缝加入共享的 AWS 托管微软 AD](seamlessly_join_linux_to_shared_MAD.md)
+ [手动将亚马逊 EC2 Linux 实例加入您的 AWS 托管微软 AD 活动目录](join_linux_instance.md)
+ [使用 Winbind 手动将亚马逊 EC2 Linux 实例加入你的 AWS 托管微软 AD 活动目录](join_linux_instance_winbind.md)

# 将亚马逊 EC2 Linux 实例无缝加入你的 AWS 托管微软 AD 活动目录
<a name="seamlessly_join_linux_instance"></a>

此过程将亚马逊 EC2 Linux 实例无缝连接到您的 AWS 托管微软 AD 活动目录。要完成此过程，您需要创建一个可能产生额外费用的 AWS Secrets Manager 密钥。有关更多信息，请参阅[AWS Secrets Manager 定价](https://aws.amazon.com/secrets-manager/pricing/)。

如果您需要跨多个 AWS 账户进行无缝域加入，则可以选择启用[目录共享](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_directory_sharing.html)。

支持以下 Linux 实例分发版和版本：
+ Amazon Linux AMI 2018.03.0
+ Amazon Linux 2（64 位 x86）
+ Red Hat Enterprise Linux 8 (HVM)（64 位 x86）
+ Ubuntu Server 18.04 LTS 和 Ubuntu Server 16.04 LTS
+ CentOS 7 x86-64
+ SUSE Linux 企业服务器 15 SP1

**注意**  
Ubuntu 14 和 Red Hat Enterprise Linux 7 和 8 之前的发行版不支持无缝域加入功能。

有关将 Linux 实例无缝加入 AWS 托管 Microsoft AD Active Directory 的过程的演示，请 YouTube 观看以下视频。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/NNUtdVVZVxU?si=_0zOiXhUObcW0_Wo/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/NNUtdVVZVxU?si=_0zOiXhUObcW0_Wo)


## 先决条件
<a name="seamless-linux-prereqs"></a>

您需要完成这些章节中的过程，才能设置无缝域加入到 EC2 Linux 实例。

### 无缝域加入的网络先决条件
<a name="linux-domain-join-networking-prereqs"></a>

要通过域无缝加入 EC2 Linux 实例，需要完成以下操作：
+ 您需要拥有以下 IAM 权限，才能无缝加入 EC2 Linux 实例：
  + 拥有 AWS 托管的 Microsoft 广告。要了解更多信息，请参阅[创建你的 Microsoft AWS 托管广告](ms_ad_getting_started.md#ms_ad_getting_started_create_directory)。
  + 您需要拥有以下 IAM 权限，才能无缝加入 EC2 Windows 实例：
    + 具有以下 IAM 权限的 IAM 实例配置文件：
      + `AmazonSSMManagedInstanceCore`
      + `AmazonSSMDirectoryServiceAccess`
    + 将 EC2 无缝加入 AWS 托管 Microsoft AD 的用户需要以下 IAM 权限：
      + Directory Service 权限：
        + `"ds:DescribeDirectories"`
        + `"ds:CreateComputer"`
      + Amazon VPC 权限：
        + `"ec2:DescribeVpcs"`
        + `"ec2:DescribeSubnets"`
        + `"ec2:DescribeNetworkInterfaces"`
        + `"ec2:CreateNetworkInterface"`
        + `"ec2:AttachNetworkInterface"`
      + EC2 权限；
        + `"ec2:DescribeInstances"`
        + `"ec2:DescribeImages"`
        + `"ec2:DescribeInstanceTypes"`
        + `"ec2:RunInstances"`
        + `"ec2:CreateTags"`
      + AWS Systems Manager 权限：
        + `"ssm:DescribeInstanceInformation"`
        + `"ssm:SendCommand"`
        + `"ssm:GetCommandInvocation"`
        + `"ssm:CreateBatchAssociation"`
+ 创建 AWS 托管 Microsoft AD 时，系统会创建一个包含入站和出站规则的安全组。要了解有关这些规则与端口的更多信息，请参阅[用你的 AWS 托管 Microsoft AD 创建了什么](ms_ad_getting_started_what_gets_created.md)。要无缝加入域名加入 EC2 Linux 实例，您启动实例的 VPC 应允许与 AWS 托管 Microsoft AD 安全组的入站和出站规则中允许的端口相同。
  + 根据网络安全和防火墙设置，您可能需要允许额外的出站流量。此流量将通过 HTTPS（端口 443）到达以下端点：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/directoryservice/latest/admin-guide/seamlessly_join_linux_instance.html)
+ 我们建议使用 DNS 服务器来解析你的 AWS 托管 Microsoft AD 域名。要实现此操作，可创建 DHCP 选项集。请参阅[为 AWS 托管的 Microsoft AD 创建或更改 DHCP 选项集](dhcp_options_set.md)了解更多信息。
  + 如果您选择不创建 DHCP 选项集，则您的 DNS 服务器将是静态的，并由您的 AWS 托管 Microsoft AD 进行配置。

### 选择无缝域名加入服务账户
<a name="seamless-linux-prereqs-select"></a>

你可以无缝地将 Linux 计算机加入你的 AWS 托管微软 AD Active Directory 域。要执行此操作，您必须使用一个具有创建计算机账户权限的用户账户，才能将计算机加入域。尽管 *AWS 委托管理员*或其他组的成员可能有足够的权限将计算机加入域，但我们不建议使用这些角色。作为最佳实践，我们建议您使用具有将计算机加入域所需最低权限的服务账户。

要委托具有将计算机加入域所需的最低权限的帐户，可以运行以下 PowerShell 命令。您必须在已安装 [为托管的 Microsoft AD 安装活动目录 AWS 管理工具](ms_ad_install_ad_tools.md) 的已加入域的 Windows 计算机上运行这些命令。此外，您必须使用有权修改您的计算机 OU 或容器权限的账户。该 PowerShell 命令设置权限，允许服务帐户在域的默认计算机容器中创建计算机对象。

```
$AccountName = 'awsSeamlessDomain'
# DO NOT modify anything below this comment.
# Getting Active Directory information.
Import-Module 'ActiveDirectory'
$Domain = Get-ADDomain -ErrorAction Stop
$BaseDn = $Domain.DistinguishedName
$ComputersContainer = $Domain.ComputersContainer
$SchemaNamingContext = Get-ADRootDSE | Select-Object -ExpandProperty 'schemaNamingContext'
[System.GUID]$ServicePrincipalNameGuid = (Get-ADObject -SearchBase $SchemaNamingContext -Filter { lDAPDisplayName -eq 'Computer' } -Properties 'schemaIDGUID').schemaIDGUID
# Getting Service account Information.
$AccountProperties = Get-ADUser -Identity $AccountName
$AccountSid = New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' $AccountProperties.SID.Value
# Getting ACL settings for the Computers container.
$ObjectAcl = Get-ACL -Path "AD:\$ComputersContainer"
# Setting ACL allowing the service account the ability to create child computer objects in the Computers container.
$AddAccessRule = New-Object -TypeName 'System.DirectoryServices.ActiveDirectoryAccessRule' $AccountSid, 'CreateChild', 'Allow', $ServicePrincipalNameGUID, 'All'
$ObjectAcl.AddAccessRule($AddAccessRule)
Set-ACL -AclObject $ObjectAcl -Path "AD:\$ComputersContainer"
```

如果您更喜欢使用图形用户界面（GUI），您可以使用 [向您的服务账户委派权限](ad_connector_getting_started.md#connect_delegate_privileges) 中所述的手动过程。

### 创建密钥以存储域服务账户
<a name="-create-secrets"></a>

您可以使用 AWS Secrets Manager 存储域名服务帐户。有关更多信息，请参阅[创建 AWS Secrets Manager 密钥](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html)。

**注意**  
Secrets Manager 会产生相关费用。有关更多信息，请参阅《AWS Secrets Manager User Guide》**中的 [Pricing](https://docs.aws.amazon.com//secretsmanager/latest/userguide/intro.html#asm_pricing)。

**创建密钥并存储域服务账户信息**

1. 登录 AWS 管理控制台 并打开 AWS Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 选择**存储新密钥**。

1. 在 **Store a new secret**（存储新密钥）页面上，执行以下操作：

   1. 在**密钥类型**下，选择**其他密钥类型**。

   1. 在**键/值对**下，执行以下操作：

      1. 在第一个框中，输入 **awsSeamlessDomainUsername**。在同一行的下一个框中，输入您服务账户的用户名。例如，如果您之前使用过该 PowerShell 命令，则服务帐户名称将为**awsSeamlessDomain**。
**注意**  
必须完全按照原样输入 **awsSeamlessDomainUsername**。确保前后均没有任何空格。否则，域加入将失败。  
![\[在 AWS Secrets Manager 控制台的 “选择密钥类型” 页面上。在密钥类型下选择其他类型的密钥并输入 awsSeamlessDomainUsername 作为键值。\]](http://docs.aws.amazon.com/zh_cn/directoryservice/latest/admin-guide/images/secrets_manager_1.png)

      1. 选择**添加行**。

      1. 在新行的第一个框中输入 **awsSeamlessDomainPassword**。在同一行的下一个框中，输入服务账户密码。
**注意**  
必须完全按照原样输入 **awsSeamlessDomainPassword**。确保前后均没有任何空格。否则，域加入将失败。

      1. 在**加密密钥**下，保留默认值 `aws/secretsmanager`。选择此选项时， AWS Secrets Manager 始终会对密钥进行加密。您也可以选择您创建的密钥。

      1. 选择**下一步**。

1. 在 “**密钥名称**” 下，使用以下格式输入包含您的目录 ID 的密钥名称，*d-xxxxxxxxx*替换为您的目录 ID：

   ```
   aws/directory-services/d-xxxxxxxxx/seamless-domain-join
   ```

   这将用于检索应用程序中的密钥。
**注意**  
您必须**aws/directory-services/*d-xxxxxxxxx*/seamless-domain-join**完全按原样输入，但要*d-xxxxxxxxxx*用您的目录 ID 替换。确保前后均没有空格。否则，域加入将失败。  
![\[在 AWS Secrets Manager 控制台的配置密钥页面上。输入密钥名称并突出显示。\]](http://docs.aws.amazon.com/zh_cn/directoryservice/latest/admin-guide/images/secrets_manager_2.png)

1. 将其他所有内容都设置为默认值，然后选择**下一步**。

1. 在**配置自动轮换**下，选择**禁用自动轮换**，然后选择**下一步**。

   存储此密钥后，您可以为其启用轮换。

1. 查看设置，然后选择**存储**以保存更改。Secrets Manager 控制台将返回您账户中的密钥列表，并且列表中现在包含新的密钥。

1. 从列表中选择您新创建的密钥名称，并记下**密钥 ARN** 值。您需要在下一部分中使用该名称。

### 为域服务账户密钥启用轮换
<a name="seamless-linux-prereqs-turn-on-rotation"></a>

我们建议您定期轮换密钥以改善安全状况。

**为域服务账户密钥启用轮换**
+ 按照《*AWS Secrets Manager 用户指南*》中[为 AWS Secrets Manager 密钥设置自动轮换](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_turn-on-for-other.html)中的说明进行操作。

  对于步骤 5，使用《AWS Secrets Manager 用户指南》**中的轮换模板 [Microsoft Active Directory 凭证](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#template-AD-password)。

  如需帮助，请参阅*AWS Secrets Manager 用户指南*中的[AWS Secrets Manager 轮换疑难解答](https://docs.aws.amazon.com/secretsmanager/latest/userguide/troubleshoot_rotation.html)。

### 创建所需 IAM policy 和角色
<a name="seamless-linux-prereqs-create-policy"></a>

使用以下先决条件步骤创建自定义策略，该策略允许对您的 Secrets Manager 无缝域加入密钥（您之前创建的）进行只读访问，并创建新的 Linux EC2 DomainJoin IAM 角色。

#### 创建 Secrets Manager IAM 读取策略
<a name="seamless-linux-prereqs-create-policy-step1"></a>

您可以使用 IAM 控制台创建策略，授予对 Secrets Manager 密钥的只读访问权限。

**创建 Secrets Manager IAM 读取策略**

1. 以有权创建 IAM 策略的用户 AWS 管理控制台 身份登录。然后在上打开 IAM 控制台[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中的**访问管理**下，选择**策略**。

1. 选择**创建策略**。

1. 选择 **JSON** 选项卡，然后复制以下 JSON 策略文档中的文本。然后将其粘贴到 **JSON** 文本框中。
**注意**  
确保将区域和资源 ARN 替换为您之前创建的密钥的实际区域和资源 ARN。

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "secretsmanager:GetSecretValue",
                   "secretsmanager:DescribeSecret"
               ],
               "Resource": [
                   "arn:aws:secretsmanager:us-east-1:xxxxxxxxx:secret:aws/directory-services/d-xxxxxxxxx/seamless-domain-join"
               ]
           }
       ]
   }
   ```

1. 完成后，选择**下一步**。策略验证程序将报告任何语法错误。有关更多信息，请参阅[验证 IAM policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_policy-validator.html)。

1. 在**检查策略**页面上，输入一个策略名称，例如 **SM-Secret-Linux-DJ-*d-xxxxxxxxxx*-Read**。查看**摘要**部分，以查看您的策略授予的权限。选择**创建策略**，保存更改。托管策略列表中将显示新策略，并且现在已准备好附加到身份中。

**注意**  
我们建议您为每个密钥创建一个策略。这样做可以确保实例只能访问相应的密钥，并在实例受损时将影响降至最低。

#### 创建 Linux EC2 DomainJoin 角色
<a name="seamless-linux-prereqs-create-policy-step2"></a>

您可以使用 IAM 控制台创建用于域加入 Linux EC2 实例的角色。

**创建 Linux EC2 DomainJoin 角色**

1. 以有权创建 IAM 策略的用户 AWS 管理控制台 身份登录。然后在上打开 IAM 控制台[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中的**访问管理**下，选择**角色**。

1. 在内容窗格中，选择**创建角色**。

1. 在**选择受信任实体的类型**下，选择 **AWS 服务**。

1. 在**使用案例**下，选择 **EC2**，然后选择**下一步**。  
![\[在 IAM 控制台的 “选择可信实体” 页面上。 AWS 服务和 EC2 已选中。\]](http://docs.aws.amazon.com/zh_cn/directoryservice/latest/admin-guide/images/iam-console-trusted-entity.png)

1. 对于**筛选策略**，执行以下操作：

   1. 输入 **AmazonSSMManagedInstanceCore**。然后选择列表中该项目的复选框。

   1. 输入 **AmazonSSMDirectoryServiceAccess**。然后选择列表中该项目的复选框。

   1. 输入 **SM-Secret-Linux-DJ-*d-xxxxxxxxxx*-Read**（或您在上一过程中创建的策略名称）。然后选择列表中该项目的复选框。

   1. 添加了上面列出的三个策略后，选择**创建角色**。
**注意**  
Amazon SSMDirectory ServiceAccess 提供将实例加入由管理的活动目录的权限 Directory Service。Amazon SSMManaged InstanceCore 提供使用该 AWS Systems Manager 服务所需的最低权限。有关创建具有这些权限的角色的更多信息，以及您可以分配给 IAM 角色的其他权限和策略的信息，请参阅《AWS Systems Manager 用户指南》**中的[为 Systems Manager 创建 IAM 实例配置文件](https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-instance-profile.html)。

1. 在**角色名称**字段中，输入新角色的名称，如 **LinuxEC2DomainJoin** 或您喜欢的其他名称。

1. （可选）对于**角色描述**，请输入描述。

1. （可选）在**步骤 3：添加标签**下选择**添加新标签**以添加标签。标签键值对用于组织、跟踪或控制此角色的访问权限。

1. 选择**创建角色**。

## 无缝加入 Linux 实例
<a name="seamless-linux-join-instance"></a>

**无缝加入 Linux 实例**

1. 登录 AWS 管理控制台 并打开 Amazon EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 从导航栏的区域选择器中，选择与现有目录 AWS 区域 相同的目录。

1. 在 **EC2 控制面板**的**启动实例**部分，选择**启动实例**。

1. 在**启动实例**页面的**名称和标签**部分下，输入您要用于 Linux EC2 实例的名称。

1.  *（可选）*选择**添加其他标签**，添加一个或多个标签键值对，以组织、跟踪或控制此 EC2 实例的访问权限。

1. 在**应用程序和操作系统映像（Amazon 机器映像）**部分中，选择您想要启动的 Linux AMI。
**注意**  
使用的 AMI 必须具有 AWS Systems Manager （SSM 代理）版本 2.3.1644.0 或更高版本。要通过从该 AMI 启动实例来检查 AMI 中已安装的 SSM Agent 版本，请参阅[获取当前安装的 SSM Agent 版本](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent-get-version.html)。如果您需要升级 SSM Agent，请参阅[在适用于 Linux 的 EC2 实例上安装和配置 SSM Agent](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-install-ssm-agent.html)。  
SSM 在将 Linux 实例加入 Active Directory 域时使用 `aws:domainJoin` 插件。该插件将 Linux 实例的主机名更改为 EC2 AMAZ-*XXXXXXX* 格式。有关 `aws:domainJoin` 的更多信息，请参阅《AWS Systems Manager 用户指南》**中的 [AWS Systems Manager 命令文档插件参考](https://docs.aws.amazon.com//systems-manager/latest/userguide/documents-command-ssm-plugin-reference.html#aws-domainJoin)。

1. 在**实例类型**部分，从**实例类型**下拉列表中选择要使用的实例类型。

1. 在**密钥对（登录）**部分，您可以选择创建新密钥对，或从现有密钥对中进行选择。要创建新的密钥对，请选择**新建新密钥对**。输入密钥对的名称，然后为**密钥对类型**和**私钥文件格式**选择一个选项。要以可与 OpenSSH 一起使用的格式保存私钥，请选择 **pem**。要以可与 PuTTY 一起使用的格式保存私钥，请选择 **ppk**。选择**创建密钥对**。您的浏览器会自动下载私有密钥文件。将私有密钥文件保存在安全位置。
**重要**  
这是您保存私有密钥文件的唯一机会。

1. 在**启动实例**页面的**网络设置**部分下，选择**编辑**。从 **VPC – *必需***下拉列表中选择创建目录的 **VPC**。

1. 从**子网**下拉列表中选择 VPC 中的其中一个公有子网。选择的子网必须将所有外部流量都路由到互联网网关。否则将无法远程连接到实例。

   有关如何连接到互联网网关的更多信息，请参阅《Amazon VPC 用户指南》**中的[使用互联网网关连接到互联网](https://docs.aws.amazon.com//vpc/latest/userguide/VPC_Internet_Gateway.html)。

1. 在**自动分配公有 IP** 下，选择**启用**。

   有关公共和私有 IP 寻址的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 实例 IP 寻址](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/using-instance-addressing.html)。

1. 对于**防火墙（安全组）**设置，您可以使用默认设置或进行更改以满足您的需求。

1. 对于**配置存储**设置，您可以使用默认设置或进行更改以满足您的需求。

1. 选择**高级详细信息**部分，从**域加入目录**下拉列表中选择您的域。
**注意**  
选择域加入目录后，您可能会看到：  

![\[选择域加入目录时出现错误消息。您现有的 SSM 文档存在错误。\]](http://docs.aws.amazon.com/zh_cn/directoryservice/latest/admin-guide/images/SSM-Error-Message.png)

当 EC2 启动向导识别到某个现有 SSM 文档包含意外属性时，会发生此错误。您可以执行以下操作之一：  
如果您之前编辑了 SSM 文档且属性为预期属性，请选择关闭并继续启动 EC2 实例，不做任何更改。
选择“在此处删除现有 SSM 文档”链接以删除 SSM 文档。这将允许创建包含正确属性的 SSM 文档。启动 EC2 实例时，将自动创建 SSM 文档。

1. 对于 **IAM 实例配置文件**，请选择您之前在先决条件部分**步骤 2：创建 Linux EC2 DomainJoin 角色中创建的 IAM 角色**。

1. 选择**启动实例**。

**注意**  
如果您要使用 SUSE Linux 进行无缝域加入，则需要重新启动才能进行身份验证。要从 Linux 终端重启 SUSE，请键入 **sudo reboot**。

# 将亚马逊 EC2 Linux 实例无缝加入共享的 AWS 托管微软 AD
<a name="seamlessly_join_linux_to_shared_MAD"></a>

在此过程中，将 Amazon EC2 Linux 实例无缝加入共享的 AWS Managed Microsoft AD 为此，您需要在要启动 EC2 Linux 实例的账户的 EC2 实例角色中创建 IA AWS Secrets Manager M 读取策略。该账户在此过程中被称为 `Account 2`。此实例将使用从另一个账户（称为 `Account 1`）共享的 AWS Managed Microsoft AD。

## 先决条件
<a name="seamlessly_join_linux_to_shared_MAD_prereqs"></a>

您需要先完成以下操作，然后才能将 Amazon EC2 Linux 实例无缝加入共享的 AWS 托管 Microsoft AD：
+ [教程：共享您的 AWS 托管 Microsoft AD 目录以实现无缝加入 EC2 域名](ms_ad_tutorial_directory_sharing.md)教程中的步骤 1 到 3。本教程将引导你设置网络和共享 AWS 托管 Microsoft AD。
+ [将亚马逊 EC2 Linux 实例无缝加入你的 AWS 托管微软 AD 活动目录](seamlessly_join_linux_instance.md)中概述了此过程。

## 步骤 1：在账户 2 中创建 Linux EC2 DomainJoin 角色
<a name="seamlessly_join_linux_to_shared_MAD_step_1"></a>

在此步骤中，您可以使用 IAM 控制台创建用于在登录 `Account 2` 时通过域加入 EC2 Linux 实例的 IAM 角色。

**创建 Linux EC2 DomainJoin 角色**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在左侧导航窗格中的**访问管理**下，选择**角色**。

1. 在 **Roles**（角色）页面上，选择 **Create role**（创建角色）。

1. 在 **选择受信任实体的类型** 下，选择 **AWS 服务**。

1. 在**使用案例**下，选择 **EC2**，然后选择**下一步**。

1. 对于**筛选策略**，执行以下操作：

   1. 输入 `AmazonSSMManagedInstanceCore`。然后在列表中选择该项目的复选框。

   1. 输入 `AmazonSSMDirectoryServiceAccess`。然后在列表中选择该项目的复选框。

   1. 添加这些策略后，选择**创建角色**。
**注意**  
`AmazonSSMDirectoryServiceAccess`提供将实例加入由管理的 Active Directory 的权限 Directory Service。 `AmazonSSMManagedInstanceCore`提供了使用所需的最低权限 AWS Systems Manager。有关创建具有这些权限的角色的更多信息，以及您可以分配给 IAM 角色的其他权限和策略的信息，请参阅《AWS Systems Manager 用户指南》**中的[为 Systems Manager 配置所需的实例权限](https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-instance-permissions.html)。

1. 在**角色名称**字段中，输入新角色的名称，如 `LinuxEC2DomainJoin` 或您喜欢的其他名称。

1. *（可选）*对于**角色描述**，请输入描述。

1. *（可选）*在**步骤 3：添加标签**下选择**添加新标签**以添加标签。标签键值对用于组织、跟踪或控制此角色的访问权限。

1. 选择**创建角色**。

## 步骤 2：创建跨账户资源访问权限以共享 AWS Secrets Manager 机密
<a name="seamlessly_join_linux_to_shared_MAD_step_2"></a>

下一节是需要满足的其他要求，才能将 EC2 Linux 实例与共享的 AWS 托管 Microsoft AD 无缝连接。这些要求包括创建资源策略并将其附加到相应的服务和资源。

要允许账户中的用户访问另一个账户中的 AWS Secrets Manager 密钥，您必须在资源策略和身份策略中同时允许访问权限。这种类型的访问权限称为[跨账户资源访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

这种类型的访问权限不同于授予 Secrets Manager 密钥所在账户中的身份访问权限。您还必须允许身份使用密钥加密的 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)（KMS）密钥。此权限是必要的，因为您不能使用 AWS 托管密钥 (`aws/secretsmanager`) 进行跨账户访问。相反，您需要使用您创建的 KMS 密钥加密密钥，然后向其中附加密钥策略。要更改密钥的加密密钥，请参阅[修改 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_update-secret.html)。

**注意**  
根据您使用的密钥 AWS Secrets Manager，会收取与之相关的费用。有关当前完整定价列表，请参阅 [AWS Secrets Manager 定价](https://aws.amazon.com/secrets-manager/pricing/)。你可以使用 Secrets Manager 创建的来免费加密你的秘密。 AWS 托管式密钥 `aws/secretsmanager`如果您创建自己的 KMS 密钥来加密您的密钥，则按当前 AWS KMS 费率向您 AWS 收费。有关更多信息，请参阅[AWS Key Management Service 定价](https://aws.amazon.com/kms/pricing/)。

以下步骤允许您创建资源策略，使用户能够将 EC2 Linux 实例无缝加入共享的 AWS 托管 Microsoft AD。

**将资源策略附加到 Account 1 中的密钥**

1. 打开 Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 从密钥列表中，选择您在[先决条件](#seamlessly_join_linux_to_shared_MAD_prereqs)期间创建的**密钥**。

1. 在**密钥的详细信息页面**的**概述**选项卡下，向下滚动到**资源权限**。

1. 选择**编辑权限**。

   1. 在策略字段中输入以下策略。以下策略允许EC2DomainJoin中的 **Linux** `Account 2` 访问中的密钥`Account 1`。将 ARN 值替换为您在[步骤 1](#seamlessly_join_linux_to_shared_MAD_step_1) 中创建的 `LinuxEC2DomainJoin` 角色 `Account 2` 的 ARN 值。要使用此策略，请参阅[将权限策略附加到 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_resource-policies.html)。

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

****  

     ```
     {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Effect": "Allow",
           "Principal": {
             "AWS": "arn:aws:iam::123456789012:role/LinuxEC2DomainJoin"
           },
           "Action": "secretsmanager:GetSecretValue",
           "Resource": "*"
         }
       ]
     }
     ```

------

**将语句添加到 Account 1 中 KMS 密钥的密钥政策中**

1. 打开 Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 在左侧导航栏中，选择**客户管理型密钥**。

1. 在**客户管理型密钥**页面上，选择您创建的密钥。

1. 在**密钥详细信息**页面上，导航到**密钥政策**，然后选择**编辑**。

1. 以下密钥政策语句允许 `Account 2` 中的 `ApplicationRole` 使用 `Account 1` 中的 KMS 密钥来解密 `Account 1` 中的密钥。要使用此语句，请将其添加到 KMS 密钥的密钥策略中。有关更多信息，请参阅[更改密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html)。

   ```
   {
   {
     "Effect": "Allow",
     "Principal": {
       "AWS": "arn:aws:iam::Account2:role/ApplicationRole"
     },
     "Action": [
       "kms:Decrypt",
       "kms:DescribeKey"
     ],
     "Resource": "*"
   }
   ```

**为 Account 2 中的身份创建身份策略**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在左侧导航窗格中的**访问管理**下，选择**策略**。

1. 选择 **Create Policy (创建策略)**。在**策略编辑器**中，选择 **JSON**。

1. 以下策略允许 `Account 2` 中的 `ApplicationRole` 访问 `Account 1` 中的密钥，并通过使用同样位于 `Account 1` 中的加密密钥来解密密钥值。您可以在 Secrets Manager 控制台的**密钥详细信息**页面的**密钥 ARN** 下方找到您的密钥 ARN。或者，您可以调用 [describe-secret](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/describe-secret.html) 以识别密钥的 ARN。将资源 ARN 替换为密钥 ARN 和 `Account 1` 的资源 ARN。要使用此策略，请参阅[将权限策略附加到 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_resource-policies.html)。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "secretsmanager:GetSecretValue",
         "Resource": "arn:aws:secretsmanager:us-east-1:111122223333:secret:secretName-AbCdEf"
       },
       {
         "Effect": "Allow",
         "Action": [
           "kms:Decrypt",
           "kms:Describekey"
         ],
         "Resource": "arn:aws:kms:us-east-1:111122223333:key/Your_Encryption_Key"
       }
     ]
   }
   ```

------

1. 选择**下一步**，然后选择**保存更改**。

1. 在[Attach a resource policy to the secret in Account 1](#step1ResourcePolicy)中查找并选择您在 `Account 2` 中创建的角色。

1. 在**添加权限**下，选择**附加策略**。

1. 在搜索栏中，找到您在[Add a statement to the key policy for the KMS key in Account 1](#step2KeyPolicy)中创建的策略，并选择将该策略添加到角色的框。然后选择**添加权限**。

## 步骤 3：无缝加入 Linux 实例
<a name="seamlessly_join_linux_to_shared_MAD_prereqs_step_3"></a>

现在，您可以使用以下步骤将您的 EC2 Linux 实例无缝加入共享的 AWS 托管 Microsoft AD。

**无缝加入 Linux 实例**

1. 登录 AWS 管理控制台 并打开 Amazon EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 从导航栏的区域选择器中，选择与现有目录 AWS 区域 相同的目录。

1. 在 **EC2 控制面板**的**启动实例**部分，选择**启动实例**。

1. 在**启动实例**页面的**名称和标签**部分下，输入您要用于 Linux EC2 实例的名称。

1.  *（可选）*选择**添加其他标签**，添加一个或多个标签键值对，以组织、跟踪或控制此 EC2 实例的访问权限。

1. 在**应用程序和操作系统映像（Amazon 机器映像）**部分中，选择您想要启动的 Linux AMI。
**注意**  
使用的 AMI 必须具有 AWS Systems Manager （SSM 代理）版本 2.3.1644.0 或更高版本。要通过从该 AMI 启动实例来检查 AMI 中已安装的 SSM Agent 版本，请参阅[获取当前安装的 SSM Agent 版本](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent-get-version.html)。如果您需要升级 SSM Agent，请参阅[在适用于 Linux 的 EC2 实例上安装和配置 SSM Agent](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-install-ssm-agent.html)。  
SSM 在将 Linux 实例加入 Active Directory 域时使用 `aws:domainJoin` 插件。该插件将 Linux 实例的主机名更改为 EC2 AMAZ-*XXXXXXX* 格式。有关 `aws:domainJoin` 的更多信息，请参阅《AWS Systems Manager 用户指南》**中的 [AWS Systems Manager 命令文档插件参考](https://docs.aws.amazon.com//systems-manager/latest/userguide/documents-command-ssm-plugin-reference.html#aws-domainJoin)。

1. 在**实例类型**部分，从**实例类型**下拉列表中选择要使用的实例类型。

1. 在**密钥对（登录）**部分，您可以选择创建新密钥对，或从现有密钥对中进行选择。要创建新的密钥对，请选择**新建新密钥对**。输入密钥对的名称，然后为**密钥对类型**和**私钥文件格式**选择一个选项。要以可与 OpenSSH 一起使用的格式保存私钥，请选择 **pem**。要以可与 PuTTY 一起使用的格式保存私钥，请选择 **ppk**。选择**创建密钥对**。您的浏览器会自动下载私有密钥文件。将私有密钥文件保存在安全位置。
**重要**  
这是您保存私有密钥文件的唯一机会。

1. 在**启动实例**页面的**网络设置**部分下，选择**编辑**。从 **VPC – *必需***下拉列表中选择创建目录的 **VPC**。

1. 从**子网**下拉列表中选择 VPC 中的其中一个公有子网。选择的子网必须将所有外部流量都路由到互联网网关。否则将无法远程连接到实例。

   有关如何连接到互联网网关的更多信息，请参阅《Amazon VPC 用户指南》**中的[使用互联网网关连接到互联网](https://docs.aws.amazon.com//vpc/latest/userguide/VPC_Internet_Gateway.html)。

1. 在**自动分配公有 IP** 下，选择**启用**。

   有关公共和私有 IP 寻址的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 实例 IP 寻址](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/using-instance-addressing.html)。

1. 对于**防火墙（安全组）**设置，您可以使用默认设置或进行更改以满足您的需求。

1. 对于**配置存储**设置，您可以使用默认设置或进行更改以满足您的需求。

1. 选择**高级详细信息**部分，从**域加入目录**下拉列表中选择您的域。
**注意**  
选择域加入目录后，您可能会看到：  

![\[选择域加入目录时出现错误消息。您现有的 SSM 文档存在错误。\]](http://docs.aws.amazon.com/zh_cn/directoryservice/latest/admin-guide/images/SSM-Error-Message.png)

当 EC2 启动向导识别到某个现有 SSM 文档包含意外属性时，会发生此错误。您可以执行以下操作之一：  
如果您之前编辑了 SSM 文档且属性为预期属性，请选择关闭并继续启动 EC2 实例，不做任何更改。
选择“在此处删除现有 SSM 文档”链接以删除 SSM 文档。这将允许创建包含正确属性的 SSM 文档。启动 EC2 实例时，将自动创建 SSM 文档。

1. 对于 **IAM 实例配置文件**，请选择您之前在先决条件部分**步骤 2：创建 Linux EC2 DomainJoin 角色中创建的 IAM 角色**。

1. 选择**启动实例**。

**注意**  
如果您要使用 SUSE Linux 进行无缝域加入，则需要重新启动才能进行身份验证。要从 Linux 终端重启 SUSE，请键入 **sudo reboot**。

# 手动将亚马逊 EC2 Linux 实例加入您的 AWS 托管微软 AD 活动目录
<a name="join_linux_instance"></a>

除亚马逊 EC2 Windows 实例外，您还可以将某些亚马逊 EC2 Linux 实例加入您的 AWS 托管微软 AD 活动目录。支持以下 Linux 实例分发版和版本：
+ Amazon Linux AMI 2018.03.0
+ Amazon Linux 2（64 位 x86）
+ Amazon Linux 2023 AMI
+ Red Hat Enterprise Linux 8 (HVM)（64 位 x86）
+ Ubuntu Server 18.04 LTS 和 Ubuntu Server 16.04 LTS
+ CentOS 7 x86-64
+ SUSE Linux 企业服务器 15 SP1

**注意**  
其他 Linux 分发版和版本可能会正常运行，但未经过测试。

## 将 Linux 实例加入你的 AWS 托管微软 AD
<a name="join_linux_prereq"></a>

必须先按照 [无缝加入 Linux 实例](seamlessly_join_linux_instance.md#seamless-linux-join-instance) 中指定的步骤启动实例，然后才能将 Amazon Linux、CentOS、Red Hat 或 Ubuntu 实例加入目录。

**重要**  
以下某些过程如果未正确执行，可能会使实例无法访问或不可用。因此，我们强烈建议在执行这些过程之前对实例创建备份或拍摄快照。

**将 Linux 实例加入目录**  
使用以下选项卡之一对特定 Linux 实例执行步骤：

------
#### [ Amazon Linux ]<a name="amazonlinux"></a>

1. 使用任何 SSH 客户端连接到实例。

1. 将 Linux 实例配置为使用 Directory Service提供的 DNS 服务器的 DNS 服务器 IP 地址。可以通过在附加到 VPC 的 DHCP 选项集中进行设置，或是通过在实例上手动设置，来执行此操作。如果要手动设置，请参阅 AWS 知识中心的[如何为私有 EC2 实例分配静态 DNS 服务器](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-static-dns-ubuntu-debian/)，以了解有关为特定 Linux 分发版和版本设置持久性 DNS 服务器的指导。

1. 确保 64 位 Amazon Linux 实例为最新状态。

   ```
   sudo yum -y update
   ```

1. 在 Linux 实例上安装所需的 Amazon Linux 软件包。
**注意**  
其中一些程序包可能已安装。  
安装程序包时，可能会遇到几个弹出配置屏幕。通常可以将这些屏幕中的字段保留为空白。  
Amazon Linux  

   ```
   sudo yum install samba-common-tools realmd oddjob oddjob-mkhomedir sssd adcli krb5-workstation
   ```
**注意**  
有关确定您所使用的 Amazon Linux 版本的帮助，请参阅《**Amazon EC2 用户指南（适用于 Linux 实例）》中的[识别 Amazon Linux 映像](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/amazon-linux-ami-basics.html#amazon-linux-image-id)。

1. 使用以下命令将实例加入目录。

   ```
   sudo realm join -U join_account@EXAMPLE.COM example.com --verbose
   ```  
*join\$1account@EXAMPLE.COM*  
*example.com*网域中具有域加入权限的账户。在出现提示时输入账户的密码。有关委托这些权限的更多信息，请参阅[为托 AWS 管 Microsoft AD 委派目录加入权限](directory_join_privileges.md)。  
*example.com*  
目录的完全限定 DNS 名称。

   ```
   ...
    * Successfully enrolled machine in realm
   ```

1. 设置 SSH 服务以允许进行密码身份验证。

   1. 在文本编辑器中打开 `/etc/ssh/sshd_config` 文件。

      ```
      sudo vi /etc/ssh/sshd_config
      ```

   1. 将 `PasswordAuthentication` 设置为 `yes`。

      ```
      PasswordAuthentication yes
      ```

   1. 重新启动 SSH 服务。

      ```
      sudo systemctl restart sshd.service
      ```

      或者：

      ```
      sudo service sshd restart
      ```

1. 实例重新启动后，使用任何 SSH 客户端连接到该实例，然后通过执行以下步骤将 AWS 委派管理员组添加到 sudoers 列表中：

   1. 使用以下命令打开 `sudoers` 文件：

      ```
      sudo visudo
      ```

   1. 将以下内容添加到 `sudoers` 文件的底部并保存该文件。

      ```
      ## Add the "AWS Delegated Administrators" group from the example.com domain.
      %AWS\ Delegated\ Administrators@example.com ALL=(ALL:ALL) ALL
      ```

      （以上示例使用“\$1<space>”形成 Linux 空格字符。）

------
#### [ CentOS ]<a name="centos"></a>

1. 使用任何 SSH 客户端连接到实例。

1. 将 Linux 实例配置为使用 Directory Service提供的 DNS 服务器的 DNS 服务器 IP 地址。可以通过在附加到 VPC 的 DHCP 选项集中进行设置，或是通过在实例上手动设置，来执行此操作。如果要手动设置，请参阅 AWS 知识中心的[如何为私有 EC2 实例分配静态 DNS 服务器](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-static-dns-ubuntu-debian/)，以了解有关为特定 Linux 分发版和版本设置持久性 DNS 服务器的指导。

1. 确保 CentOS 7 实例为最新状态。

   ```
   sudo yum -y update
   ```

1. 在 Linux 实例上安装所需 CentOS 7 软件包。
**注意**  
其中一些程序包可能已安装。  
安装程序包时，可能会遇到几个弹出配置屏幕。通常可以将这些屏幕中的字段保留为空白。

   ```
   sudo yum -y install sssd realmd krb5-workstation samba-common-tools
   ```

1. 使用以下命令将实例加入目录。

   ```
   sudo realm join -U join_account@example.com example.com --verbose
   ```  
*join\$1account@example.com*  
*example.com*网域中具有域加入权限的账户。在出现提示时输入账户的密码。有关委托这些权限的更多信息，请参阅[为托 AWS 管 Microsoft AD 委派目录加入权限](directory_join_privileges.md)。  
*example.com*  
目录的完全限定 DNS 名称。

   ```
   ...
    * Successfully enrolled machine in realm
   ```

1. 设置 SSH 服务以允许进行密码身份验证。

   1. 在文本编辑器中打开 `/etc/ssh/sshd_config` 文件。

      ```
      sudo vi /etc/ssh/sshd_config
      ```

   1. 将 `PasswordAuthentication` 设置为 `yes`。

      ```
      PasswordAuthentication yes
      ```

   1. 重新启动 SSH 服务。

      ```
      sudo systemctl restart sshd.service
      ```

      或者：

      ```
      sudo service sshd restart
      ```

1. 实例重新启动后，使用任何 SSH 客户端连接到该实例，然后通过执行以下步骤将 AWS 委派管理员组添加到 sudoers 列表中：

   1. 使用以下命令打开 `sudoers` 文件：

      ```
      sudo visudo
      ```

   1. 将以下内容添加到 `sudoers` 文件的底部并保存该文件。

      ```
      ## Add the "AWS Delegated Administrators" group from the example.com domain.
      %AWS\ Delegated\ Administrators@example.com ALL=(ALL:ALL) ALL
      ```

      （以上示例使用“\$1<space>”形成 Linux 空格字符。）

------
#### [ Red Hat ]<a name="redhat"></a>

1. 使用任何 SSH 客户端连接到实例。

1. 将 Linux 实例配置为使用 Directory Service提供的 DNS 服务器的 DNS 服务器 IP 地址。可以通过在附加到 VPC 的 DHCP 选项集中进行设置，或是通过在实例上手动设置，来执行此操作。如果要手动设置，请参阅 AWS 知识中心的[如何为私有 EC2 实例分配静态 DNS 服务器](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-static-dns-ubuntu-debian/)，以了解有关为特定 Linux 分发版和版本设置持久性 DNS 服务器的指导。

1. 确保 Red Hat - 64 位实例为最新状态。

   ```
   sudo yum -y update
   ```

1. 在 Linux 实例上安装所需的 Red Hat 程序包。
**注意**  
其中一些程序包可能已安装。  
安装程序包时，可能会遇到几个弹出配置屏幕。通常可以将这些屏幕中的字段保留为空白。

   ```
   sudo yum -y install sssd realmd krb5-workstation samba-common-tools
   ```

1. 使用以下命令将实例加入目录。

   ```
   sudo realm join -v -U join_account example.com --install=/
   ```  
*join\$1account*  
域中具有*example.com*域加入权限的帐户的**AMAccount名称**。在出现提示时输入账户的密码。有关委托这些权限的更多信息，请参阅[为托 AWS 管 Microsoft AD 委派目录加入权限](directory_join_privileges.md)。  
*example.com*  
目录的完全限定 DNS 名称。

   ```
   ...
    * Successfully enrolled machine in realm
   ```

1. 设置 SSH 服务以允许进行密码身份验证。

   1. 在文本编辑器中打开 `/etc/ssh/sshd_config` 文件。

      ```
      sudo vi /etc/ssh/sshd_config
      ```

   1. 将 `PasswordAuthentication` 设置为 `yes`。

      ```
      PasswordAuthentication yes
      ```

   1. 重新启动 SSH 服务。

      ```
      sudo systemctl restart sshd.service
      ```

      或者：

      ```
      sudo service sshd restart
      ```

1. 实例重新启动后，使用任何 SSH 客户端连接到该实例，然后通过执行以下步骤将 AWS 委派管理员组添加到 sudoers 列表中：

   1. 使用以下命令打开 `sudoers` 文件：

      ```
      sudo visudo
      ```

   1. 将以下内容添加到 `sudoers` 文件的底部并保存该文件。

      ```
      ## Add the "AWS Delegated Administrators" group from the example.com domain.
      %AWS\ Delegated\ Administrators@example.com ALL=(ALL:ALL) ALL
      ```

      （以上示例使用“\$1<space>”形成 Linux 空格字符。）

------
#### [ SUSE ]<a name="suse"></a>

1. 使用任何 SSH 客户端连接到实例。

1. 配置 Linux 实例以使用 Directory Service提供的 DNS 服务器的 DNS 服务器 IP 地址。可以通过在附加到 VPC 的 DHCP 选项集中进行设置，或是通过在实例上手动设置，来执行此操作。如果您想手动设置，请参阅 AWS 知识中心中的[如何将静态 DNS 服务器分配给私有 Amazon EC2 实例，以](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-static-dns-ubuntu-debian/)获取有关为您的特定 Linux 发行版和版本设置永久 DNS 服务器的指导。

1. 确保您的 SUSE Linux 15 实例为最新状态。

   1. 连接程序包存储库。

      ```
      sudo SUSEConnect -p PackageHub/15.1/x86_64
      ```

   1. 更新 SUSE。

      ```
      sudo zypper update -y
      ```

1. 在 Linux 实例上安装所需的 SUSE Linux 15 程序包。
**注意**  
其中一些程序包可能已安装。  
安装程序包时，可能会遇到几个弹出配置屏幕。通常可以将这些屏幕中的字段保留为空白。

   ```
   sudo zypper -n install realmd adcli sssd sssd-tools sssd-ad samba-client krb5-client
   ```

1. 使用以下命令将实例加入目录。

   ```
   sudo realm join -U join_account example.com --verbose
   ```  
*join\$1account*  
具有域加入权限的*example.com*域中的 s AMAccount 名称。在出现提示时输入账户的密码。有关委托这些权限的更多信息，请参阅[为托 AWS 管 Microsoft AD 委派目录加入权限](directory_join_privileges.md)。  
*example.com*  
目录的完全限定 DNS 名称。

   ```
   …
   realm: Couldn't join realm: Enabling SSSD in nsswitch.conf and PAM failed.
   ```

   请注意，应该有以下两项返回内容。

   ```
   ! Couldn't authenticate with keytab while discovering which salt to use:
   ! Enabling SSSD in nsswitch.conf and PAM failed.
   ```

1. 在 **PAM** 中手动启用 **SSSD**。

   ```
   sudo pam-config --add --sss
   ```

1. 编辑 nsswitch.conf 以在 nsswitch.conf 中启用 SSSD

   ```
   sudo vi /etc/nsswitch.conf
   ```

   ```
   passwd: compat sss
   group:  compat sss
   shadow: compat sss
   ```

1. 将以下行添加到/etc/pam.d/common-session 以在初始登录时自动创建主目录

   ```
   sudo vi /etc/pam.d/common-session
   ```

   ```
   session optional pam_mkhomedir.so skel=/etc/skel umask=077
   ```

1. 重新引导实例以完成加入域的过程。

   ```
   sudo reboot
   ```

1. 使用任意 SSH 客户端重新连接到实例，验证域加入操作是否已成功完成并完成其他步骤

   1. 确认已在域中注册实例

      ```
      sudo realm list
      ```

      ```
      example.com
        type: kerberos
        realm-name: EXAMPLE.COM
        domain-name: example.com
        configured: kerberos-member
        server-software: active-directory
        client-software: sssd
        required-package: sssd-tools
        required-package: sssd
        required-package: adcli
        required-package: samba-client
        login-formats: %U@example.com
        login-policy: allow-realm-logins
      ```

   1. 验证 SSSD 守护程序的状态

      ```
      systemctl status sssd
      ```

      ```
      sssd.service - System Security Services Daemon
         Loaded: loaded (/usr/lib/systemd/system/sssd.service; enabled; vendor preset: disabled)
         Active: active (running) since Wed 2020-04-15 16:22:32 UTC; 3min 49s ago
       Main PID: 479 (sssd)
          Tasks: 4
         CGroup: /system.slice/sssd.service
                 ├─479 /usr/sbin/sssd -i --logger=files
                 ├─505 /usr/lib/sssd/sssd_be --domain example.com --uid 0 --gid 0 --logger=files
                 ├─548 /usr/lib/sssd/sssd_nss --uid 0 --gid 0 --logger=files
                 └─549 /usr/lib/sssd/sssd_pam --uid 0 --gid 0 --logger=files
      ```

1. 允许用户通过 SSH 和控制台进行访问

   ```
   sudo realm permit join_account@example.com
   ```

   允许通过 SSH 和控制台访问域组

   ```
   sudo realm permit -g 'AWS Delegated Administrators'
   ```

   或者允许所有用户访问

   ```
   sudo realm permit --all
   ```

1. 设置 SSH 服务以允许进行密码身份验证。

   1. 在文本编辑器中打开 `/etc/ssh/sshd_config` 文件。

      ```
      sudo vi /etc/ssh/sshd_config
      ```

   1. 将 `PasswordAuthentication` 设置为 `yes`。

      ```
      PasswordAuthentication yes
      ```

   1. 重新启动 SSH 服务。

      ```
      sudo systemctl restart sshd.service
      ```

      或者：

      ```
      sudo service sshd restart
      ```

1. 13. 实例重新启动后，使用任何 SSH 客户端连接到该实例，然后通过执行以下步骤将 AWS 委派管理员组添加到 sudoers 列表中：

   1. 使用以下命令打开 sudoers 文件：

      ```
      sudo visudo
      ```

   1. 将以下内容添加到 sudoers 文件的底部并保存该文件。

      ```
      ## Add the "Domain Admins" group from the awsad.com domain.
      %AWS\ Delegated\ Administrators@example.com ALL=(ALL) NOPASSWD: ALL
      ```

------
#### [ Ubuntu ]<a name="ubuntu"></a>

1. 使用任何 SSH 客户端连接到实例。

1. 将 Linux 实例配置为使用 Directory Service提供的 DNS 服务器的 DNS 服务器 IP 地址。可以通过在附加到 VPC 的 DHCP 选项集中进行设置，或是通过在实例上手动设置，来执行此操作。如果要手动设置，请参阅 AWS 知识中心的[如何为私有 EC2 实例分配静态 DNS 服务器](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-static-dns-ubuntu-debian/)，以了解有关为特定 Linux 分发版和版本设置持久性 DNS 服务器的指导。

1. 确保您的 Ubuntu - 64 位实例为最新状态。

   ```
   sudo apt-get update
   sudo apt-get -y upgrade
   ```

1. 在 Linux 实例上安装所需的 Ubuntu 程序包。
**注意**  
其中一些程序包可能已安装。  
安装程序包时，可能会遇到几个弹出配置屏幕。通常可以将这些屏幕中的字段保留为空白。

   ```
   sudo apt-get -y install sssd realmd krb5-user samba-common packagekit adcli
   ```

1. 禁用反向 DNS 解析，并将默认领域设置为您的域的 FQDN。Ubuntu 实例在 DNS 中**必须** 可以反向解析，领域才能使用。否则，您必须在 /etc/krb5.conf 中禁用 DNS，如下所示：

   ```
   sudo vi /etc/krb5.conf
   ```

   ```
   [libdefaults]
   default_realm = EXAMPLE.COM
   rdns = false
   ```

1. 使用以下命令将实例加入目录。

   ```
   sudo realm join -U join_account example.com --verbose
   ```  
*join\$1account@example.com*  
域中具有*example.com*域加入权限的帐户的**AMAccount名称**。在出现提示时输入账户的密码。有关委托这些权限的更多信息，请参阅[为托 AWS 管 Microsoft AD 委派目录加入权限](directory_join_privileges.md)。  
*example.com*  
目录的完全限定 DNS 名称。

   ```
   ...
    * Successfully enrolled machine in realm
   ```

1. 设置 SSH 服务以允许进行密码身份验证。

   1. 在文本编辑器中打开 `/etc/ssh/sshd_config` 文件。

      ```
      sudo vi /etc/ssh/sshd_config
      ```

   1. 将 `PasswordAuthentication` 设置为 `yes`。

      ```
      PasswordAuthentication yes
      ```

   1. 重新启动 SSH 服务。

      ```
      sudo systemctl restart sshd.service
      ```

      或者：

      ```
      sudo service sshd restart
      ```

1. 实例重新启动后，使用任何 SSH 客户端连接到该实例，然后通过执行以下步骤将 AWS 委派管理员组添加到 sudoers 列表中：

   1. 使用以下命令打开 `sudoers` 文件：

      ```
      sudo visudo
      ```

   1. 将以下内容添加到 `sudoers` 文件的底部并保存该文件。

      ```
      ## Add the "AWS Delegated Administrators" group from the example.com domain.
      %AWS\ Delegated\ Administrators@example.com ALL=(ALL:ALL) ALL
      ```

      （以上示例使用“\$1<space>”形成 Linux 空格字符。）

------

## 限制账户登录访问
<a name="linux_filter"></a>

因为所有账户都是在 Active Directory 中定义的，因此默认情况下，目录中的所有用户都可以登录该实例。可以在 **sssd.conf** 中使用 **ad\$1access\$1filter** 来仅允许特定用户登录到实例。例如：

```
ad_access_filter = (memberOf=cn=admins,ou=Testou,dc=example,dc=com)
```

*memberOf*  
指示仅当用户是特定组的成员时，才允许他们访问实例。

*cn*  
应具有访问权限的组的通用名称。在此示例中，组名为*admins*。

*ou*  
这是上面的组所在的组织单位。在此示例中，OU 是*Testou*。

*dc*  
这是您的域的域组成部分。在本示例中，*example*。

*dc*  
这是附加域组成部分。在本示例中，*com*。

您必须手动将 **ad\$1access\$1filter** 添加到 **/etc/sssd/sssd.conf**。

在文本编辑器中打开 **/etc/sssd/sssd.conf** 文件。

```
sudo vi /etc/sssd/sssd.conf
```

执行此操作之后，**sssd.conf** 可能类似于下面这样：

```
[sssd]
domains = example.com
config_file_version = 2
services = nss, pam

[domain/example.com]
ad_domain = example.com
krb5_realm = EXAMPLE.COM
realmd_tags = manages-system joined-with-samba
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = True
fallback_homedir = /home/%u@%d
access_provider = ad
ad_access_filter = (memberOf=cn=admins,ou=Testou,dc=example,dc=com)
```

需要重启 sssd 服务配置才能生效：

```
sudo systemctl restart sssd.service
```

或者，您也可以使用：

```
sudo service sssd restart
```

因为所有账户都是在 Active Directory 中定义的，因此默认情况下，目录中的所有用户都可以登录该实例。可以在 **sssd.conf** 中使用 **ad\$1access\$1filter** 来仅允许特定用户登录到实例。

例如：

```
ad_access_filter = (memberOf=cn=admins,ou=Testou,dc=example,dc=com)
```

*memberOf*  
指示仅当用户是特定组的成员时，才允许他们访问实例。

*cn*  
应具有访问权限的组的通用名称。在此示例中，组名为*admins*。

*ou*  
这是上面的组所在的组织单位。在此示例中，OU 是*Testou*。

*dc*  
这是您的域的域组成部分。在本示例中，*example*。

*dc*  
这是附加域组成部分。在本示例中，*com*。

您必须手动将 **ad\$1access\$1filter** 添加到 **/etc/sssd/sssd.conf**。

1. 在文本编辑器中打开 **/etc/sssd/sssd.conf** 文件。

   ```
   sudo vi /etc/sssd/sssd.conf
   ```

1. 执行此操作之后，**sssd.conf** 可能类似于下面这样：

   ```
   [sssd]
   domains = example.com
   config_file_version = 2
   services = nss, pam
   
   [domain/example.com]
   ad_domain = example.com
   krb5_realm = EXAMPLE.COM
   realmd_tags = manages-system joined-with-samba
   cache_credentials = True
   id_provider = ad
   krb5_store_password_if_offline = True
   default_shell = /bin/bash
   ldap_id_mapping = True
   use_fully_qualified_names = True
   fallback_homedir = /home/%u@%d
   access_provider = ad
   ad_access_filter = (memberOf=cn=admins,ou=Testou,dc=example,dc=com)
   ```

1. 需要重启 sssd 服务配置才能生效：

   ```
   sudo systemctl restart sssd.service
   ```

   或者，您也可以使用：

   ```
   sudo service sssd restart
   ```

## ID 映射
<a name="managed-ad-id-mapping"></a>

可以通过两种方法执行 ID 映射，以维护 UNIX/Linux 用户标识符（UID）和组标识符（GID）以及 Windows 和 Active Directory 安全标识符（SID）身份之间的统一体验。这些方法如下：

1. 集中化

1. 分布式

**注意**  
Active Directory 中的集中式用户身份映射需要可移植操作系统接口或 POSIX。

**集中式用户身份映射**  
Active Directory 或其他轻型目录访问协议（LDAP）服务为 Linux 用户提供 UID 和 GID。在 Active Directory 中，如果配置了 POSIX 扩展，这些标识符将存储在用户的属性中：
+ UID：Linux 用户名（字符串）
+ UID 号：Linux 用户 ID 号（整数）
+ GID 号：Linux 组 ID 号（整数）

要将 Linux 实例配置为使用 Active Directory 提供的 UID 和 GID，请在 sssd.conf 文件中设置 `ldap_id_mapping = False`。在设置此值之前，请确认您已向 Active Directory 中的用户和组添加了 UID、UID 号和 GID 号。

**分布式用户身份映射**  
如果 Active Directory 没有 POSIX 扩展名，或者如果您选择不集中管理身份映射，Linux 可以计算 UID 和 GID 值。Linux 使用用户的唯一安全标识符（SID）来保持一致性。

要配置分布式用户 ID 映射，请在 sssd.conf 文件中设置 `ldap_id_mapping = True`。

**常见问题**  
如果设置 `ldap_id_mapping = False`，有时启动 SSSD 服务会失败。此失败的原因是由于更改 UIDs 不支持。建议在每次从 ID 映射更改为 POSIX 属性，或从 POSIX 属性更改为 ID 映射时删除 SSSD 缓存。有关 ID 映射与 ldap\$1id\$1mapping 参数的更多详细信息，请参阅 Linux 命令行中的 sssd-ldap(8) 手册页。

## 连接到 Linux 实例
<a name="linux_connect"></a>

当用户使用 SSH 客户端连接到实例时，系统会提示他们输入用户名。用户可以采用 `username@example.com` 或 `EXAMPLE\username` 格式输入用户名。响应将类似于以下内容，具体取决于您使用的 Linux 发行版：

**Amazon Linux、Red Hat Enterprise Linux 和 CentOS Linux**

```
login as: johndoe@example.com
johndoe@example.com's password:
Last login: Thu Jun 25 16:26:28 2015 from XX.XX.XX.XX
```

**SUSE Linux**

```
SUSE Linux Enterprise Server 15 SP1 x86_64 (64-bit)

As "root" (sudo or sudo -i) use the:
  - zypper command for package management
  - yast command for configuration management

Management and Config: https://www.suse.com/suse-in-the-cloud-basics
Documentation: https://www.suse.com/documentation/sles-15/
Forum: https://forums.suse.com/forumdisplay.php?93-SUSE-Public-Cloud

Have a lot of fun...
```

**Ubuntu Linux**

```
login as: admin@example.com
admin@example.com@10.24.34.0's password:
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-1057-aws x86_64)

* Documentation:  https://help.ubuntu.com
* Management:     https://landscape.canonical.com
* Support:        https://ubuntu.com/advantage

  System information as of Sat Apr 18 22:03:35 UTC 2020

  System load:  0.01              Processes:           102
  Usage of /:   18.6% of 7.69GB   Users logged in:     2
  Memory usage: 16%               IP address for eth0: 10.24.34.1
  Swap usage:   0%
```

# 使用 Winbind 手动将亚马逊 EC2 Linux 实例加入你的 AWS 托管微软 AD 活动目录
<a name="join_linux_instance_winbind"></a>

您可以使用 Winbind 服务将 Amazon EC2 Linux 实例手动加入 AWS Managed Microsoft AD Active Directory 域。这使您现有的本地 Active Directory 用户能够在访问加入您的 AWS 托管 Microsoft AD 活动目录的 Linux 实例时使用其活动目录凭据。支持以下 Linux 实例分发版和版本：
+ Amazon Linux AMI 2018.03.0
+ Amazon Linux 2（64 位 x86）
+ Amazon Linux 2023 AMI
+ Red Hat Enterprise Linux 8 (HVM)（64 位 x86）
+ Ubuntu Server 18.04 LTS 和 Ubuntu Server 16.04 LTS
+ CentOS 7 x86-64
+ SUSE Linux 企业服务器 15 SP1

**注意**  
其他 Linux 分发版和版本可能会正常运行，但未经过测试。

## 将 Linux 实例加入你的 AWS 托管微软 AD 活动目录
<a name="join_linux_winbind_prereq"></a>

**重要**  
以下某些过程如果未正确执行，可能会使实例无法访问或不可用。因此，我们强烈建议在执行这些过程之前对实例创建备份或拍摄快照。

**将 Linux 实例加入目录**  
使用以下选项卡之一对特定 Linux 实例执行步骤：

------
#### [ Amazon Linux/CENTOS/REDHAT ]<a name="amazonlinux"></a>

1. 使用任何 SSH 客户端连接到实例。

1. 配置 Linux 实例以使用 Directory Service提供的 DNS 服务器的 DNS 服务器 IP 地址。可以通过在附加到 VPC 的 DHCP 选项集中进行设置，或是通过在实例上手动设置，来执行此操作。如果您想手动设置，请参阅 AWS 知识中心中的[如何将静态 DNS 服务器分配给私有 Amazon EC2 实例，以](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-static-dns-ubuntu-debian/)获取有关为您的特定 Linux 发行版和版本设置永久 DNS 服务器的指导。

1. 确保 Linux 实例为最新状态。

   ```
   sudo yum -y update
   ```

1. 在 Linux 实例上安装所需 Samba/Winbind 软件包。

   ```
   sudo yum -y install authconfig samba samba-client samba-winbind samba-winbind-clients
   ```

1. 对主 `smb.conf` 文件进行备份，以便在出现任何故障时可以恢复到该文件：

   ```
   sudo cp /etc/samba/smb.conf /etc/samba/smb.bk
   ```

1. 在文本编辑器中打开原始配置文件 [`/etc/samba/smb.conf`]。

   ```
   sudo vim /etc/samba/smb.conf
   ```

   填写 Active Directory 域环境信息，如下例所示：

   ```
   [global]
    workgroup = example
    security = ads
    realm = example.com
    idmap config * : rangesize = 1000000
    idmap config * : range = 1000000-19999999
    idmap config * : backend = autorid
    winbind enum users = no
    winbind enum groups = no
    template homedir = /home/%U@%D
    template shell = /bin/bash
    winbind use default domain = false
   ```

1. 在文本编辑器中打开主机文件 [`/etc/hosts`]。

   ```
   sudo vim /etc/hosts
   ```

   按如下方式添加 Linux 实例私有 IP 地址：

   ```
   10.x.x.x  Linux_hostname.example.com Linux_hostname
   ```
**注意**  
如果您未在 `/etc/hosts` 文件中指定 IP 地址，则在将实例加入域时可能会收到以下 DNS 错误。  
`No DNS domain configured for linux-instance. Unable to perform DNS Update. DNS update failed: NT_STATUS_INVALID_PARAMETER`  
此错误表示加入成功，但是 [net ads] 命令无法在 DNS 中注册 DNS 记录。

1. 使用 net 实用程序将 Linux 实例加入 Active Directory。

   ```
   sudo net ads join -U join_account@example.com
   ```  
*join\$1account@example.com*  
*example.com*网域中具有域加入权限的账户。在出现提示时输入账户的密码。有关委托这些权限的更多信息，请参阅[为托 AWS 管 Microsoft AD 委派目录加入权限](directory_join_privileges.md)。  
*example.com*  
目录的完全限定 DNS 名称。

   ```
   Enter join_account@example.com's password:
   Using short domain name -- example
   Joined 'IP-10-x-x-x' to dns domain 'example.com'
   ```

1. 修改 PAM 配置文件，使用以下命令添加 Winbind 身份验证所需的条目：

   ```
   sudo authconfig --enablewinbind --enablewinbindauth  --enablemkhomedir   --update
   ```

1. 通过修改 `/etc/ssh/sshd_config` 文件设置 SSH 服务以允许进行密码身份验证。

   1. 在文本编辑器中打开 `/etc/ssh/sshd_config` 文件。

      ```
      sudo vi /etc/ssh/sshd_config
      ```

   1. 将 `PasswordAuthentication` 设置为 `yes`。

      ```
      PasswordAuthentication yes
      ```

   1. 重新启动 SSH 服务。

      ```
      sudo systemctl restart sshd.service
      ```

      或者：

      ```
      sudo service sshd restart
      ```

1. 重新启动实例之后，使用任何 SSH 客户端连接到它，然后通过执行以下步骤将要为域用户或组授予的根权限添加到 sudoers 列表：

   1. 使用以下命令打开 `sudoers` 文件：

      ```
      sudo visudo
      ```

   1. 按如下方式从信任或可信域中添加所需的组或用户，然后将其保存。

      ```
      ## Adding Domain Users/Groups.
      %domainname\\AWS\ Delegated\ Administrators ALL=(ALL:ALL) ALL
      %domainname\\groupname ALL=(ALL:ALL) ALL
      domainname\\username ALL=(ALL:ALL) ALL
      %Trusted_DomainName\\groupname ALL=(ALL:ALL) ALL
      Trusted_DomainName\\username ALL=(ALL:ALL) ALL
      ```

      （以上示例使用“\$1<space>”形成 Linux 空格字符。）

------
#### [ SUSE ]<a name="suse"></a>

1. 使用任何 SSH 客户端连接到实例。

1. 配置 Linux 实例以使用 Directory Service提供的 DNS 服务器的 DNS 服务器 IP 地址。可以通过在附加到 VPC 的 DHCP 选项集中进行设置，或是通过在实例上手动设置，来执行此操作。如果您想手动设置，请参阅 AWS 知识中心中的[如何将静态 DNS 服务器分配给私有 Amazon EC2 实例，以](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-static-dns-ubuntu-debian/)获取有关为您的特定 Linux 发行版和版本设置永久 DNS 服务器的指导。

1. 确保您的 SUSE Linux 15 实例为最新状态。

   1. 连接程序包存储库。

      ```
      sudo SUSEConnect -p PackageHub/15.1/x86_64
      ```

   1. 更新 SUSE。

      ```
      sudo zypper update -y
      ```

1. 在 Linux 实例上安装所需 Samba/Winbind 软件包。

   ```
   sudo zypper in -y samba samba-winbind
   ```

1. 对主 `smb.conf` 文件进行备份，以便在出现任何故障时可以恢复到该文件：

   ```
   sudo cp /etc/samba/smb.conf /etc/samba/smb.bk
   ```

1. 在文本编辑器中打开原始配置文件 [`/etc/samba/smb.conf`]。

   ```
   sudo vim /etc/samba/smb.conf
   ```

   填写 Active Directory 域环境信息，如下例所示：

   ```
   [global]
    workgroup = example
    security = ads
    realm = example.com
    idmap config * : rangesize = 1000000
    idmap config * : range = 1000000-19999999
    idmap config * : backend = autorid
    winbind enum users = no
    winbind enum groups = no
    template homedir = /home/%U@%D
    template shell = /bin/bash
    winbind use default domain = false
   ```

1. 在文本编辑器中打开主机文件 [`/etc/hosts`]。

   ```
   sudo vim /etc/hosts
   ```

   按如下方式添加 Linux 实例私有 IP 地址：

   ```
   10.x.x.x  Linux_hostname.example.com Linux_hostname
   ```
**注意**  
如果您未在 `/etc/hosts` 文件中指定 IP 地址，则在将实例加入域时可能会收到以下 DNS 错误。  
`No DNS domain configured for linux-instance. Unable to perform DNS Update. DNS update failed: NT_STATUS_INVALID_PARAMETER`  
此错误表示加入成功，但是 [net ads] 命令无法在 DNS 中注册 DNS 记录。

1. 使用以下命令将 Linux 实例加入目录。

   ```
   sudo net ads join -U join_account@example.com
   ```  
*join\$1account*  
具有域加入权限的*example.com*域中的 s AMAccount 名称。在出现提示时输入账户的密码。有关委托这些权限的更多信息，请参阅[为托 AWS 管 Microsoft AD 委派目录加入权限](directory_join_privileges.md)。  
*example.com*  
目录的完全限定 DNS 名称。

   ```
   Enter join_account@example.com's password:
   Using short domain name -- example
   Joined 'IP-10-x-x-x' to dns domain 'example.com'
   ```

1. 修改 PAM 配置文件，使用以下命令添加 Winbind 身份验证所需的条目：

   ```
   sudo pam-config --add --winbind --mkhomedir
   ```

1. 在文本编辑器中打开 Name Service Switch 配置文件 [`/etc/nsswitch.conf`]。

   ```
   vim /etc/nsswitch.conf
   ```

   添加 Winbind 指令，如下所示。

   ```
   passwd: files winbind
   shadow: files winbind
   group:  files winbind
   ```

1. 通过修改 `/etc/ssh/sshd_config` 文件设置 SSH 服务以允许进行密码身份验证。

   1. 在文本编辑器中打开 `/etc/ssh/sshd_config` 文件。

      ```
      sudo vim /etc/ssh/sshd_config
      ```

   1. 将 `PasswordAuthentication` 设置为 `yes`。

      ```
      PasswordAuthentication yes
      ```

   1. 重新启动 SSH 服务。

      ```
      sudo systemctl restart sshd.service
      ```

      或者：

      ```
      sudo service sshd restart
      ```

1. 重新启动实例之后，使用任何 SSH 客户端连接到它，然后通过执行以下步骤将要为域用户或组授予的根权限添加到 sudoers 列表：

   1. 使用以下命令打开 `sudoers` 文件：

      ```
      sudo visudo
      ```

   1. 按如下方式从信任或可信域中添加所需的组或用户，然后将其保存。

      ```
      ## Adding Domain Users/Groups.
      %domainname\\AWS\ Delegated\ Administrators ALL=(ALL:ALL) ALL
      %domainname\\groupname ALL=(ALL:ALL) ALL
      domainname\\username ALL=(ALL:ALL) ALL
      %Trusted_DomainName\\groupname ALL=(ALL:ALL) ALL
      Trusted_DomainName\\username ALL=(ALL:ALL) ALL
      ```

      （以上示例使用“\$1<space>”形成 Linux 空格字符。）

------
#### [ Ubuntu ]<a name="ubuntu"></a>

1. 使用任何 SSH 客户端连接到实例。

1. 配置 Linux 实例以使用 Directory Service提供的 DNS 服务器的 DNS 服务器 IP 地址。可以通过在附加到 VPC 的 DHCP 选项集中进行设置，或是通过在实例上手动设置，来执行此操作。如果您想手动设置，请参阅 AWS 知识中心中的[如何将静态 DNS 服务器分配给私有 Amazon EC2 实例，以](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-static-dns-ubuntu-debian/)获取有关为您的特定 Linux 发行版和版本设置永久 DNS 服务器的指导。

1. 确保 Linux 实例为最新状态。

   ```
   sudo apt-get -y upgrade
   ```

1. 在 Linux 实例上安装所需 Samba/Winbind 软件包。

   ```
   sudo apt -y install samba winbind libnss-winbind libpam-winbind
   ```

1. 对主 `smb.conf` 文件进行备份，以便在出现任何故障时可以恢复到该文件：

   ```
   sudo cp /etc/samba/smb.conf /etc/samba/smb.bk
   ```

1. 在文本编辑器中打开原始配置文件 [`/etc/samba/smb.conf`]。

   ```
   sudo vim /etc/samba/smb.conf
   ```

   填写 Active Directory 域环境信息，如下例所示：

   ```
   [global]
    workgroup = example
    security = ads
    realm = example.com
    idmap config * : rangesize = 1000000
    idmap config * : range = 1000000-19999999
    idmap config * : backend = autorid
    winbind enum users = no
    winbind enum groups = no
    template homedir = /home/%U@%D
    template shell = /bin/bash
    winbind use default domain = false
   ```

1. 在文本编辑器中打开主机文件 [`/etc/hosts`]。

   ```
   sudo vim /etc/hosts
   ```

   按如下方式添加 Linux 实例私有 IP 地址：

   ```
   10.x.x.x  Linux_hostname.example.com Linux_hostname
   ```
**注意**  
如果您未在 `/etc/hosts` 文件中指定 IP 地址，则在将实例加入域时可能会收到以下 DNS 错误。  
`No DNS domain configured for linux-instance. Unable to perform DNS Update. DNS update failed: NT_STATUS_INVALID_PARAMETER`  
此错误表示加入成功，但是 [net ads] 命令无法在 DNS 中注册 DNS 记录。

1. 使用 net 实用程序将 Linux 实例加入 Active Directory。

   ```
   sudo net ads join -U join_account@example.com
   ```  
*join\$1account@example.com*  
*example.com*网域中具有域加入权限的账户。在出现提示时输入账户的密码。有关委托这些权限的更多信息，请参阅[为托 AWS 管 Microsoft AD 委派目录加入权限](directory_join_privileges.md)。  
*example.com*  
目录的完全限定 DNS 名称。

   ```
   Enter join_account@example.com's password:
   Using short domain name -- example
   Joined 'IP-10-x-x-x' to dns domain 'example.com'
   ```

1. 修改 PAM 配置文件，使用以下命令添加 Winbind 身份验证所需的条目：

   ```
   sudo pam-auth-update --add --winbind --enable mkhomedir
   ```

1. 在文本编辑器中打开 Name Service Switch 配置文件 [`/etc/nsswitch.conf`]。

   ```
   vim /etc/nsswitch.conf
   ```

   添加 Winbind 指令，如下所示。

   ```
   passwd: compat winbind
   group:  compat winbind
   shadow: compat winbind
   ```

1. 通过修改 `/etc/ssh/sshd_config` 文件设置 SSH 服务以允许进行密码身份验证。

   1. 在文本编辑器中打开 `/etc/ssh/sshd_config` 文件。

      ```
      sudo vim /etc/ssh/sshd_config
      ```

   1. 将 `PasswordAuthentication` 设置为 `yes`。

      ```
      PasswordAuthentication yes
      ```

   1. 重新启动 SSH 服务。

      ```
      sudo systemctl restart sshd.service
      ```

      或者：

      ```
      sudo service sshd restart
      ```

1. 重新启动实例之后，使用任何 SSH 客户端连接到它，然后通过执行以下步骤将要为域用户或组授予的根权限添加到 sudoers 列表：

   1. 使用以下命令打开 `sudoers` 文件：

      ```
      sudo visudo
      ```

   1. 按如下方式从信任或可信域中添加所需的组或用户，然后将其保存。

      ```
      ## Adding Domain Users/Groups.
      %domainname\\AWS\ Delegated\ Administrators ALL=(ALL:ALL) ALL
      %domainname\\groupname ALL=(ALL:ALL) ALL
      domainname\\username ALL=(ALL:ALL) ALL
      %Trusted_DomainName\\groupname ALL=(ALL:ALL) ALL
      Trusted_DomainName\\username ALL=(ALL:ALL) ALL
      ```

      （以上示例使用“\$1<space>”形成 Linux 空格字符。）

------

## 连接到 Linux 实例
<a name="linux_winbind_connect"></a>

当用户使用 SSH 客户端连接到实例时，系统会提示他们输入用户名。用户可以采用 `username@example.com` 或 `EXAMPLE\username` 格式输入用户名。响应将类似于以下内容，具体取决于您使用的 Linux 发行版：

**Amazon Linux、Red Hat Enterprise Linux 和 CentOS Linux**

```
login as: johndoe@example.com
johndoe@example.com's password:
Last login: Thu Jun 25 16:26:28 2015 from XX.XX.XX.XX
```

**SUSE Linux**

```
SUSE Linux Enterprise Server 15 SP1 x86_64 (64-bit)

As "root" (sudo or sudo -i) use the:
  - zypper command for package management
  - yast command for configuration management

Management and Config: https://www.suse.com/suse-in-the-cloud-basics
Documentation: https://www.suse.com/documentation/sles-15/
Forum: https://forums.suse.com/forumdisplay.php?93-SUSE-Public-Cloud

Have a lot of fun...
```

**Ubuntu Linux**

```
login as: admin@example.com
admin@example.com@10.24.34.0's password:
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-1057-aws x86_64)

* Documentation:  https://help.ubuntu.com
* Management:     https://landscape.canonical.com
* Support:        https://ubuntu.com/advantage

  System information as of Sat Apr 18 22:03:35 UTC 2020

  System load:  0.01              Processes:           102
  Usage of /:   18.6% of 7.69GB   Users logged in:     2
  Memory usage: 16%               IP address for eth0: 10.24.34.1
  Swap usage:   0%
```