这是关于如何配置 Arch Linux 安装以针对 LDAP 目录进行身份验证的指南。LDAP 目录服务可以是本地的(安装在同一台计算机上)或网络中的(例如,在需要集中身份验证的实验环境中)。
本指南分为两部分。第一部分介绍如何安装和配置 OpenLDAP 服务端。第二部分是如何在客户端上配置所需的 NSS 和 PAM 模块。如果您只想将 Arch 加入到已存在的 LDAP 服务器进行身份验证,可以跳到第二部分。
LDAP 服务端配置
安装
LDAP服务端实现软件如下:
- 389 Directory Server — 这是一个高性能的开源企业级LDAP服务器,用于存储和管理身份认证、用户、群组、组织结构等信息。
- OpenLDAP — 这是一个开源的轻量级LDAP服务器,用于存储和管理身份验证、用户、组、服务配置等信息。
- ApacheDS — 这是Apache软件基金会下的一个开源项目,提供LADP服务,用于存储、管理和组织分布式信息如用户、群组、权限的呢个,支持高度安全性和可扩展性。
https://directory.apache.org/apacheds/
本文档使用OpenLDAP进行演示,请安装 OpenLDAP 服务器 并配置服务器和客户端。完成此操作后,请返回此处。
访问控制
为确保LDAP服务中存储的(已加密)密码不被他人轻易读取,但又允许用户可更改自己的某些属性(例如自己的密码或图片等),需要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
。
导入基本组织架构
创建临时文件base.ldif
base.ldif
# 域 dn: dc=example,dc=org dc: example o: Example Organization objectClass: dcObject objectClass: organization # 域管理员账户 dn: cn=Manager,dc=example,dc=org cn: Manager description: LDAP administrator objectClass: organizationalRole objectClass: top roleOccupant: dc=example,dc=org # 用户 dn: ou=People,dc=example,dc=org ou: People objectClass: top objectClass: organizationalUnit # 用户组 dn: ou=Group,dc=example,dc=org ou: Group objectClass: top objectClass: organizationalUnit
导入到域服务中
$ ldapadd -D "cn=Manager,dc=example,dc=org" -W -f base.ldif
使用下面命令检测是否导入成功
$ ldapsearch -x -b 'dc=example,dc=org' '(objectclass=*)'
导入用户信息
按照下面模板创建文件user_joe.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/ 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
添加同名的POISX用户组
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[1] 是一种系统工具,它以配置数据库的形式管理不同的源。例如:/etc/passwd
是 passwd
数据库的文件类型源,用于存储用户帐户。
安装 nss-pam-ldapd包 软件包。
修改/etc/nsswitch.conf
,它是 NSS 的主要配置文件。它定义 NSS 哪些源用于哪些系统数据库。我们需要将ldap
指令添加到passwd
、group
和shadow
数据库中,请将配置文件修改至如下所示:
/etc/nsswitch.conf
passwd: files ldap group: files ldap shadow: files ldap
修改/etc/nslcd.conf
配置文件,并将base
和uri
修改为LDAP服务对应的值。
/etc/nslcd.conf
... uri ldap://127.0.0.1/ base dc=example,dc=org binddn cn=Manager,dc=example,dc=org bindpw YourPassword ...
重启服务nslcd.service
。
若配置正确,在客户端上执行命令:getent passwd
将会列出LDAP服务上面的用户。
PAM 配置
简单的PAM配置原则是将pam_ldap.so
配置在任何包含pam_unix.so
的配置文件中。Arch在使用pambase包后有效地减少了编辑量,有关于PAM的更多信息,请查阅RedHat文档,如果需要可查看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。
/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
的前面,并配置为sufficient,而在auth阶段中的pam_unix.so
模块后面则需要添加use_first_pass
。
/etc/pam.d/su
#%PAM-1.0 auth sufficient pam_rootok.so auth sufficient pam_ldap.so # 取消对以下行的注释,以默认信任“wheel”组中的用户。 #auth sufficient pam_wheel.so trust use_uid # 取消对以下行的注释,以必须要求用户位于“wheel”组中。 #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”项目上方。若需从 ssh、xdm、sddm、gdm 等或在 tty 登录时会自动创建主文件夹。请以相同的方式修改其他文件,例如当执行命令:su
和su --login
时会使用文件/etc/pam.d/su
和/etc/pam.d/su-l
。如果不想在 ssh 登录是执行此操作,请修改文件system-local-login
,而不是文件system-login
。
/etc/pam.d/system-login
...未显示文件头部... 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
...未显示文件头部... 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 是一个系统守护程序。它的主要功能是通过一个通用框架提供对身份和身份验证以及远程资源的访问,该框架可以为系统提供缓存和离线支持。它提供PAM和NSS模块,未来将提供基于D-BUS的接口,用于扩展用户信息。它还提供了一个数据库来存储本地用户以及扩展用户数据。
配置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 支持 posixGroup,可取消注释以下两行 # 获取用户组成员身份支持(需要注释下面冲突配置) #ldap_schema = rfc2307 #ldap_group_member = memberUid # 其他 LDAP 服务可能支持的组成员身份功能 ldap_schema = rfc2307bis ldap_group_member = uniqueMember
以上只是一个示例。参见sssd.conf(5) 了解完整的细节。
最后将文件权限chmod 600 /etc/sssd/sssd.conf
,否则 sssd 将无法启动。
配置 NSS
修改/etc/nsswitch.conf
配置文件如下:
/etc/nsswitch.conf
passwd: files systemd sss group: files [SUCCESS=merge] systemd sss shadow: files systemd sss gshadow: files systemd sudoers: files sss publickey: files hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns networks: files protocols: files services: files ethers: files rpc: files netgroup: files
配置 PAM
首先配置系统认证/etc/pam.d/system-auth
,所有与系统相关的流程都会经过当前文件,每当用户登录时,使用sssd模块进行认证。
/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
若向要使用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服务和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
。
/etc/pam.d/su
#%PAM-1.0 ... auth include system-auth account include system-auth session include system-auth password include system-auth
重启sshd.service
服务。
若配置正确,使用命令getent passwd LDAP用户名
或id LDAP用户名
能查看到用户信息。
使用用户登录后,凭据将被缓存,当 ldap 服务器脱机或不可用时,仍然能够使用缓存的凭据进行登录。
参见
- ↑ NSS(Name Service Switch, 名称服务开关)是类unix操作系统中的一种工具,它为通用配置数据库和名称解析机制提供了各种来源。这些源文件包括本地操作系统文件(例如:/etc/passwd、/etc/group和/etc/hosts)、域名系统(DNS)、网络信息服务(NIS)和LDAP。| 博客园:Linux NSS简介