sudo基于OpenLDAP鉴权
简介
sudo是一个应用程序,允许 Linux普通用户上获取 root 或管理员权限。sudo可以通过多种方式进行配置,用户可以在本地计算机或服务器上设置 sudo,也可以通过第三方软件实现集中式的 sudo 管理。在本教程中,将使用 OpenLDAP 服务器来设置集中式的sudo配置。通过这种方式,用户可以在 OpenLDAP 服务器上实现集中管理用户和 sudo 权限,从而加快客户端的部署过程。任何在客户端机器上配置了 sudo 身份验证源的 SSSD 服务,都会允许 OpenLDAP 中的用户使用 sudo。
操作步骤
- 将 SELinux 从 Enforcing 模式切换到 Permissive 模式,防止SELinux 策略阻止OpenLDAP用户登录与sudo登录。
检查SELinux模式,可能会打印Enforcing,那就需要修改:
getenforce
将 SELinux 从 Enforcing 模式切换到 Permissive 模式:
setenforce 0
- 导入sudo schema。
- 在OpenLDAP服务端创建文件/etc/openldap/schema/sudo.schema,并写入下面内容:
# OpenLDAP schema file for Sudo # Save as /etc/openldap/schema/sudo.schema and restart slapd. # For a version that uses online configuration, see schema.olcSudo. # attributetype ( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Command(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s) impersonated by sudo (deprecated)' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Options(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Group(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.8 NAME 'sudoNotBefore' DESC 'Start of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 ) attributetype ( 1.3.6.1.4.1.15953.9.1.9 NAME 'sudoNotAfter' DESC 'End of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 ) attributetype ( 1.3.6.1.4.1.15953.9.1.10 NAME 'sudoOrder' DESC 'an integer to order the sudoRole entries' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) objectclass ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top STRUCTURAL DESC 'Sudoer Entries' MUST ( cn ) MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoOrder $ sudoNotBefore $ sudoNotAfter $ description ) )上面内容定义了类似/etc/sudoers文件中的属性,以替代/etc/sudoers文件管理系统中sudo权限。
- 执行以下命令创建转换配置文件:
cat > ./schema_conv.conf << EOL include /etc/openldap/schema/sudo.schema EOL
- 执行以下命令将schema转为ldif文件:
mkdir /tmp/ldif slaptest -f ./schema_conv.conf -F /tmp/ldif/
- 将生成的ldif文件复制到schema目录:
cp /tmp/ldif/cn\=config/cn\=schema/cn\=\{0\}sudo.ldif /etc/openldap/schema/sudo.ldif - 打开sudo.ldif将dn和cn修改为下图所示:
并删除文件末尾的下面这些行,行的内容根据实际情况会有所不同:
structuralObjectClass: olcSchemaConfig entryUUID: b1d84e62-d5fa-103f-92ae-45f3b9c81bd2 creatorsName: cn=config createTimestamp: 20250605014651Z entryCSN: 20250605014651.004275Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20250605014651Z
- 执行以下命令修改文件权限:
chown ldap:ldap /etc/openldap/schema/sudo.ldif
- 执行以下命令将上述schema导入OpenLDAP,使OpenLDAP能支持sudo配置:
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/sudo.ldif systemctl restart slapd
- 在OpenLDAP服务端创建文件/etc/openldap/schema/sudo.schema,并写入下面内容:
- 创建sudoers组织单元。
- 在OpenLDAP客户端,创建sudoers.ldif文件,并写入以下内容:
其中dc=huawei是示例,可按自己业务需要改为如your_company等名称。
dn: ou=sudoers,dc=huawei,dc=com objectClass: organizationalUnit objectClass: top ou: sudo description: Default ou for SUDO dn: cn=defaults,ou=sudoers,dc=huawei,dc=com objectClass: sudoRole objectClass: top cn: defaults sudoHost: ALL sudoOption: secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
这个配置将创建sudoers组织单元,并添加默认配置。
本例域名和sudo默认配置项仅作演示,请根据实际情况进行修改。
- 执行以下命令向OpenLDAP服务端添加sudoers配置:
ldapadd -x -D cn=root,dc=huawei,dc=com -W -f sudoers.ldif
命令中的管理员账户请根据实际OpenLDAP部署情况进行修改。
- 在OpenLDAP客户端,创建sudoers.ldif文件,并写入以下内容:
- 在OpenLDAP服务端执行添加OpenLDAP用户到sudoers组织单元。
- 如果将已有OpenLDAP用户(比如以test1为例)添加到sudoers组织单元,请创建user_add.ldif文件并写入以下内容:
dn: cn=test1,ou=sudoers,dc=huawei,dc=com objectClass: sudoRole objectClass: top cn: test1 sudoCommand: ALL sudoHost: ALL sudoRunAsUser: ALL sudoUser: test1
如果想在创建OpenLDAP用户(比如以test2为例)时默认添加到sudoers组织单元,请创建user_add.ldif文件并写入以下内容:dn: uid=test2,ou=People,dc=huawei,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount cn: test2 sn: temp userPassword: {SSHA}cDG5NuQd+rYn6rWh1r5UnysUOwJlt1uk loginShell: /bin/bash uidNumber: 2000 gidNumber: 2000 homeDirectory: /home/test2 shadowExpire:99999 shadowLastChange: 9999999 shadowMax: 99999 shadowWarning: 7 dn: cn=test2,ou=Group, dc=huawei,dc=com objectClass: posixGroup cn: test2 gidNumber: 2000 memberUid: test2 dn: cn=test2,ou=sudoers, dc=huawei,dc=com objectClass: sudoRole objectClass: top cn: test2 sudoCommand: ALL sudoHost: ALL sudoRunAsUser: ALL sudoUser: test2
请根据实际情况修改home目录、用户名、uidNumber、gidNumber、userPassword、sudo等配置项内容;userPassword可以使用slappasswd命令进行生成。
- 执行以下命令向OpenLDAP服务端添加配置:
ldapadd -x -D cn=root,dc=huawei,dc=com -W -f user_add.ldif
- 如果将已有OpenLDAP用户(比如以test1为例)添加到sudoers组织单元,请创建user_add.ldif文件并写入以下内容:
- 客户端配置。
- 向/etc/nsswitch.conf添加以下配置,使sssd服务可以管理sudoers配置:
sudoers: files sss
效果如下:

