第 1 章 使用 SSSD 将 RHEL 系统直接连接到 AD

这部分论述了使用系统安全性服务守护进程(SSSD)将 RHEL 系统连接到 Active Directory(AD)。您需要两个组件才能将 RHEL 系统连接到 Active Directory(AD)。一个组件 SSSD 与中央身份和验证源交互,其他组件 realmd 会检测可用的域并配置底层 RHEL 系统服务(本例中为 SSSD),以连接到域。

1.1. 使用 SSSD 直接集成概述

您可以使用 SSSD 访问用户目录用于身份验证和授权,并通过带有用户缓存的通用框架进以允许离线登录。SSSD 是高度可配置的,它提供了可插拔的身份验证模块(PAM)和名称交换服务(NSS)集成,以及一个用于存储本地用户的数据库以及从中央服务器获取的扩展用户数据。在把 RHEL 系统与以下身份服务器类型之一连接时,推荐使用 SSSD:

  • Active Directory
  • RHEL 中的身份管理(IdM)
  • 任何通用 LDAP 或 Kerberos 服务器
注意

默认情况下,与 SSSD 直接集成只能在单个 AD 林中正常工作。

配置 SSSD 以将 Linux 系统直接与 AD 集成的最便捷方法是使用 realmd 服务。它允许调用者以标准的方式配置网络身份验证和域成员资格。realmd 服务自动发现有关可访问 domain 和 realm 的信息,且不需要高级配置就可以加入到 domain 和 realm。

您可以使用 SSSD 与 AD 进行直接和间接集成,并允许您从一个集成方法切换到另一个集成方法。直接集成是将 RHEL 系统引入 AD 环境的简单方法。但是,当 RHEL 系统的比例增加时,您的部署通常需要更好地集中管理与身份相关的策略,如基于主机的访问控制、sudo 或 SELinux 用户映射。在初始阶段,您可以在本地配置文件中维护 RHEL 系统的这些配置。但是,在有大量系统的情况下,使用一个置备系统(如 Red Hat Satellite)可以使对配置文件进行分发和管理的任务变得更为容易。当直接集成不再可以满足环境扩展的要求时,应该考虑使用间接集成。有关从直接集成(RHEL 客户端位于 AD 域中)到间接集成(带有信任到 AD 的 IdM)的更多信息,请参阅将 RHEL 客户端从 AD 域移动到 IdM 服务器。

有关哪些类型的集成与您的用例匹配的更多信息,请参阅间接集成和直接集成

其它资源

  • realm(8) man page。
  • sssd-ad(5) man page。
  • sssd(8) man page。

1.2. 支持直接集成的 Windows 平台

您可以直接将 RHEL 系统与使用以下林和域功能级别的 Active Directory 网站集成:

  • 林功能级别范围:Windows Server 2008 - Windows 服务器 2016
  • 域功能级别范围:Windows Server 2008 - Windows 服务器 2016

在以下支持的操作系统中测试了直接集成:

  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2
注意

Windows Server 2019 没有引入新的功能级别。Windows Server 2019 使用最高功能级别是 Windows Server 2016。

1.3. 确保支持 AD 和 RHEL 中的通用加密类型

SSSD 默认支持 RC4、AES-128 和 AES-256 Kerberos 加密类型。

RHEL 8 中弃用并默认禁用 RC4 加密,因为它被视为没有较新的 AES-128 和 AES-256 加密类型安全。而 Active Directory(AD)用户凭证和 AD 域之间的信任支持 RC4 加密,且可能不支持 AES 加密类型。

如果没有通用加密类型,RHEL 主机和 AD 域间的通信可能无法正常工作,或者有些 AD 帐户可能无法验证。要避免这种情况,请修改以下配置之一:

  • 在 Active Directory 中启用 AES 加密支持(推荐的选项):要确保 AD 林支持强大的 AES 加密类型中的 AD 域相互信任 ,请查看以下 Microsoft 文章 AD DS: Security: Kerberos "Unsupported etype" error when access a trusted domain 中
  • RHEL 中启用 RC4 支持:在进行针对 AD 域控制器身份验证的每个 RHEL 主机上:

    1. 除了 DEFAULT 加密策略外,使用 update-crypto-policies 命令还启用 AD-SUPPORT 加密子策略。

      [root@host ~]# update-crypto-policies --set DEFAULT:AD-SUPPORT
      Setting system policy to DEFAULT:AD-SUPPORT
      Note: System-wide crypto policies are applied on application start-up.
      It is recommended to restart the system for the change of policies
      to fully take place.
    2. 重启主机。
重要

