跳转至内容

LDAP 认证

来自 ArchWiki
(重定向自 LDAP Authentication)

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

本指南分为两部分。第一部分介绍如何设置一个 OpenLDAP 服务器来托管认证目录。第二部分介绍如何设置 NSS 和 PAM 模块,这些模块是认证方案在客户端计算机上正常工作所必需的。如果您只想配置 Arch 以针对已有的 LDAP 服务器进行认证,您可以跳至 第二部分

术语

NSS(代表 Name Service Switch,名称服务切换)是一个系统机制,用于配置常见配置数据库的不同来源。例如,/etc/passwdpasswd 数据库的 file 类型来源。

PAM(代表 Pluggable Authentication Modules,可插拔认证模块)是 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 数据库的 file 类型来源,该数据库存储用户帐户。

安装 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 配置的基本经验法则是, wherever pam_unix.so is included, include 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 成为 sufficient,除了 session 部分,在那里我们使其成为 optional。注意 pam_systemd_home.so 行中的递增数字。如有疑问,请参考 pam.conf(5)

/etc/pam.d/system-auth
auth       required                    pam_faillock.so      preauth
# Optionally use requisite above if you do not want to prompt for the password
# on locked accounts.
-auth      [success=3 default=ignore]  pam_systemd_home.so
auth       [success=2 default=ignore]  pam_ldap.so
auth       [success=1 default=bad]     pam_unix.so          try_first_pass nullok
auth       [default=die]               pam_faillock.so      authfail
auth       optional                    pam_permit.so
auth       required                    pam_env.so
auth       required                    pam_faillock.so      authsucc
# If you drop the above call to pam_faillock.so the lock will be done also
# on non-consecutive authentication failures.

-account   [success=2 default=ignore]  pam_systemd_home.so
account    [success=1 default=ignore]  pam_ldap.so
account    required                    pam_unix.so
account    optional                    pam_permit.so
account    required                    pam_time.so

-password  [success=2 default=ignore]  pam_systemd_home.so
password   [success=1 default=ignore]  pam_ldap.so
password   required                    pam_unix.so          try_first_pass nullok shadow
password   optional                    pam_permit.so

-session   optional                    pam_systemd_home.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-l 文件在用户运行 su --login 时使用。

在每个部分的顶部使 pam_ldap.so 成为 sufficient,但在 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 并将 pam_mkhomedir.so 添加到 session 部分中任何 "sufficient" 项目的上方。这将导致在从 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.conf 中禁用 passwd、group 和 netgroup 条目的缓存,因为它会干扰 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 无法解锁。有关解决方案,请参阅 Advanced PAM Configuration

这些 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

/etc/sssd/sssd.conf 中将 sudo 服务添加到已启用服务的列表和搜索基础。

/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 中缺少 password 条目,请添加一个。

/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 服务器离线或不可用时,您将能够使用缓存的凭据登录。

参见