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)