LDAP 身份验证和授权
Cumulus Linux 使用可插拔身份验证模块 (PAM) 和名称服务交换机 (NSS) 进行用户身份验证。NSS 使 PAM 能够使用 LDAP 为系统上的其他服务提供用户身份验证、组映射和信息。
- NSS 指定了信息源的顺序,这些信息源解析每个服务的名称。将 NSS 与身份验证和授权结合使用,可以提供系统上用户查找和组映射的顺序和位置。
- PAM 处理用户和系统之间的交互,提供登录处理、会话设置、用户身份验证和用户操作授权。
NVUE 使用 PAM 和 NSS 管理 LDAP 身份验证。
- Cumulus Linux 仅支持 IPv4 的 LDAP。
- LDAP 身份验证对网络延迟敏感。为了获得最佳性能,NVIDIA 建议 LDAP 客户端和 LDAP 服务器之间的往返时间为 10 毫秒或更短。如果延迟在 10-50 毫秒之间,NVIDIA 建议更改身份验证顺序,以优先考虑本地身份验证,然后再考虑 LDAP。对于超过 50 毫秒延迟的连接,身份验证可能会遇到无法接受的延迟,应考虑其他身份验证方法。
配置 LDAP 服务器设置
您可以使用 NVUE 命令或编辑 Linux 配置文件来配置 LDAP 服务器设置。
连接
配置以下连接设置
- 您要从中导入用户的 LDAP 服务器的主机名或 IP 地址。如果您使用多个 LDAP 服务器,您还可以为每个服务器设置优先级。
- 如果您使用非默认端口,则为 LDAP 服务器的端口号。LDAP 的默认端口号是 TCP 和 UDP 端口 389。
- 已验证的(简单)BIND 凭据。BIND 凭据是可选的;如果您未指定凭据,则交换机假定为匿名绑定。要使用 SASL(简单身份验证和安全层)BIND,它使用其他机制(如 Kerberos)提供身份验证服务,请联系您的 LDAP 服务器管理员以获取身份验证信息。
以下示例配置了 LDAP 服务器和端口以及 BIND 凭据。
cumulus@switch:~$ nv set system aaa ldap server ldapserver1
cumulus@switch:~$ nv set system aaa ldap port 388
cumulus@switch:~$ nv set system aaa ldap bind-dn CN=cumulus-admin,CN=Users,DC=rtp,DC=example,DC=test
cumulus@switch:~$ nv set system aaa ldap secret 1Q2w3e4r!
cumulus@switch:~$ nv config apply
以下示例在使用多个 LDAP 服务器时将 ldapserver2 的优先级设置为 2
cumulus@switch:~$ nv set system aaa ldap server ldapserver2 priority 2
编辑 /etc/nslcd.conf 文件以设置 URI 和 BIND 凭据,然后取消注释这些行
cumulus@switch:~$ sudo nano /etc/nslcd.conf
...
# The location at which the LDAP server(s) should be reachable.
uri ldaps://ldapserver1:388/
#uripriority 1
...
# The DN to bind with for normal lookups.
binddn CN=cumulus admin,CN=Users,DC=rtp,DC=example,DC=test
bindpw 1Q2w3e4r!
...
设置身份验证顺序
要优先设置 Cumulus Linux 尝试不同身份验证方法的顺序,以验证用户对交换机的访问权限,您可以设置身份验证顺序。默认情况下,Cumulus Linux 根据用户的本地密码验证用户。
如果您将身份验证顺序设置为从 LDAP 开始,但 LDAP 服务器目录中没有该用户或未响应,则 Cumulus Linux 会尝试本地密码身份验证。
要将身份验证顺序设置为先从 LDAP 开始,然后再进行本地身份验证
cumulus@switch:~$ nv set system aaa authentication-order 1 ldap
cumulus@switch:~$ nv config apply
要将身份验证顺序设置为先从本地身份验证开始,然后再查询 LDAP
cumulus@switch:~$ nv set system aaa authentication-order 1 local
cumulus@switch:~$ nv set system aaa authentication-order 2 ldap
cumulus@switch:~$ nv config apply
编辑 /etc/nsswitch.conf 文件,并在 passwd 和 group 选项的 files 之前添加 ldap 以首先尝试 LDAP 身份验证,或者首先配置 files 以优先考虑本地身份验证
cumulus@switch:~$ sudo nano /etc/nsswitch.conf
...
passwd: ldap files
group: ldap files
shadow: files
gshadow: files
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
搜索功能
当 LDAP 客户端请求有关资源的信息时,客户端必须连接并绑定到服务器,然后根据查找执行一个或多个资源查询。所有对 LDAP 服务器的搜索查询都使用配置的搜索基准、过滤器和所需的条目 (uid=myuser)。如果 LDAP 目录很大,则此搜索将花费很长时间。为常用映射(passwd 和 group)定义更具体的搜索基准。
cumulus@switch:~$ nv set system aaa ldap base-dn ou=support,dc=rtp,dc=example,dc=test
cumulus@switch:~$ nv config apply
编辑 /etc/nslcd.conf 文件以添加搜索基准
cumulus@switch:~$ sudo nano /etc/nslcd.conf
...
# The search base that will be used for all queries.
base ou=support,dc=rtp,dc=example,dc=test
搜索范围
您可以将搜索范围设置为一个级别,以将搜索级别限制为基准 DN 下的直接用户,或设置为子树,以搜索基准 DN 下所有分支中的用户。默认设置为子树。
要将搜索范围设置为一个级别
cumulus@switch:~$ nv set system aaa ldap scope one-level
cumulus@switch:~$ nv config apply
要将搜索范围设置回默认设置(子树)
cumulus@switch:~$ nv set system aaa ldap scope subtree
cumulus@switch:~$ nv config apply
编辑 /etc/nslcd.conf 文件以将 scope 选项设置为 one。
cumulus@switch:~$ sudo nano /etc/nslcd.conf
...
# The search scope.
scope one
...
要将搜索范围设置回默认设置(子树),请将 scope 选项设置为 sub
搜索过滤器
要在验证用户身份时限制搜索范围,请使用搜索过滤器在目录中搜索对象时指定条件。
编辑 /etc/nslcd.conf 文件以设置 filter passwd、filter group 或 filter shadow 选项。
cumulus@switch:~$ sudo nano /etc/nslcd.conf
...
# filters and maps
filter passwd cumulus
filter group cn
filter shadow 1234
...
属性映射
map 配置允许您覆盖从 LDAP 推送的属性。要覆盖给定 map 的属性,请指定属性名称和新值。
编辑 /etc/nslcd.conf 文件以设置 map passwd 和 map group 选项。
cumulus@switch:~$ sudo nano /etc/nslcd.conf
...
# filters and maps
...
map passwd homedirectory /home/$sAMAccountName
map passwd userpassword cumulus
map group cn sAMAccountName
map group gidnumber objectSid:S-1-5-21-1391733952-3059161487-1245441232
...
LDAP 版本
Cumulus Linux 默认使用 LDAP 版本 3。如果您需要将 LDAP 版本更改为 2
cumulus@switch:~$ nv set system aaa ldap version 2
cumulus@switch:~$ nv config apply
编辑 /etc/etc/nslcd.conf 文件以更改 ldap_version。
cumulus@switch:~$ sudo nano /etc/nslcd.conf
...
# The LDAP protocol version to use.
ldap_version 2
...
LDAP 超时
Cumulus Linux 提供两个超时设置
- 绑定超时设置 BIND 操作超时的秒数。默认设置为 5 秒。
- 搜索超时设置搜索超时的秒数。默认设置为 5 秒。
以下示例将 BIND 会话超时和搜索超时都设置为 60 秒。
cumulus@switch:~$ nv set system aaa ldap timeout-bind 60
cumulus@switch:~$ nv set system aaa ldap timeout-search 60
cumulus@switch:~$ nv config apply
编辑 /etc/nslcd.conf 文件以更改 bind_timelimit 选项和 timelimit 选项。
cumulus@switch:~$ sudo nano /etc/nslcd.conf
...
bind_timelimit 60
timelimit 60
...
SSL 选项
您可以配置以下 SSL 选项
- SSL 模式。您可以指定
none、ssl或start-tls。 - SL 端口。
- SSL 证书验证。
- SSL 密码套件。您可以指定 TLS1.2、TLS1.3、TLS-CIPHERS 或 all。
- SSL CRL 检查。
以下示例将 SSL 模式设置为 SSL,端口设置为 8443,启用 SSL 证书检查器,将 SSL 密码套件设置为 TLS1.3,并将证书吊销列表设置为 /etc/ssl/certs/rtp-example-ca.crt。
cumulus@switch:~$ nv set system aaa ldap ssl mode ssl
cumulus@switch:~$ nv set system aaa ldap ssl port 8443
cumulus@switch:~$ nv set system aaa ldap ssl cert-verify enabled
cumulus@switch:~$ nv set system aaa ldap ssl tls-ciphers TLS1.3
cumulus@switch:~$ nv set system aaa ldap ssl crl-file /etc/ssl/certs/rtp-example-ca.crt
cumulus@switch:~$ nv config apply
编辑 /etc/nslcd.conf 文件以设置 SSL 选项。
cumulus@switch:~$ sudo nano /etc/nslcd.conf
...
# SSL options
ssl on
tls_reqcert try
tls_ciphers NORMAL:-VERS-ALL:+VERS-TLS1.3
tls_crlcheck all
tls_crlfile /etc/ssl/certs/rtp-example-ca.crt
...
LDAP 引用
LDAP 引用允许在多个 LDAP 服务器之间对目录树进行分区和分发。
要启用 LDAP 引用
cumulus@switch:~$ nv set system aaa ldap referrals enabled
cumulus@switch:~$ nv config apply
编辑 /etc/nslcd.conf 文件以设置 referrals 选项。
cumulus@switch:~$ sudo nano /etc/nslcd.conf
...
referrals yes
...
显示 LDAP 设置
要在交换机上显示 LDAP 配置设置,请运行以下命令
nv show system aaa ldap显示所有 LDAP 配置设置。nv show system aaa ldap server显示配置的 LDAP 服务器及其优先级。nv show system aaa ldap server <server-id>显示指定 LDAP 服务器的优先级。nv show system aaa ldap ssl显示 LDAP SSL 配置设置。
以下示例显示所有 LDAP 配置设置
cumulus@switch:~$ nv show system aaa ldap
operational applied
-------------- --------------------------------------------------- ---------------------------------------------------
bind-dn CN=cumulus-admin,CN=Users,DC=rtp,DC=example,DC=test CN=cumulus-admin,CN=Users,DC=rtp,DC=example,DC=test
base-dn ou=users,dc=example,dc=com ou=users,dc=example,dc=com
referrals yes off
scope sub subtree
port 389 388
timeout-bind 5 5
timeout-search 5 5
secret $nvsec$4fb719e24167246947d4f746f58696fc $nvsec$4fb719e24167246947d4f746f58696fc
version 3 3
vrf default mgmt
[server] ldapserver1 ldapserver1
ssl
mode ssl ssl
port 8443 8443
cert-verify enabled enabled
tls-ciphers TLS1.3 TLS1.3
crl-file /etc/ssl/certs/rtp-example-ca.crt /etc/ssl/certs/rtp-example-ca.crt
...
以下示例显示配置的 LDAP 服务器及其优先级
cumulus@switch:~$ nv show system aaa ldap server
Hostname Priority
----------- --------
ldapserver1 1
ldapserver2 2
以下示例显示 SSL 配置设置
cumulus@switch:~$ nv show system aaa ldap ssl
operational applied
----------- --------------------------------- ---------------------------------
mode ssl ssl
port 8443 8443
cert-verify enabled enabled
tls-ciphers TLS1.3 TLS1.3
crl-file /etc/ssl/certs/rtp-example-ca.crt /etc/ssl/certs/rtp-example-ca.crt
配置 LDAP 授权
Linux 使用 sudo 命令允许非管理员用户(如默认 cumulus 用户帐户)执行特权操作。要控制可以使用 sudo 的用户,请在 /etc/sudoers 文件和 /etc/sudoers.d/ 目录中的文件中定义一系列规则。这些规则适用于组,但您也可以定义特定用户。您可以使用 LDAP 中的组名称添加 sudo 规则。例如,如果一组用户在组 netadmin 中,您可以添加规则以授予这些用户 sudo 权限。有关完整的使用说明,请参阅 sudoers 手册 (man sudoers)。以下显示了 /etc/sudoers 文件中的示例
# The basic structure of a user specification is "who where = (as_whom) what ".
%sudo ALL=(ALL:ALL) ALL
%netadmin ALL=(ALL:ALL) ALL
LDAP 验证工具
LDAP 客户端守护程序从 LDAP 检索和缓存密码和组信息。要验证 LDAP 交互,请使用这些命令行工具从设备触发 LDAP 查询。
使用 id 命令识别用户
id 命令通过遵循 NSS 中 passwd 服务的查找信息源来执行用户名查找。这将返回从信息源检索的用户 ID、组 ID 和组列表。在以下示例中,用户 cumulus 在 /etc/passwd 中本地定义,而 myuser 在 LDAP 上。NSS 配置将 passwd 映射配置为源 compat ldap
cumulus@switch:~$ id cumulus
uid=1000(cumulus) gid=1000(cumulus) groups=1000(cumulus),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev)
cumulus@switch:~$ id myuser
uid=1230(myuser) gid=3000(Development) groups=3000(Development),500(Employees),27(sudo)
getent
getent 命令检索使用 NSS 为给定映射找到的所有记录。它还可以检索该映射下的特定条目。您可以对 passwd、group、shadow 或 /etc/nslcd.conf 文件中的任何其他映射执行测试。此命令的输出根据请求的映射格式化。对于 passwd 服务,输出结构与 /etc/passwd 中的条目相同。group 映射输出的结构与 /etc/group 相同。
在此示例中,在 passwd 映射中查找特定用户,用户 cumulus 在 /etc/passwd 中本地定义,而 myuser 仅在 LDAP 中。
cumulus@switch:~$ getent passwd cumulus
cumulus:x:1000:1000::/home/cumulus:/bin/bash
cumulus@switch:~$ getent passwd myuser
myuser:x:1230:3000:My Test User:/home/myuser:/bin/bash
在下一个示例中,在组服务中查找特定组,组 cumulus 在 /etc/groups 中本地定义,而 netadmin 在 LDAP 上。
cumulus@switch:~$ getent group cumulus
cumulus:x:1000:
cumulus@switch:~$ getent group netadmin
netadmin:*:502:larry,moe,curly,shemp
运行命令 getent passwd 或 getent group 而不进行特定请求将返回 passwd 和 group 映射的所有本地和 LDAP 条目。
故障排除
nslcd 调试模式
首次设置 LDAP 身份验证时,使用 systemctl stop nslcd.service 命令(或者如果您在管理 VRF 中运行该服务,则使用 systemctl stop nslcd@mgmt.service 命令)关闭 nslcd 服务,并在调试模式下运行它。无论您使用的是通过 SSL 的 LDAP(端口 636)还是未加密的 LDAP 连接(端口 389),调试模式都有效。
cumulus@switch:~$ sudo systemctl stop nslcd.service
cumulus@switch:~$ sudo nslcd -d
启用调试模式后,运行以下命令以测试 LDAP 查询
cumulus@switch:~$ getent passwd
如果您正确配置了 LDAP,则在运行 getent 命令后,将显示以下消息
nslcd: DEBUG: accept() failed (ignored): Resource temporarily unavailable
nslcd: [8e1f29] DEBUG: connection from pid=11766 uid=0 gid=0
nslcd: [8e1f29] <passwd(all)> DEBUG: myldap_search(base="dc=example,dc=com", filter="(objectClass=posixAccount)")
nslcd: [8e1f29] <passwd(all)> DEBUG: ldap_result(): uid=myuser,ou=people,dc=example,dc=com
nslcd: [8e1f29] <passwd(all)> DEBUG: ldap_result(): ... 152 more results
nslcd: [8e1f29] <passwd(all)> DEBUG: ldap_result(): end of results (162 total)
在上面的示例输出中,<passwd(all)> 显示了对整个目录结构的查询。
您可以使用以下命令查询特定用户
cumulus@switch:~$ getent passwd myuser
您可以将 myuser 替换为交换机上的任何用户名。以下调试输出指示用户 myuser 存在
nslcd: DEBUG: add_uri(ldap://10.50.21.101)
nslcd: version 0.8.10 starting
nslcd: DEBUG: unlink() of /var/run/nslcd/socket failed (ignored): No such file or directory
nslcd: DEBUG: setgroups(0,NULL) done
nslcd: DEBUG: setgid(110) done
nslcd: DEBUG: setuid(107) done
nslcd: accepting connections
nslcd: DEBUG: accept() failed (ignored): Resource temporarily unavailable
nslcd: [8b4567] DEBUG: connection from pid=11369 uid=0 gid=0
nslcd: [8b4567] <passwd="myuser"> DEBUG: myldap_search(base="dc=cumulusnetworks,dc=com", filter="(&(objectClass=posixAccount)(uid=myuser))")
nslcd: [8b4567] <passwd="myuser"> DEBUG: ldap_initialize(ldap://<ip_address>)
nslcd: [8b4567] <passwd="myuser"> DEBUG: ldap_set_rebind_proc()
nslcd: [8b4567] <passwd="myuser"> DEBUG: ldap_set_option(LDAP_OPT_PROTOCOL_VERSION,3)
nslcd: [8b4567] <passwd="myuser"> DEBUG: ldap_set_option(LDAP_OPT_DEREF,0)
nslcd: [8b4567] <passwd="myuser"> DEBUG: ldap_set_option(LDAP_OPT_TIMELIMIT,0)
nslcd: [8b4567] <passwd="myuser"> DEBUG: ldap_set_option(LDAP_OPT_TIMEOUT,0)
nslcd: [8b4567] <passwd="myuser"> DEBUG: ldap_set_option(LDAP_OPT_NETWORK_TIMEOUT,0)
nslcd: [8b4567] <passwd="myuser"> DEBUG: ldap_set_option(LDAP_OPT_REFERRALS,LDAP_OPT_ON)
nslcd: [8b4567] <passwd="myuser"> DEBUG: ldap_set_option(LDAP_OPT_RESTART,LDAP_OPT_ON)
nslcd: [8b4567] <passwd="myuser"> DEBUG: ldap_simple_bind_s(NULL,NULL) (uri="ldap://<ip_address>")
nslcd: [8b4567] <passwd="myuser"> DEBUG: ldap_result(): end of results (0 total)