Active Directory 身份验证
先决条件¶
- 对 Active Directory 的一些了解
- 对 LDAP 的一些了解
介绍¶
在大多数企业中,微软的 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
- 在 Linux 端安装 AD 连接所需的软件包
[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
等示例相反,它将查询不同的数据库,包括 /etc/hosts
用于 getent 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 | 指定管理员帐户 |
尝试身份验证¶
现在,您的用户应该能够对您的 Linux 主机进行身份验证,以验证 Active Directory。
在 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 作为身份验证来源。
设置默认域¶
在完全默认的设置中,您需要使用 AD 帐户登录,并在用户名中指定域(例如,john.doe@ad.company.local
)。如果这不是期望的行为,而是希望在身份验证时省略域名,则可以配置 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 域上执行操作的 CLI。
- 如果尚未安装,请安装所需的软件包。
[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