如果在 Debian Buster 操作系统上使用带有 nss-pam-ldapd 的 LDAP 身份验证, SASL/GSSAPI 需要通过代理授权对 LDAP 服务器进行 Kerberos 身份验证。我尝试在我的 Raspberry Pi 上将其配置为单点登录,但无法使其正常工作。
我的 ldap 服务器配置了How to setup SASL Proxy Authorization with an OpenLDAP server on Debian。我将代理用户命名为proxyuser,因此它的专有名称是uid=proxyuser,ou=people,ou=home,dc=hoeft-online,dc=de
.
根据在 Debian 系统上使用 nss-pam-ldapd 的 LDAP 身份验证,libnss-ldapd
除了libpam-ldapd
GSSAPI 插件之外,我还必须安装软件包libsasl2-modules-gssapi-mit
。但我将使用libpam-krb5
而不是libpam-ldapd
:
rpi ~$ sudo apt install libsasl2-modules-gssapi-mit libnss-ldapd ldap-utils
安装时会出现一个配置对话框,其中设置存储在/etc/nslcd.conf
和中/etc/nsswitch.conf
。我必须再次配置
rpi ~$ sudo dpkg-reconfigure nslcd
rpi ~$ sudo dpkg-reconfigure libnss-ldapd
我从对话框中给出的设置是:
rpi ~$ sudo cat /etc/nslcd.conf
# /etc/nslcd.conf
# nslcd configuration file. See nslcd.conf(5)
# for details.
# The user and group nslcd should run as.
uid nslcd
gid nslcd
# The location at which the LDAP server(s) should be reachable.
uri ldap://kdc-master.home.hoeft-online.de
# The search base that will be used for all queries.
base ou=home,dc=hoeft-online,dc=de
# The LDAP protocol version to use.
#ldap_version 3
# The DN to bind with for normal lookups.
#binddn cn=annonymous,dc=example,dc=net
#bindpw secret
# The DN used for password modifications by root.
#rootpwmoddn cn=admin,dc=example,dc=com
# SSL options
#ssl off
#tls_reqcert never
tls_cacertfile /etc/ssl/certs/ca-certificates.crt
# The search scope.
#scope sub
sasl_mech GSSAPI
krb5_ccname /var/run/nslcd/nslcd.tkt
sasl_authzid dn:uid=proxyuser,ou=people,ou=home,dc=hoeft-online,dc=de
~$ cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
passwd: files ldap
group: files ldap
shadow: files ldap
gshadow: files
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
现在,getent passwd
我希望从 LDAP 服务器获得ingo的凭据。它不存储在本地/etc/passwd
。但我只从/etc/passwd
. 在 LDAP 服务器的日志中,我可以看到没有尝试绑定到proxyuser。我在这里缺少什么?
为什么getent
不从 LDAP 服务器获取凭据?
简短的回答
确保您
/etc/krb5.keytab
与您的host/*
委托人有效,例如:nscd
如果可用,则禁用缓存守护程序sudo systemctl disable --now nscd.service
。不要将其与nslcd
. 然后检查代理授权:然后安装:
只需接受安装对话框中的默认设置即可。我们用这些配置文件覆盖它们。将它们与您的设置一起使用:
nslcd.conf
nsswitch.conf
重新启动服务并检查。确保ingo在
/etc/passwd
.使用 Kerberos 身份验证设置 PAM 登录:
安装 nscd 缓存守护进程(如果已经可用,则启用它):
而已。
更多细节
我花了几天时间检查设置有什么问题。对于故障排除,您可以在 LDAP 服务器上增加日志以调试输出
olcLogLevel: any
:在客户端设备上,只需取消注释
/etc/nslcd.conf
.重新启动服务并禁用缓存守护程序
nscd
(不要与混淆nslcd
),因为nscd
可能会混淆测试:完成后不要忘记恢复调试日志并启用nscd。执行
getent passwd
您将在客户端日志中看到它甚至没有以 开头GSSAPI client step 1
,什么都没有。我意识到 nslcd.service 没有获得任何凭据来/var/run/nslcd/nslcd.tkt
进行身份验证。我四处寻找,发现/etc/default/nslcd
必须启动/usr/bin/k5start
,但没有安装,也没有记录。所以只需安装它:现在日志显示 GSSAPI 从第 1 步开始,但随后中止。
最令人困惑的是在安装时出现的设置对话框
libnss-ldapd
。它要求我使用 GSSAPI 设置错误的条目,特别是代理用户的可分辨名称 (sasl_authzid)。这是不可用的。相反,您必须使用普通的binddn。只需接受对话框设置中的默认设置,然后使用简短答案中的配置文件。我将systemd-networkd与systemd-resolved一起使用。使用 systemd 解析器时,我在登录时遇到了令人讨厌的 60 秒延迟,这是不可接受的。显示
journal -b
查询 ldap 服务器的组成员身份在 60 秒后超时:经过几天的错误搜寻,我发现该选项已
nss_initgroups_ignoreusers ALLLOCAL
修复/etc/nslcd.conf
此错误。此选项可防止通过非 LDAP 用户的 LDAP 查找组成员资格。这意味着像系统帐户这样的本地注册用户将不会查找 LDAP 服务器。