LDAP 认证
本指南介绍如何配置 Arch Linux 安装以针对 LDAP 目录进行认证。此 LDAP 目录可以是本地的(安装在同一台计算机上)或网络的(例如,在需要集中认证的实验室环境中)。
本指南分为两部分。第一部分介绍如何设置一个 OpenLDAP 服务器来托管认证目录。第二部分介绍如何设置 NSS 和 PAM 模块,这些模块是认证方案在客户端计算机上正常工作所必需的。如果您只想配置 Arch 以针对已有的 LDAP 服务器进行认证,您可以跳至 第二部分。
- 术语
NSS(代表 Name Service Switch,名称服务切换)是一个系统机制,用于配置常见配置数据库的不同来源。例如,/etc/passwd 是 passwd 数据库的 file 类型来源。
PAM(代表 Pluggable Authentication Modules,可插拔认证模块)是 Linux(以及大多数 *nix 系统)用来基于不同插件扩展其认证方案的机制。
因此,总结一下,我们需要配置 NSS 使用 OpenLDAP 服务器作为 passwd、shadow 和其他配置数据库的来源,然后配置 PAM 使用这些来源来认证其用户。
LDAP 服务器设置
安装
安装 OpenLDAP 服务器 并配置 服务器 和 客户端。完成后,请返回此处。
设置访问控制
为确保无人能从 LDAP 服务器读取(加密的)密码,但仍允许用户编辑他们自己的某些选定属性(如自己的密码和照片),请创建临时 LDIF 文件 allowpwchange.ldif
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
客户端设置
按照 OpenLDAP 中的描述安装 OpenLDAP 客户端。确保您可以使用 ldapsearch 查询服务器。
在线认证
NSS 配置
NSS 是一个系统工具,用于管理不同的数据源作为配置数据库。例如,/etc/passwd 是 passwd 数据库的 file 类型来源,该数据库存储用户帐户。
安装 nss-pam-ldapd 软件包。
编辑 /etc/nsswitch.conf,这是 NSS 的中心配置文件。它告诉 NSS 为哪些系统数据库使用哪些来源。我们需要将 ldap 指令添加到 passwd、group 和 shadow 数据库,所以请确保您的文件如下所示:
passwd: files ldap group: files ldap shadow: files ldap
编辑 /etc/nslcd.conf 并更改 base 和 uri 行以适应您的 LDAP 服务器设置。
如果您的 LDAP 服务器需要密码,请编辑 binddn 和 bindpw。确保将 /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 的上游文档。
pam_ldap.so 行的末尾包含 minimum_uid=10000 或类似内容。您将需要确保 LDAP 服务器返回与限制匹配的 uidNumber 字段。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 以启用 su 和 su --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。
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 配置
在 /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
这些 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 username 或 id username 查看您的 LDAP 用户的详细信息。
一旦您使用用户登录,凭据将被缓存,当 LDAP 服务器离线或不可用时,您将能够使用缓存的凭据登录。