LDAP 身份验证

出自 ArchWiki

本指南介绍如何配置 Arch Linux 系统以使用 LDAP 目录进行身份验证。此 LDAP 目录可以是本地的(安装在同一台计算机上)或网络的(例如,在需要集中身份验证的实验室环境中)。

本指南分为两个部分。第一部分介绍如何设置托管身份验证目录的 OpenLDAP 服务器。第二部分介绍如何设置客户端计算机上身份验证方案所需的 NSS 和 PAM 模块。如果您只想配置 Arch 以使用现有的 LDAP 服务器进行身份验证,则可以跳到第二部分

术语

NSS(名称服务切换的缩写)是一种系统机制,用于为常见配置数据库配置不同的来源。例如,/etc/passwdpasswd 数据库的文件类型来源。

PAM(可插拔身份验证模块的缩写)是 Linux(和大多数 *nix)使用的一种机制,用于基于不同的插件扩展其身份验证方案。

总而言之,我们需要配置 NSS 以使用 OpenLDAP 服务器作为 passwdshadow 和其他配置数据库的来源,然后配置 PAM 以使用这些来源来验证其用户。

LDAP 服务器设置

安装

安装 OpenLDAP 服务器并配置服务器客户端。完成之后,返回此处。

设置访问控制

为了确保没有人可以从 LDAP 服务器读取(加密的)密码,但仍然允许用户编辑他们自己的一些选定属性(例如自己的密码和照片),请创建临时 LDIF 文件 allowpwchange.ldif

注意: 根据您的需要更改域名组件 “example” 和 “org”
allowpwchange.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=cn,givenName,sn,userPassword,shadowLastChange,mail,loginShell,photo by self write by anonymous auth by dn.base="cn=Manager,dc=example,dc=org" write by * none
olcAccess: {1}to * by self read by dn.base="cn=Manager,dc=example,dc=org" write by * read

将其导入到数据库编号 0 (`cn=config`)

$ slapmodify -n 0 -l allowpwchange.ldif

然后之后重启 slapd.service

使用基本数据填充 LDAP 树

创建一个名为 base.ldif 的临时文件,内容如下。

base.ldif
# example.org
dn: dc=example,dc=org
dc: example
o: Example Organization
objectClass: dcObject
objectClass: organization

# Manager, example.org
dn: cn=Manager,dc=example,dc=org
cn: Manager
description: LDAP administrator
objectClass: organizationalRole
objectClass: top
roleOccupant: dc=example,dc=org

# People, example.org
dn: ou=People,dc=example,dc=org
ou: People
objectClass: top
objectClass: organizationalUnit

# Groups, example.org
dn: ou=Group,dc=example,dc=org
ou: Group
objectClass: top
objectClass: organizationalUnit

将其添加到您的 OpenLDAP 树中

$ ldapadd -D "cn=Manager,dc=example,dc=org" -W -f base.ldif

测试以确保数据已导入

$ ldapsearch -x -b 'dc=example,dc=org' '(objectclass=*)'

添加用户

要手动添加用户,请创建一个如下所示的 `.ldif` 文件

user_joe.ldif
dn: uid=johndoe,ou=People,dc=example,dc=org
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: johndoe
cn: John Doe
sn: Doe
givenName: John
title: Guinea Pig
telephoneNumber: +0 000 000 0000
mobile: +0 000 000 0000
postalAddress: AddressLine1$AddressLine2$AddressLine3
userPassword: {CRYPT}xxxxxxxxxx
labeledURI: https://archlinux.org.cn/
loginShell: /bin/bash
uidNumber: 9999
gidNumber: 9999
homeDirectory: /home/johndoe/
description: This is an example user

`userPassword` 条目中的 xxxxxxxxxx 应替换为 /etc/shadow 中的值,或使用 slappasswd 命令。现在添加用户

$ ldapadd -D "cn=Manager,dc=example,dc=org" -W -f user_joe.ldif

您可以类似地添加一个组,使用

group_joe.ldif
dn: cn=joe,ou=Group,dc=example,dc=org
objectClass: top
objectClass: posixGroup
cn: joe
gidNumber: 9999
注意: 您可以使用 PADL Software 的 openldap-migrationtoolsAUR 自动将所有本地帐户(和组等)迁移到 LDAP 目录。

客户端设置

按照 OpenLDAP 中的描述安装 OpenLDAP 客户端。确保您可以使用 ldapsearch 查询服务器。

根据您的目标,选择 仅在线在线和离线 身份验证。

在线身份验证

NSS 配置

NSS 是一个系统工具,用于管理作为配置数据库的不同来源。例如,/etc/passwdpasswd 数据库的文件类型来源,该数据库存储用户帐户。

安装 nss-pam-ldapd 软件包。

编辑 /etc/nsswitch.conf,它是 NSS 的中央配置文件。它告诉 NSS 为哪些系统数据库使用哪些来源。我们需要将 ldap 指令添加到 passwdgroupshadow 数据库,因此请确保您的文件如下所示

passwd: files ldap
group: files ldap
shadow: files ldap

