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) 库中获取条目。这意味着,与 passwd
或 dig
不同,它会查询不同的数据库,包括 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