

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

# 手动将 Amazon EC2 Linux 实例加入 Simple AD Active Directory
<a name="simple_ad_join_linux_instance"></a>

除 Amazon EC2 Windows 实例外，您还可以将特定 Amazon EC2 Linux 实例加入 Simple AD Active Directory。支持以下 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 分发版和版本可能会正常运行，但未经过测试。

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

必须先按照 [将 Amazon EC2 Linux 实例无缝加入 Simple AD Active Directory](simple_ad_seamlessly_join_linux_instance.md) 中指定的步骤启动实例，然后才能将 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 客户端连接到它，然后通过执行以下步骤将域管理员组添加到 sudoers 列表：

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

      ```
      sudo visudo
      ```

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

      ```
      ## Add the "Domain Admins" group from the example.com domain.
      %Domain\ Admins@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 客户端连接到它，然后通过执行以下步骤将域管理员组添加到 sudoers 列表：

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

      ```
      sudo visudo
      ```

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

      ```
      ## Add the "Domain Admins" group from the example.com domain.
      %Domain\ Admins@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 客户端连接到它，然后通过执行以下步骤将域管理员组添加到 sudoers 列表：

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

      ```
      sudo visudo
      ```

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

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

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

------
#### [ 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 客户端连接到它，然后通过执行以下步骤将域管理员组添加到 sudoers 列表：

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

      ```
      sudo visudo
      ```

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

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

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

------

**注意**  
使用 Simple AD 时，如果在 Linux 实例上创建用户账户时使用了“强制用户在首次登录时更改密码”选项，则该用户无法使用 **kpasswd** 首次更改其密码。要首次更改密码，域管理员必须使用 Active Directory 管理工具更新用户密码。

## 通过 Linux 实例管理账户
<a name="simple_ad_manage_accounts"></a>

要通过 Linux 实例管理 Simple AD 中的账户，您必须更新您的 Linux 实例上的特定配置文件，如下所示：

1. ****在 /.conf 文件中将 **krb5\$1use\$1kdcin** fo 设置为 False。etc/sssd/sssd****例如：

   ```
   [domain/example.com]
       krb5_use_kdcinfo = False
   ```

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

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

   或者，您也可以使用：

   ```
   $ sudo service sssd start
   ```

1. 如果您将通过 CentOS Linux 实例管理用户，还必须编辑文件 **/etc/smb.conf** 以包括：

   ```
   [global] 
     workgroup = EXAMPLE.COM
     realm = EXAMPLE.COM 
     netbios name = EXAMPLE
     security = ads
   ```

## 限制账户登录访问
<a name="simple_ad_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
```

## ID 映射
<a name="simple-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="simple_ad_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%
```