AD-SUPPORT 加密子策略仅适用于 RHEL 8.3 及更新的版本。

  • 要在 RHEL 8.2 中启用对 RC4 的支持,请使用 cipher = RC4-128+ 创建并启用自定义加密模块策略。如需了解更多详细信息,请参阅使用 policy modifiers 自定义系统范围的加密策略
  • 要在 RHEL 8.0 和 RHEL 8.1 中启用对 RC4 的支持,请将 +rc4 添加到 /etc/crypto-policies/back-ends/krb5.config 文件的 permitted_enctypes 选项中:

    [libdefaults]
    permitted_enctypes = aes256-cts-hmac-sha1-96 aes256-cts-hmac-sha384-192 camellia256-cts-cmac aes128-cts-hmac-sha1-96 aes128-cts-hmac-sha256-128 camellia128-cts-cmac +rc4

其它资源

1.4. 直接连接到 AD

本节论述了如何使用 ID 映射或 POSIX 属性直接与 AD 集成。

1.4.1. 使用 SSSD 发现并加入 AD 域

这个步骤描述了如何发现 AD 域并使用 SSSD 将 RHEL 系统连接到那个域。

先决条件

  • 确保 RHEL 主机上的以下端口已为 AD 域控制器打开并可以被访问。

    表 1.1. 使用 SSSD 将 Linux 系统直接集成到 AD 所需的端口

    服务端口协议备注

    DNS

    53

    UDP 和 TCP

     

    LDAP

    389

    UDP 和 TCP

     

    Kerberos

    88

    UDP 和 TCP

     

    Kerberos

    464

    UDP 和 TCP

    kadmin 用来设置和更改密码

    LDAP 全局目录

    3268

    TCP

    如果使用 id_provider = ad 选项

    NTP

    123

    UDP

    可选

  • 确保您为 DNS 使用 AD 域控制器服务器。
  • 验证两个系统中的系统时间已被同步。这样可确保 Kerberos 正常工作。

流程

  1. 安装以下软件包:

    # yum install realmd oddjob oddjob-mkhomedir sssd adcli krb5-workstation
  2. 要显示特定域的信息,请运行 realm discover 并添加您要发现的域名称:

    # realm discover ad.example.com
    ad.example.com
      type: kerberos
      realm-name: AD.EXAMPLE.COM
      domain-name: ad.example.com
      configured: no
      server-software: active-directory
      client-software: sssd
      required-package: oddjob
      required-package: oddjob-mkhomedir
      required-package: sssd
      required-package: adcli
      required-package: samba-common

    realmd 系统使用 DNS SRV 查找自动查找这个域中的域控制器。

    注意

    realmd 系统可以发现 Active Directory 和 Identity Management 域。如果您的环境中存在这两个域,您可以使用 --server-software=active-directory 选项将发现结果限制为特定类型的服务器。

  3. 使用 realm join 命令配置本地 RHEL 系统。realmd 套件自动编辑所有必需的配置文件。例如,对于名为 ad.example.com 的域:

    # realm join ad.example.com

验证步骤

  • 显示 AD 用户详情,如管理员用户:

    # getent passwd administrator@ad.example.com
    administrator@ad.example.com:*:1450400500:1450400513:Administrator:/home/administrator@ad.example.com:/bin/bash

其它资源

  • 请查看 realm(8) man page。
  • 请查看 nmcli(1) man page。

1.4.2. 用于与 AD 集成的选项: 使用 ID 映射或 POSIX 属性

Linux 和 Windows 系统为用户和组群使用不同的标识符:

  • Linux 使用 用户 ID(UID)和 组群 ID(GID)。请参阅 配置基本系统设置中的 管理用户和组群帐户简介 。Linux UID 和 GID 符合 POSIX 标准。
  • Windows 使用 安全 ID (SID)。
重要

将 RHEL 系统连接到 AD 后,您可以使用 AD 用户名和密码进行身份验证。不要创建与 Windows 用户名称相同的 Linux 用户,因为重复的名称可能会导致冲突并中断验证过程。

要以 AD 用户身份验证 RHEL 系统,您必须分配了 UID 和 GID。SSSD 提供了使用 ID 映射或 POSIX 属性与 AD 集成的选项。默认是使用 ID 映射。

1.4.2.1. 为 AD 用户自动生成新的 UID 和 GID

SSSD 可以使用 AD 用户的 SID 在名为 ID 映射的过程中以算法生成 POSIX ID。ID 映射会在 AD 中的 SID 和 Linux 中的 ID 之间创建一个映射。

  • 当 SSSD 检测到新的 AD 域时,它会为新域分配一系列可用 ID。
  • 当 AD 用户首次登录到 SSSD 客户端机器时,SSSD 在 SSSD 缓存中为用户创建一个条目,包括基于用户 SID 的 UID 和那个域的 ID 范围。
  • 由于 AD 用户的 ID 是由同一 SID 一致生成的,所以用户在登录到任何 Red Hat Enterprise Linux 系统时具有相同的 UID 和 GID。

