跳至内容

Active Directory 身份验证

先决条件

  • 对 Active Directory 的一些了解
  • 对 LDAP 的一些了解

简介

在大多数企业中,Microsoft Active Directory (AD) 是 Windows 系统和外部 LDAP 连接服务的默认身份验证系统。它允许您配置用户和组、访问控制、权限、自动挂载等。

虽然将 Linux 连接到 AD 群集无法支持上述所有功能,但它可以处理用户、组和访问控制。通过一些 Linux 端配置调整和 AD 端的一些高级选项,可以分发 AD SSH 密钥。

但是,本指南仅涵盖针对 Active Directory 的身份验证配置,不包含 Windows 端的任何额外配置。

使用 SSSD 发现和加入 AD

注意

本指南中使用的域名 ad.company.local 将代表 Active Directory 域。要遵循本指南,请将其替换为您的 AD 域的实际域名。

将 Linux 系统加入 AD 的第一步是发现您的 AD 群集,以确保双方的网络配置都正确。

准备工作

  • 确保您的域控制器向您的 Linux 主机开放以下端口
服务 端口 备注
DNS 53 (TCP+UDP)
Kerberos 88, 464 (TCP+UDP) kadmin 用于设置和更新密码
LDAP 389 (TCP+UDP)
LDAP-GC 3268 (TCP) LDAP 全局目录 - 允许您从 AD 获取用户 ID
  • 确保您已将 AD 域控制器配置为 Rocky Linux 主机上的 DNS 服务器

使用 NetworkManager

# where your primary NetworkManager connection is 'System eth0' and your AD
# server is accessible on the IP address 10.0.0.2.
[root@host ~]$ nmcli con mod 'System eth0' ipv4.dns 10.0.0.2
  • 确保双方(AD 主机和 Linux 系统)的时间已同步(请参阅 chronyd)

检查 Rocky Linux 上的时间

[user@host ~]$ date
Wed 22 Sep 17:11:35 BST 2021
  • 安装 AD 连接所需的软件包(Linux 端)
[user@host ~]$ sudo dnf install realmd oddjob oddjob-mkhomedir sssd adcli krb5-workstation

发现

现在您应该能够从 Linux 主机成功发现您的 AD 服务器。

[user@host ~]$ realm discover ad.company.local
ad.company.local
  type: kerberos
  realm-name: AD.COMPANY.LOCAL
  domain-name: ad.company.local
  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

存储在 Active Directory DNS 服务中的相关 SRV 记录将允许发现。

加入

一旦您成功从 Linux 主机发现您的 Active Directory 安装,您应该能够使用 realmd 加入域,该命令将协调使用 adcli 和其他类似工具配置 sssd

[user@host ~]$ sudo realm join ad.company.local

如果此过程报告 KDC has no support for encryption type 加密错误,请尝试更新全局加密策略以允许较旧的加密算法。

[user@host ~]$ sudo update-crypto-policies --set DEFAULT:AD-SUPPORT

如果此过程成功,您现在应该能够获取 Active Directory 用户的 passwd 信息。

[user@host ~]$ sudo getent passwd administrator@ad.company.local
administrator@ad.company.local:*:1450400500:1450400513:Administrator:/home/administrator@ad.company.local:/bin/bash

注意

getent 从名称服务切换 (NSS) 库中获取条目。这意味着,与 passwddig 不同,它会查询不同的数据库,包括 getent hosts/etc/hosts,或者在 getent passwd 的情况下从 sssd 查询。

realm 提供了一些您可以使用的有趣选项

选项 观察
--computer-ou='OU=LINUX,OU=SERVERS,dc=ad,dc=company.local' 服务器帐户要存储的 OU
--os-name='rocky' 指定 AD 中存储的操作系统名称
--os-version='8' 指定 AD 中存储的操作系统版本
-U admin_username 指定管理员帐户

尝试身份验证

现在您的用户应该能够针对 Active Directory 登录到您的 Linux 主机。

在 Windows 10 上: (自带 OpenSSH)

C:\Users\John.Doe> ssh -l john.doe@ad.company.local linux.host
Password for john.doe@ad.company.local:

Activate the web console with: systemctl enable --now cockpit.socket

Last login: Wed Sep 15 17:37:03 2021 from 10.0.10.241
[john.doe@ad.company.local@host ~]$

如果成功,您已成功配置 Linux 使用 Active Directory 作为身份验证源。

设置默认域

在完全默认的设置中,您需要通过在用户名中指定域(例如,john.doe@ad.company.local)来使用您的 AD 帐户登录。如果这不是期望的行为,并且您希望在身份验证时能够省略域名,则可以将 SSSD 配置为默认使用特定域。