- 修改/etc/sssd/sssd.conf文件中下面加粗部分,非加粗部分可以不做修改,具体内容如下:
[domain/ldap] enumerate= False ldap_schema = rfc2307bis autofs_provider = ldap cache_credentials = False ldap_search_base = dc=huawei,dc=com id_provider = ldap auth_provider = ldap chpass_provider = ldap ldap_sudo_search_base = ou=sudoers,dc=huawei,dc=com sudo_provider = ldap ldap_uri = ldaps://huawei.com ldap_tls_reqcert = allow ldap_tls_cacertdir = /etc/openldap/ssl ldap_search_timeout = 90 ldap_network_timeout = 90 timeout = 30 ldap_id_use_start_tls = false [sssd] services = nss, pam, sudo domains = ldap [nss] homedir_substring = /home
效果如下:

上述段落名[domain/ldap]和sssd段落下的domains等字段请根据实际情况修改。
- 执行以下命令清理sssd缓存并重启sssd服务:
systemctl stop sssd sss_cache -E systemctl restart sssd
- 向/etc/nsswitch.conf添加以下配置,使sssd服务可以管理sudoers配置:
- sudo命令验证。
- 登录OpenLDAP用户(此处以test1用户为例)后执行sudo -l,效果如下:

如果是在HCE作为OpenLDAP客户端,且Rocky Linux作为OpenLDAP服务端的场景下,还要继续参考以下操作步骤继续修改:
- 登录OpenLDAP用户(此处以test1用户为例)后执行sudo -l,效果如下:
- 修改OpenLDAP客户端的/etc/sssd/sssd.conf文件为以下内容,可以用以下内容做覆盖:
修改前先备份/etc/sssd/sssd.conf!
[domain/ldap] enumerate = false ldap_schema = rfc2307bis autofs_provider = ldap cache_credentials = True ldap_search_base = dc=huawei,dc=com id_provider = ldap auth_provider = ldap chpass_provider = ldap ldap_sudo_search_base = ou=sudoers,dc=huawei,dc=com sudo_provider = ldap ldap_uri = ldap://192.168.122.254:389 ldap_tls_reqcert = allow ldap_tls_cacertdir = /etc/openldap/cacerts ldap_search_timeout = 90 ldap_network_timeout = 90 ldap_id_use_start_tls = false access_provider = ldap debug_level = 9 ldap_default_bind_dn = cn=root,dc=huawei,dc=com ldap_default_authtok_type = password ldap_default_authtok = 123456 # ldap_sudo_filter = (objectClass=sudoRole) use_fully_qualified_names = false debug_level = 9 [sssd] services = nss, pam, sudo domains = ldap timeout = 30 [nss] homedir_substring = /home filter_groups = root filter_users = root
其中,domains的值要与标签[domain/xxx]中的xxx保持一致。修改/etc/sssd/sssd.conf文件保存后,需要重启sssd服务。chmod 600 /etc/sssd/sssd.conf systemctl stop sssd sss_cache -E systemctl start sssd systemctl enable sssd systemctl status sssd
检查sssd服务是否存在报错,判断/etc/sssd/sssd.conf是否存在问题。tail /var/log/sssd/sssd.log
- 修改OpenLDAP客户端的/etc/nsswitch.conf为以下内容。
要求/etc/nsswitch.conf内必须有sudoers: files sss,表示sudo规则先从/etc/sudoers读,再从sssd缓存中读;passwd 和 group 要带有 sss。
该/etc/nsswitch.conf不可用vim手动修改,因为authselect的存在导致手动修改不会生效。
/etc/nsswitch.conf的修改方式:
修改前先备份/etc/nsswitch.conf!
# 检查当前 authselect 状态 authselect current # 要求返回 # Profile ID: sssd # Enabled features: # - with-sudo # 说明使用了 authselect,你的手动修改可能被忽略! # (选做)若未看到 with-sudo,返回No existing configuration detected.,则需要启用 sudo 功能,先强制选择 profile 并启用 sudo,执行以下命令 authselect select sssd with-sudo --force # 重试检查当前 authselect 状态 authselect current # (选做)查看可用authselect 功能,确认是否支持 with-sudo 功能 authselect list-features # (选做)尝试启用 sudo 功能(可能失败),如果提示 /etc/nsswitch.conf 被手动修改过,会报错:[error] 检测到对配置的意外更改。 authselect enable-feature with-sudo # (选做)恢复默认 nsswitch.conf(如被覆盖) cp /usr/share/authselect/default/sssd/nsswitch.conf /etc/nsswitch.conf # 应用更改 authselect apply-changes # 重启 SSSD 服务并清除缓存 systemctl restart sssd sss_cache -E # 验证 sudo 是否已启用 authselect current | grep with-sudo # (选做)如果没有,立即执行: authselect enable-feature with-sudo # 重新加载 authselect apply-changes # 重启 SSSD 服务并清除缓存 systemctl restart sssd sss_cache -E # 此时可以检查/etc/nsswitch.conf、/etc/pam.d/system-auth、/etc/pam.d/password-auth都已被覆盖修改
修改并保存效果如图:

- 修改OpenLDAP客户端的/etc/pam.d/system-auth为以下内容。
HCE OpenLDAP客户端的/etc/pam.d/system-auth里引用的是库文件pam_ldap.so。
/etc/pam.d/system-auth可参考修改为如下:
修改前先备份/etc/pam.d/system-auth!
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth required pam_faildelay.so delay=2000000 auth sufficient pam_fprintd.so auth [default=1 ignore=ignore success=ok] pam_succeed_if.so uid >= 1000 quiet auth [default=1 ignore=ignore success=ok] pam_localuser.so auth sufficient pam_unix.so nullok try_first_pass auth sufficient pam_ldap.so use_first_pass auth requisite pam_succeed_if.so uid >= 1000 quiet_success account required pam_oddjob_mkhomedir.so umask=0077 auth sufficient pam_ldap.so forward_pass auth required pam_deny.so account required pam_unix.so broken_shadow account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet account [default=bad success=ok user_unknown=ignore] pam_ldap.so account required pam_permit.so account required pam_oddjob_mkhomedir.so umask=0077 password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so md5 shadow nis nullok try_first_pass use_authtok password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok password sufficient pam_ldap.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session optional pam_oddjob_mkhomedir.so umask=0077 session optional pam_mkhomedir.so umask=0077 session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so session optional pam_ldap.so
修改并保存效果如图:

- 修改OpenLDAP客户端的/etc/pam.d/password-auth为以下内容。
HCE OpenLDAP客户端的/etc/pam.d/password-auth里引用的是库文件pam_ldap.so。
/etc/pam.d/password-auth可参考修改为如下:
修改前先备份/etc/pam.d/password-auth!
#%PAM-1.0 # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth required pam_faillock.so preauth audit deny=3 even_deny_root unlock_time=300 auth sufficient pam_unix.so nullok try_first_pass -auth sufficient pam_ldap.so use_first_pass auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=300 auth sufficient pam_faillock.so authsucc audit deny=3 even_deny_root unlock_time=300 auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet -account [default=bad success=ok user_unknown=ignore] pam_ldap.so account required pam_permit.so password requisite pam_pwquality.so minlen=8 minclass=3 enforce_for_root try_first_pass local_users_only retry=3 dcredit=0 ucredit=0 lcredit=0 ocredit=0 password required pam_pwhistory.so use_authtok remember=5 enforce_for_root password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok -password sufficient pam_ldap.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so -session optional pam_ldap.so
修改并保存效果如图:

- 修改OpenLDAP客户端的/etc/hosts。
添加OpenLDAP服务端主机信息、本机OpenLDAP客户端信息。
例如:echo '192.168.122.254 ldap01.huawei.com' >> /etc/hosts
效果如图所示:

- 修改OpenLDAP服务端的/etc/hosts。
添加OpenLDAP服务端主机信息,下图示例中ldap01就是此Rocky Linux作为OpenLDAP服务端的虚机。

- 检查或修改OpenLDAP客户端的/etc/pam.d/sudo为以下内容
#%PAM-1.0 auth include system-auth account include system-auth password include system-auth session include system-auth

- 确认OpenLDAP客户端nslcd已运行。
HCE作为OpenLDAP客户端时,确保nslcd已启用:
systemctl status nslcd
- OpenLDAP客户端停用nscd缓存服务。
可选,不一定需要停用。
停止 nscd:
systemctl stop nscd
禁用开机启动:
systemctl disable nscd