请参阅使用 SSSD 发现并加入 AD 域

注意

当所有客户端系统都使用 SSSD 将 SID 映射到 Linux ID 时,映射是一致的。如果有些客户端使用不同的软件,请选择以下之一:

  • 确定所有客户端都使用相同的映射算法。
  • 使用 AD 中定义的显式 POSIX 属性。

1.4.2.2. 使用 AD 中定义的 POSIX 属性

AD 可以创建并存储 POSIX 属性,如 uidNumbergidNumberunixHomeDirectoryloginShell

当使用上述 ID 映射时,SSSD 会创建新 UID 和 GID,这会覆盖 AD 中定义的值。要保留 AD 定义的值,必须在 SSSD 中禁用 ID 映射。

请参阅 使用 Active Directory 中定义的 POSIX 属性连接到 AD

1.4.3. 使用 Active Directory 中定义的 POSIX 属性连接到 AD

为获得最佳性能,请向 AD 全局目录发布 POSIX 属性。如果全局目录中没有 POSIX 属性,SSSD 会直接连接到 LDAP 端口上的单个域控制器。

先决条件

  • 确保 RHEL 主机上的以下端口已为 AD 域控制器打开并可以被访问。

    表 1.2. 使用 SSSD 将 Linux 系统直接集成到 AD 所需的端口

    服务端口协议备注

    DNS

    53

    UDP 和 TCP

     

    LDAP

    389

    UDP 和 TCP

     

    Kerberos

    88

    UDP 和 TCP

     

    Kerberos

    464

    UDP 和 TCP

    kadmin 用来设置和更改密码

    LDAP 全局目录

    3268

    TCP

    如果使用 id_provider = ad 选项

    NTP

    123

    UDP

    可选

  • 确保您为 DNS 使用 AD 域控制器服务器。
  • 验证两个系统中的系统时间已被同步。这样可确保 Kerberos 正常工作。

