LDAP 身份验证
本指南介绍如何配置 Arch Linux 系统以使用 LDAP 目录进行身份验证。此 LDAP 目录可以是本地的(安装在同一台计算机上)或网络的(例如,在需要集中身份验证的实验室环境中)。
本指南分为两个部分。第一部分介绍如何设置托管身份验证目录的 OpenLDAP 服务器。第二部分介绍如何设置客户端计算机上身份验证方案所需的 NSS 和 PAM 模块。如果您只想配置 Arch 以使用现有的 LDAP 服务器进行身份验证,则可以跳到第二部分。
- 术语
NSS(名称服务切换的缩写)是一种系统机制,用于为常见配置数据库配置不同的来源。例如,/etc/passwd
是 passwd
数据库的文件类型来源。
PAM(可插拔身份验证模块的缩写)是 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
数据库的文件类型来源,该数据库存储用户帐户。
安装 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 配置的基本经验法则是,在包含 pam_unix.so
的任何地方都包含 pam_ldap.so
。Arch 迁移到 pambase 有助于减少所需的编辑量。有关配置 PAM 的更多详细信息,Red Hat 文档相当不错。您可能还需要 nss-pam-ldapd 的上游文档。
pam_ldap.so
行的末尾包含 minimum_uid=10000
或类似内容。您必须确保 LDAP 服务器返回的 uidNumber
字段符合限制。sufficient
行有时会“短路”并跳过该部分的其余部分,因此 auth
、password
和 account
的经验法则是 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
以便为 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
还将 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 username
或 id username
查看您的 LDAP 用户的详细信息。
一旦您使用用户登录,凭据将被缓存,并且当 LDAP 服务器脱机或不可用时,您将能够使用缓存的凭据登录。