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 文件,并在 passwdgroup 选项的 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 目录很大,则此搜索将花费很长时间。为常用映射passwdgroup)定义更具体的搜索基准。

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

搜索过滤器

要在验证用户身份时限制搜索范围,请使用搜索过滤器在目录中搜索对象时指定条件。

NVUE 不提供限制搜索范围的命令。

编辑 /etc/nslcd.conf 文件以设置 filter passwdfilter groupfilter shadow 选项。

cumulus@switch:~$ sudo nano /etc/nslcd.conf
...
# filters and maps
filter passwd cumulus
filter group cn
filter shadow 1234
...

属性映射

map 配置允许您覆盖从 LDAP 推送的属性。要覆盖给定 map 的属性,请指定属性名称和新值。

NVUE 不提供属性映射的命令。

编辑 /etc/nslcd.conf 文件以设置 map passwdmap 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 模式。您可以指定 nonesslstart-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 为给定映射找到的所有记录。它还可以检索该映射下的特定条目。您可以对 passwdgroupshadow/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 passwdgetent group 而不进行特定请求将返回 passwdgroup 映射的所有本地和 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)