这是一个相对直接的过程,需要在 SSSD 配置文件中进行配置调整。

[user@host ~]$ sudo vi /etc/sssd/sssd.conf
[sssd]
...
default_domain_suffix = ad.company.local

通过添加 default_domain_suffix,您指示 SSSD(如果未指定其他域)推断用户正尝试作为 ad.company.local 域的用户进行身份验证。这允许您像 john.doe 一样进行身份验证,而不是 john.doe@ad.company.local

要使此配置更改生效,您必须使用 systemctl 重启 sssd.service 单元。

[user@host ~]$ sudo systemctl restart sssd

同样,如果您不希望将您的主目录附加域名后缀,可以将这些选项添加到您的配置文件 /etc/sssd/sssd.conf 中。

[domain/ad.company.local]
use_fully_qualified_names = False
override_homedir = /home/%u

不要忘记重启 sssd 服务。

限制为特定用户

有多种方法可以将服务器访问限制为有限的用户列表,但正如名称所示,这无疑是最简单的方法。

将这些选项添加到您的配置文件 /etc/sssd/sssd.conf 中,并重启服务。

access_provider = simple
simple_allow_groups = group1, group2
simple_allow_users = user1, user2

现在,只有 group1 和 group2 的用户,或者 user1 和 user2 才能使用 sssd 连接到服务器!

使用 adcli 与 AD 交互

adcli 是一个用于在 Active Directory 域上执行操作的命令行工具。

  • 如果尚未安装,请安装所需的软件包。
[user@host ~]$ sudo dnf install adcli
  • 测试您是否已加入 Active Directory 域。
[user@host ~]$ sudo adcli testjoin
Successfully validated join to domain ad.company.local
  • 获取有关域的更高级信息。
[user@host ~]$ adcli info ad.company.local
[domain]
domain-name = ad.company.local
domain-short = AD
domain-forest = ad.company.local
domain-controller = dc1.ad.company.local
domain-controller-site = site1
domain-controller-flags = gc ldap ds kdc timeserv closest writable full-secret ads-web
domain-controller-usable = yes
domain-controllers = dc1.ad.company.local dc2.ad.company.local
[computer]
computer-site = site1
  • 除了作为咨询工具,您还可以使用 adcli 与您的域进行交互:管理用户或组、更改密码等。

示例:使用 adcli 获取有关计算机的信息

注意

这次我们将通过 -U 选项提供管理员用户名。

[user@host ~]$ adcli show-computer pctest -U admin_username
Password for admin_username@AD: 
sAMAccountName:
 pctest$
userPrincipalName:
 - not set -
msDS-KeyVersionNumber:
 9
msDS-supportedEncryptionTypes:
 24
dNSHostName:
 pctest.ad.company.local
servicePrincipalName:
 RestrictedKrbHost/pctest.ad.company.local
 RestrictedKrbHost/pctest
 host/pctest.ad.company.local
 host/pctest
operatingSystem:
 Rocky
operatingSystemVersion:
 8
operatingSystemServicePack:
 - not set -
pwdLastSet:
 133189248188488832
userAccountControl:
 69632
description:
 - not set -

示例:使用 adcli 更改用户密码

[user@host ~]$ adcli passwd-user user_test -U admin_username
Password for admin_username@AD: 
Password for user_test: 
[user@host ~]$ 

故障排除

有时,网络服务会在 SSSD 之后启动,这会导致身份验证出现问题。

在您重启服务之前,没有 AD 用户能够连接。

在这种情况下,您将不得不覆盖 systemd 的服务文件来处理此问题。

将此内容复制到 /etc/systemd/system/sssd.service

[Unit]
Description=System Security Services Daemon
# SSSD must be running before we permit user sessions
Before=systemd-user-sessions.service nss-user-lookup.target
Wants=nss-user-lookup.target
After=network-online.target


[Service]
Environment=DEBUG_LOGGER=--logger=files
EnvironmentFile=-/etc/sysconfig/sssd
ExecStart=/usr/sbin/sssd -i ${DEBUG_LOGGER}
Type=notify
NotifyAccess=main
PIDFile=/var/run/sssd.pid

[Install]
WantedBy=multi-user.target

下次重启时,服务将在其需求之后启动,一切都会顺利进行。

离开 Active Directory

有时,离开 AD 是必要的。

您可以使用 realm,然后卸载不再需要的软件包。

[user@host ~]$ sudo realm leave ad.company.local
[user@host ~]$ sudo dnf remove realmd oddjob oddjob-mkhomedir sssd adcli krb5-workstation

作者:Hayden Young

贡献者:Steven Spencer, Sambhav Saggi, Antoine Le Morvan, Krista Burdine, Ganna Zhyrnova, Neel Chauhan