LDAP 认证

来自 Arch Linux 中文维基

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

本指南分为两部分。第一部分介绍如何安装和配置 OpenLDAP 服务端。第二部分是如何在客户端上配置所需的 NSS 和 PAM 模块。如果您只想将 Arch 加入到已存在的 LDAP 服务器进行身份验证,可以跳到第二部分。

LDAP 服务端配置[编辑 | 编辑源代码]

安装[编辑 | 编辑源代码]

LDAP服务端实现软件如下:

  • 389 Directory Server — 这是一个高性能的开源企业级LDAP服务器,用于存储和管理身份认证、用户、群组、组织结构等信息。
https://www.port389.org/ || 389-ds-base
  • OpenLDAP — 这是一个开源的轻量级LDAP服务器,用于存储和管理身份验证、用户、组、服务配置等信息。
https://www.openldap.org/ || openldap
  • ApacheDS — 这是Apache软件基金会下的一个开源项目,提供LADP服务,用于存储、管理和组织分布式信息如用户、群组、权限的呢个,支持高度安全性和可扩展性。
    https://directory.apache.org/apacheds/

本文档使用OpenLDAP进行演示,请安装 OpenLDAP 服务器 并配置服务器客户端。完成此操作后,请返回此处。

访问控制[编辑 | 编辑源代码]

为确保LDAP服务中存储的(已加密)密码不被他人轻易读取,但又允许用户可更改自己的某些属性(例如自己的密码或图片等),需要LDAP配置访问控制策略,请创建临时 LDIF 文件 allowpwchange.ldif

注意: 请根据实际情况将 exmapleorg 修改成对应域名。
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
提示:还可以使用 PADL 软件的 openldap-migrationtoolsAUR 自动将所有本地帐户(和组等)迁移到 LDAP 服务中。

客户端配置[编辑 | 编辑源代码]

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

根据需求,选择仅在线身份验证或在线和离线身份验证。

在线认证[编辑 | 编辑源代码]

NSS 配置[编辑 | 编辑源代码]

NSS[1] 是一种系统工具,它以配置数据库的形式管理不同的源。例如:/etc/passwdpasswd 数据库的文件类型源,用于存储用户帐户。

安装 nss-pam-ldapd 软件包。

修改/etc/nsswitch.conf,它是 NSS 的主要配置文件。它定义 NSS 哪些源用于哪些系统数据库。我们需要将ldap指令添加到passwdgroupshadow数据库中,请将配置文件修改至如下所示:

/etc/nsswitch.conf
passwd: files ldap
group: files ldap
shadow: files ldap

修改/etc/nslcd.conf配置文件,并将baseuri修改为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官方文档。

提示:若想防止 UID 与系统上的本地用户发生冲突,需要在pam_ldap.so行的末尾配置包含minimum_uid=10000 或类似值。并必须确保 LDAP 服务可返回与限制匹配的uidNumber字段。
注意: 每个阶段(auth、session、password、account)都构成一个独立的链,其顺序至关重要。带有sufficient的行有时会“短路”,会跳过该阶段的其余内容,因此对于authpasswordaccount阶段来说,需要在required行之前添加sufficient行,而在session阶段则是放在required行之后;optional几乎是放在最后。添加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 登录时会自动创建主文件夹。请以相同的方式修改其他文件,例如当执行命令:susu --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的接口,用于扩展用户信息。它还提供了一个数据库来存储本地用户以及扩展用户数据。

注意: 必须为 LDAP 服务器配置TLS加密,否则 SSSD 将不起作用。

安装 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 支持 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
注意: 如果在用 GNOME/Keyring,当在 PAM 文件的开头添加 'sufficient' 会导致 Gnome Keyring 无法解锁。有关解决方案,请查看高级 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服务和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 服务器脱机或不可用时,仍然能够使用缓存的凭据进行登录。

参见[编辑 | 编辑源代码]

  1. NSS(Name Service Switch, 名称服务开关)是类unix操作系统中的一种工具,它为通用配置数据库和名称解析机制提供了各种来源。这些源文件包括本地操作系统文件(例如:/etc/passwd、/etc/group和/etc/hosts)、域名系统(DNS)、网络信息服务(NIS)和LDAP。| 博客园:Linux NSS简介