编辑 /etc/nslcd.conf 并更改 baseuri 行以适应您的 LDAP 服务器设置。

如果您的 LDAP 服务器需要密码,请编辑 binddnbindpw。确保将 /etc/nslcd.conf 的权限更改为 0600,以便 nslcd 正常启动。

使用 systemd 启动 nslcd.service

现在您应该在客户端上运行 getent passwd 时看到您的 LDAP 用户。

PAM 配置

PAM 配置的基本经验法则是,在包含 pam_unix.so 的任何地方都包含 pam_ldap.so。Arch 迁移到 pambase 有助于减少所需的编辑量。有关配置 PAM 的更多详细信息,Red Hat 文档相当不错。您可能还需要 nss-pam-ldapd 的上游文档。

提示: 如果您想防止 UID 与系统上的本地用户冲突,您可能需要在 pam_ldap.so 行的末尾包含 minimum_uid=10000 或类似内容。您必须确保 LDAP 服务器返回的 uidNumber 字段符合限制。
注意: 每个工具(auth、session、password、account)形成一个单独的链,顺序很重要。sufficient 行有时会“短路”并跳过该部分的其余部分,因此 authpasswordaccount 的经验法则是 sufficient 行在 required 之前,但在 session 部分的 required 行之后;optional 几乎总是可以放在最后。在添加 pam_ldap.so 行时,如果没有充分的理由,请勿更改其他行的相对顺序!只需在链中插入 LDAP 即可。

首先编辑 /etc/pam.d/system-auth。此文件包含在 pam.d 中的大多数其他文件中,因此此处的更改可以很好地传播。更新到 pambase 可能会更改此文件。

在每个部分的顶部使 pam_ldap.so 足够,但在 session 部分除外,我们在该部分使其为可选。

/etc/pam.d/system-auth
auth      sufficient pam_ldap.so
auth      required  pam_unix.so     try_first_pass nullok
auth      optional  pam_permit.so
auth      required  pam_env.so

account   sufficient pam_ldap.so
account   required  pam_unix.so
account   optional  pam_permit.so
account   required  pam_time.so

password  sufficient pam_ldap.so
password  required  pam_unix.so     try_first_pass nullok sha512 shadow
password  optional  pam_permit.so

session   required  pam_limits.so
session   required  pam_unix.so
session   optional  pam_ldap.so
session   optional  pam_permit.so

然后完全相同地编辑 /etc/pam.d/su/etc/pam.d/su-l。当用户运行 su --login 时,将使用 su-l 文件。

在每个部分的顶部使 pam_ldap.so 足够,但在 pam_rootok 之下,并在 auth 部分中向 pam_unix 添加 use_first_pass

/etc/pam.d/su
#%PAM-1.0
auth      sufficient    pam_rootok.so
auth      sufficient    pam_ldap.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth     sufficient    pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth     required      pam_wheel.so use_uid
auth      required	pam_unix.so use_first_pass
account   sufficient    pam_ldap.so
account   required	pam_unix.so
session   sufficient    pam_ldap.so
session   required	pam_unix.so

要允许用户编辑其密码,请编辑 /etc/pam.d/passwd

/etc/pam.d/passwd
#%PAM-1.0
password        sufficient      pam_ldap.so
password        required        pam_unix.so sha512 shadow nullok
在登录时创建家目录

如果您希望在登录时创建家目录(例如:如果您不使用 NFS 存储家目录),请编辑 /etc/pam.d/system-login 并在 session 部分中在任何 “sufficient” 项之上添加 pam_mkhomedir.so。这将导致在 tty、ssh、xdm、sddm、gdm 等登录时创建家目录。您可以选择以相同的方式编辑其他文件,例如 /etc/pam.d/su/etc/pam.d/su-l 以便为 susu --login 启用它。如果您不想为 ssh 登录执行此操作,请编辑 system-local-login 而不是 system-login 等。

/etc/pam.d/system-login
...top of file not shown...
session    optional   pam_loginuid.so
session    include    system-auth
session    optional   pam_motd.so          motd=/etc/motd
session    optional   pam_mail.so          dir=/var/spool/mail standard quiet
-session   optional   pam_systemd.so
session    required   pam_env.so
session    required   pam_mkhomedir.so skel=/etc/skel umask=0077
/etc/pam.d/su-l
...top of file not shown...
session         required        pam_mkhomedir.so skel=/etc/skel umask=0077
session         sufficient      pam_ldap.so
session         required        pam_unix.so
启用 sudo

要从 LDAP 用户启用 sudo,请编辑 /etc/pam.d/sudo。您还需要相应地修改 sudoers。

/etc/pam.d/sudo
#%PAM-1.0
auth      sufficient    pam_ldap.so
auth      required      pam_unix.so  try_first_pass
auth      required      pam_nologin.so

您还需要在 /etc/openldap/ldap.conf 中添加以下内容

/etc/openldap/ldap.conf
sudoers_base ou=sudoers,dc=example,dc=org

使用 SSSD 进行在线和离线身份验证

有关概述和安装,请参阅 SSSD