流程

  1. 安装以下软件包:

    # yum install realmd oddjob oddjob-mkhomedir sssd adcli krb5-workstation
  2. 使用带 --automatic-id-mapping=no 选项的 realm join 命令配置禁用了 ID 映射的本地 RHEL 系统。realmd 套件自动编辑所有必需的配置文件。例如,对于名为 ad.example.com 的域:

    # realm join --automatic-id-mapping=no ad.example.com
  3. 如果您已经加入某个域,可以在 SSSD 中手动禁用 ID 映射:

    1. 打开 /etc/sssd/sssd.conf 文件。
    2. 在 AD 域部分,添加 ldap_id_mapping = false 设置。
    3. 删除 SSSD 缓存:

      rm -f /var/lib/sss/db/*
    4. 重启 SSSD:

      systemctl restart sssd

SSSD 现在使用 AD 中的 POSIX 属性,而不是在本地创建它们。

注意

您必须为 AD 中用户配置了相关的 POSIX 属性(uidNumbergidNumberunixHomeDirectoryloginShell)。

验证步骤

  • 显示 AD 用户详情,如管理员用户:

    # getent passwd administrator@ad.example.com
    administrator@ad.example.com:*:10000:10000:Administrator:/home/Administrator:/bin/bash

其它资源

  • 有关 ID 映射和 ldap_id_mapping 参数的详情,请查看 sssd-ldap(8) man page。

1.4.4. 使用 SSSD 连接到不同 AD 林中的多个域

这个步骤描述了加入和身份验证不同林中的多个 Active Directory(AD)域,它们之间没有信任。

这个示例描述了加入两个域 addomain1.comaddomain2.com。使用 realmd 加入第一个域,并为那个域自动配置 SSSD、Kerberos 和其他工具。使用 adcli 加入附加域,并手动编辑配置文件使其包含这些域。

先决条件

  • 确保 RHEL 主机上的以下端口已为 AD 域控制器打开并可以被访问。

    表 1.3. 使用 SSSD 将 Linux 系统直接集成到 AD 所需的端口

    服务端口协议备注

    DNS

    53

    UDP 和 TCP

     

    LDAP

    389

    UDP 和 TCP

     

    Kerberos

    88

    UDP 和 TCP

     

    Kerberos

    464

    UDP 和 TCP

    kadmin 用来设置和更改密码

    LDAP 全局目录

    3268

    TCP

    如果使用 id_provider = ad 选项

    NTP

    123

    UDP

    可选

  • 确保您为 DNS 使用 AD 域控制器服务器。
  • 验证两个系统中的系统时间已被同步。这样可确保 Kerberos 正常工作。
  • 确保在每个 AD 域中都有 AD 管理员帐户的凭证,该帐户有权将机器加入到那个域中

流程

  1. 安装所需的软件包。

    # yum install sssd realmd adcli samba-common-tools oddjob oddjob-mkhomedir
  2. 使用 realmd 加入第一个 AD 域 addomain1.com

    # realm join ADDOMAIN1.COM
  3. 将系统 keytab 重命名为唯一名称。

    # mv /etc/krb5.keytab /etc/addomain1.com.krb5.keytab
  4. 使用 adcli 加入第二个 AD 域,以及任何附加域。使用 -K 选项为 Kerberos keytab 指定要编写主机凭证的唯一路径。

    # adcli join -D dc2.addomain2.com -K /etc/addomain2.com.krb5.keytab
  5. 修改 /etc/krb5.conf

    • 添加 includedir 选项以包含 SSSD 配置文件。
    • 使用 dns_lookup_kdc 选项为 AD Domain Controller 启用 DNS 查找。

      includedir /var/lib/sss/pubconf/krb5.include.d/
      
      [logging]
       default = FILE:/var/log/krb5libs.log
       kdc = FILE:/var/log/krb5kdc.log
       admin_server = FILE:/var/log/kadmind.log
      
      [libdefaults]
       default_realm = ADDOMAIN1.COM
       dns_lookup_realm = false
       dns_lookup_kdc = true
       ticket_lifetime = 24h
       renew_lifetime = 7d
       forwardable = true
      
      ...
  6. 修改 /etc/sssd/sssd.conf 以包含正在使用的所有 AD 域的信息。

    [sssd]
    services = nss, pam
    config_file_version = 2
    domains = addomain1.com, addomain2.com
    
    [domain/addomain1.com]
    id_provider = ad
    access_provider = ad
    krb5_keytab = /etc/addomain1.com.krb5.keytab
    ldap_krb5_keytab = /etc/addomain1.com.krb5.keytab
    ad_server = dc1.addomain1.com
    ad_maximum_machine_account_password_age = 0
    use_fully_qualified_names = true
    default_shell=/bin/bash
    override_homedir=/home/%d/%u
    
    [domain/addomain2.com]
    id_provider = ad
    access_provider = ad
    krb5_keytab = /etc/addomain2.com.krb5.keytab
    ldap_krb5_keytab = /etc/addomain2.com.krb5.keytab
    ad_server = dc2.addomain2.com
    ad_maximum_machine_account_password_age = 0
    use_fully_qualified_names = true
    default_shell=/bin/bash
    override_homedir=/home/%d/%u
    
    [nss]
    
    [pam]
    • 对于每个 domain 部分,指定与 krb5_keytabldap_krb5_keytab 选项对应的 Kerberos keytab 的路径。
    • 设置 ad_maximum_machine_account_password_age = 0 以禁用更新主机 Kerberos 密钥。
    • 设置 use_fully_qualified_names = true 以区分不同域的用户。
    • 设置 override_homedir = /home/%d/%u,使来自不同域(%d)的用户(%u)都会获得唯一的主目录。例如:用户 linuxuser@addomain1.com 的主目录是 /home/addomain1.com/linuxuser
  7. SSH 从系统密钥 b 中检索主机密钥,并通过 GSSAPI/Kerberos 提供单一登录功能。如果您想使用单点登录,将所有当前的 Kerberos 主机密钥复制到 /etc/kbr5.keytab 系统密钥。

    # ktutil
    ktutil:  rkt /etc/addomain1.com.krb5.keytab
    ktutil:  rkt /etc/addomain2.com.krb5.keytab
    ktutil:  wkt /etc/krb5.keytab
  8. 重启并启用 SSSD 服务。

    # systemctl restart sssd
    # systemctl enable sssd

验证步骤

  1. 显示来自每个 AD 域的用户详情:

    # id administrator@addomain1.com
    uid=1240800500(administrator@addomain1.com) gid=1240800513(domain users@addomain1.com) groups=1240800513(domain users@addomain1.com),1240800512(domain admins@addomain1.com),1240800518(schema admins@addomain1.com),1240800520(group policy creator owners@addomain1.com),1240800572(denied rodc password replication group@addomain1.com),1240800519(enterprise admins@addomain1.com)
    
    # id administrator@addomain2.com
    uid=1013800500(administrator@addomain2.com) gid=1013800500(administrator@addomain2.com) groups=1013800500(administrator@addomain2.com),1013800513(domain users@addomain2.com)
  2. 以来自每个域的用户身份登录,验证为该用户创建了正确的主目录。

    # ssh administrator@addomain1.com@localhost
    administrator@addomain1.com@localhost's password:
    Creating directory '/home/addomain1.com/administrator'.
    
    $ pwd
    /home/addomain1.com/administrator
    # ssh administrator@addomain2.com@localhost
    administrator@addomain2.com@localhost's password:
    Creating directory '/home/addomain2.com/administrator'.
    
    $ pwd
    /home/addomain2.com/administrator

1.5. AD 供应商如何处理动态 DNS 更新

Active Directory(AD)通过超时(aging)和删除(scavenging)不活跃的记录来主动维护 DNS 记录。

默认情况下,SSSD 服务会按照以下间隔刷新 RHEL 客户端的 DNS 记录:

  • 身份提供程序每次上线时。
  • 每次 RHEL 系统重启时。
  • /etc/sssd/sssd.conf 配置文件中的 dyndns_refresh_interval 选项指定的时间间隔。默认值为 86400 秒(24 小时)。

    注意

    如果您将 dyndns_refresh_interval 选项设置为与 DHCP 租期相同的间隔,您可以在 IP 租期被续订后更新 DNS 记录。

SSSD 使用 Kerberos/GSSAPI 为 DNS(GSS-TSIG)向 AD 服务器发送动态 DNS 更新。这意味着您只需要启用到 AD 的安全连接。

其它资源

  • sssd-ad(5) man page。

1.6. 修改 AD 供应商的动态 DNS 设置

以下流程调整 SSSD 服务中的设置,以影响如何自动更新已加入 Active Directory 环境的 RHEL 主机的 DNS 记录。

先决条件

  • 您已使用 SSSD 服务将 RHEL 主机加入到 Active Directory 环境。
  • 您需要 root 权限来编辑 /etc/sssd/sssd.conf 配置文件。

流程

  1. 在文本编辑器中打开 /etc/sssd/sssd.conf 配置文件。
  2. 为您的 AD 域的 [domain] 部分添加以下选项,将 DNS 记录刷新间隔设置为 12 小时,禁用更新 PTR 记录,并将 DNS 记录时间到 Live(TTL)设置为 1 小时。

    [domain/ad.example.com]
    id_provider = ad
    ...
    dyndns_refresh_interval = 43200
    dyndns_update_ptr = false
    dyndns_ttl = 3600
  3. 保存并关闭 /etc/sssd/sssd.conf 配置文件。
  4. 重启 SSSD 服务以载入配置更改。

    [root@client ~]# systemctl restart sssd
注意

您可以通过将 sssd.conf 文件中的 dyndns_update 选项设置为 false 来禁用动态 DNS 更新:

[domain/ad.example.com]
id_provider = ad
...

dyndns_update = false

其它资源

  • sssd-ad(5) man page

1.7. AD 供应商如何处理可信域

本节论述了,如果在 /etc/sssd/sssd.conf 配置文件中设置了 id_provider = ad 选项,SSSD 如何处理可信域。

  • SSSD 只支持单个 AD 林中的域。如果 SSSD 需要从多个林访问多个域,请考虑使用带有信任的 IPA(首选方式)或 winbindd 服务,而不是 SSSD。
  • 默认情况下,SSSD 会发现林中的所有域,并在可信域中对象请求到达时,SSSD 会尝试解决这个问题。

    如果可信域无法访问或其地理距离非常遥远,这使得它们的速度较慢,您可以在 /etc/sssd/sssd.conf 中设置 ad_enabled_domains 参数来限制 SSSD 解析对象。

  • 默认情况下,您必须使用完全限定的用户名从可信域解析用户。

其它资源

  • sssd.conf(5) man page。

1.8. realm 命令

realmd 系统有两个主要任务:

  • 在一个域中管理系统注册。
  • 控制允许哪些域用户访问本地系统资源。

realmd 中,使用命令行工具 realm 运行命令。大多数 realm 命令要求用户指定该工具应执行的操作,以及执行操作的实体,如域或用户帐户。

表 1.4. realmd 命令

命令描述

realm 命令

discover

对网络中的域运行发现扫描。

join

将系统添加到指定的域中。

leave

从指定的域中删除系统。

list

列出系统的所有配置域,或者所有发现和配置的域。

登录命令

permit

启用特定用户或配置域中的所有用户访问本地系统。

deny

限制特定用户或配置域中的所有用户访问本地系统。

有关 realm 命令的详情,请参考 realm(8) man page。


为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。