注意: 您必须为您的 LDAP 服务器配置 StartTLS,否则 SSSD 将无法工作

SSSD 配置

如果不存在,请创建 /etc/sssd/sssd.conf

/etc/sssd/sssd.conf
[sssd]
config_file_version = 2
services = nss, pam
domains = LDAP

[domain/LDAP]
cache_credentials = true
enumerate = true

id_provider = ldap
auth_provider = ldap

ldap_uri = ldap://server1.example.org, ldap://server2.example.org
ldap_search_base = dc=example,dc=org
ldap_id_use_start_tls = true
ldap_tls_reqcert = demand
ldap_tls_cacert = /etc/openldap/certs/cacerts.pem
chpass_provider = ldap
ldap_chpass_uri = ldap://server1.example.org
entry_cache_timeout = 600
ldap_network_timeout = 2

# OpenLDAP supports posixGroup, uncomment the following two lines
# to get group membership support (and comment the other conflicting parameters)
#ldap_schema = rfc2307
#ldap_group_member = memberUid

# Other LDAP servers may support this instead
ldap_schema = rfc2307bis
ldap_group_member = uniqueMember

以上仅为示例。有关完整详细信息,请参阅 sssd.conf(5)

最后,设置文件权限 chmod 600 /etc/sssd/sssd.conf,否则 SSSD 将无法启动。

NSCD 配置

本文或本节已过时。

原因:nscd 已在 glibc 2.38-4 中删除。(在 Talk:LDAP authentication 中讨论)

禁用 /etc/nscd.confpasswdgroupnetgroup 条目的缓存,因为它会干扰 sssd 缓存。

保持启用 hosts 条目的缓存,否则某些服务可能无法启动。

/etc/nscd.conf
# Begin /etc/nscd.conf
[...]
enable-cache		passwd		no
[...]
enable-cache		group		no
[...]
enable-cache		hosts		yes
[...]
enable-cache		netgroup	no
[...]
# End /etc/nscd.conf

NSS 配置

按如下方式编辑 /etc/nsswitch.conf

/etc/nsswitch.conf
# Begin /etc/nsswitch.conf

passwd: files sss
group: files sss
shadow: files sss
sudoers: files sss

publickey: files

hosts: files dns myhostname
networks: files

protocols: files
services: files
ethers: files
rpc: files

netgroup: files

# End /etc/nsswitch.conf

PAM 配置

第一步是按如下方式编辑 /etc/pam.d/system-auth

/etc/pam.d/system-auth
#%PAM-1.0

auth sufficient pam_sss.so forward_pass
auth required pam_unix.so try_first_pass nullok
auth optional pam_permit.so
auth required pam_env.so

account [default=bad success=ok user_unknown=ignore authinfo_unavail=ignore] pam_sss.so
account required pam_unix.so
account optional pam_permit.so
account required pam_time.so

password sufficient pam_sss.so
password required pam_unix.so try_first_pass nullok sha512 shadow
password optional pam_permit.so

session     required      pam_mkhomedir.so skel=/etc/skel/ umask=0077
session required pam_limits.so
session required pam_unix.so
session optional pam_sss.so
session optional pam_permit.so
注意: 如果您碰巧使用 GNOME/Keyring:在 PAM 堆栈的开头添加 'sufficient' 会导致 Gnome Keyring 未解锁。有关解决方案,请查看 高级 PAM 配置

这些 PAM 更改将应用于新登录。为了也允许 su 命令通过 SSSD 进行身份验证,请编辑 /etc/pam.d/su

/etc/pam.d/su
#%PAM-1.0
auth            sufficient        pam_rootok.so

auth sufficient   pam_sss.so      forward_pass
auth            required        pam_unix.so

account [default=bad success=ok user_unknown=ignore authinfo_unavail=ignore] pam_sss.so
account         required        pam_unix.so

session         required        pam_unix.so
session optional pam_sss.so
启用 sudo

按如下方式编辑 /etc/pam.d/sudo

/etc/pam.d/sudo
#%PAM-1.0
auth           sufficient      pam_sss.so
auth           required        pam_unix.so try_first_pass
auth           required        pam_nologin.so

还将 sudo 服务添加到已启用服务列表,并将搜索基本添加到 /etc/sssd/sssd.conf

/etc/sssd/sssd.conf
[sssd]
...
services = nss, pam, sudo
...

[domain/LDAP]
...
ldap_sudo_search_base = ou=sudoers,dc=example,dc=org
...

或者,配置 sudo 以允许所需的 LDAP 用户使用 *sudo*。

密码管理

对于在使用 su 登录时更改过期的密码,如果缺少密码条目,请在 /etc/pam.d/su 中添加一个

/etc/pam.d/su
#%PAM-1.0

[...]

auth        include     system-auth
account     include     system-auth
session     include     system-auth
password    include     system-auth

启动/启用 sssd.service

现在您应该可以使用 getent passwd usernameid username 查看您的 LDAP 用户的详细信息。

一旦您使用用户登录,凭据将被缓存,并且当 LDAP 服务器脱机或不可用时,您将能够使用缓存的凭据登录。

参见