本页内容
- 准备工作
- 将 Sudoers Schema 导入 OpenLDAP 服务器
- 为 Sudo 创建组织单元(OU)
- 将 OpenLDAP 用户添加到 Sudo
- 配置 OpenLDAP 客户端机器
- 验证 Sudoers 与 OpenLDAP 服务器的集成
- 结论
Sudo 是一款应用程序,可让你在 Linux 和 Unix 操作系统上获取 root 或管理员权限。Sudo 在大多数 Linux 发行版中默认已安装;你也可以通过 /etc/sudoers 文件配置用户授权,从而让非特权用户以 root 用户身份执行特定命令。
Sudo 有多种配置方式,你可以在本地计算机/服务器上配置 sudo,也可以通过第三方软件搭建集中式 sudo。在本示例中,你将使用 OpenLDAP 服务器来搭建集中式的 sudo 部署。
在本教程中,我们将配置并把 sudoers 集成到 OpenLDAP 服务器。这样,你就能在 OpenLDAP 服务器上实现对用户和 sudo 权限的集中管理,从而加快客户端的部署。客户端机器上任何配置了 sudo 认证来源的 SSSD 服务,都允许 OpenLDAP 用户执行 sudo。
准备工作
你必须确保满足以下要求,才能完成本指南:
- 一台已安装并配置好 OpenLDAP Server 的服务器。
- 一台已配置好 OpenLDAP Client 与 SSSD 服务的客户端机器。
- 如果你使用的是基于 RHEL 的发行版,请确保 SELinux 运行在 Permissive(宽松)模式下。
本示例将使用两台机器分别作为 OpenLDAP 服务器和客户端。两台机器均运行 Rocky Linux 9 服务器版。下面是详细的服务器信息:
Hostname IP Address Used as Domain/FQDN -------------------------------------------------------------- ldap 192.168.5.25 OpenLDAP Server ldap.hwdomain.lan client 192.168.5.80 OpenLDAP Client client.hwdomain.lan
将 Sudoers Schema 导入 OpenLDAP 服务器
在第一步中,你必须将默认的 sudoers LDAP schema 导入到你的 OpenLDAP 服务器。这可以通过 LDIF 文件和 ' ldapadd ' 工具来完成。
登录到 OpenLDAP 服务器,并通过执行下面的 cp 命令复制 LDAP 默认的 sudoers schema。
sudo cp /usr/share/doc/sudo/schema.OpenLDAP /etc/openldap/schema/sudo.schema
接下来,执行以下 nano 编辑器命令,创建一个新的 LDIF 文件 '/etc/openldap/schema/sudo.ldif '。
sudo nano /etc/openldap/schema/sudo.ldif
将以下行添加到文件中。
dn: cn=sudo,cn=schema,cn=config objectClass: olcSchemaConfig cn: sudo olcAttributeTypes: ( 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 ) olcAttributeTypes: ( 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 ) olcAttributeTypes: ( 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 ) olcAttributeTypes: ( 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 ) olcAttributeTypes: ( 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 ) olcAttributeTypes: ( 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 ) olcAttributeTypes: ( 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 ) olcObjectClasses: ( 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 $ description ) )
完成后保存并退出文件。
更改 sudoers LDIF 文件 '/etc/openldap/schema/sudo.ldif' 的所有权,以确保 OpenLDAP 能够访问它。
sudo chown ldap:ldap /etc/openldap/schema/sudo.ldif
现在执行以下 ' ldapadd ' 命令,将 sudoers LDAP schema 添加到 OpenLDAP 服务器。这样你将在 OpenLDAP 服务器上添加一个名为 ' sudo ' 的新 ' cn ',并允许 ' cn=sudo ' 中的任意 OpenLDAP 用户在客户端机器上执行 sudo 命令。
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/sudo.ldif
成功后,你应当看到类似 ' adding new entry "cn=sudo,cn=schema,ch=config" ' 的输出。

既然已经添加了 sudoers LDAP schema,接下来你需要为 sudoers 创建一个 ' ou '(组织单元,Organizational Unit)。
为 Sudo 创建组织单元
添加 sudoers LDAP schema 之后,接下来你将创建一个名为 'sudo' 的新 ' ou '(组织单元),该单元内的任意 OpenLDAP 用户都可以执行 sudo 命令。同时,你还将为 OpenLDAP 用户设置默认的 sudoers 配置。
执行以下 nano 编辑器命令来创建一个新文件 ' sudoers.ldif '。
sudo nano sudoers.ldif
将以下行添加到文件中,并务必将主域名替换为你的 OpenLDAP 服务器域名。
# sudoers.ldif dn: ou=sudo,dc=hwdomain,dc=lan objectClass: organizationalUnit objectClass: top ou: sudo description: Default ou for SUDO
完成后保存并关闭文件。
接下来,执行以下 ' ldapadd ' 命令,将 sudoers ou 添加到 OpenLDAP 服务器。当提示输入密码时,输入正确的 OpenLDAP root 密码。
sudo ldapadd -x -D cn=Manager,dc=hwdomain,dc=lan -W -f sudoers.ldif
操作成功后,你应当收到类似 ' adding new entry "ou=sudo,dc=hwdomain,dc=lan" ' 的输出。

现在执行以下 ' ldapsearch ' 命令,在 OpenLDAP 服务器上查找值为 ' sudo ' 的 ' ou '。
sudo ldapsearch -x -b "dc=hwdomain,dc=lan" ou=sudo
下面的输出确认 'ou=sudo ' 已成功添加,并可在 OpenLDAP 服务器上使用。

接下来,创建另一个用于定义默认 sudoers 配置的 LDIF 文件。执行以下 nano 编辑器命令来创建一个新文件 ' sudoconf.ldif '。
sudo nano sudoconf.ldif
将以下行添加到文件中。
# sudoconf.ldif dn: cn=defaults,ou=sudo,dc=hwdomain,dc=lan objectClass: sudoRole objectClass: top cn: defaults sudoOption: env_reset sudoOption: mail_badpass sudoOption: secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin #sudoOrder: 1
完成后保存并关闭文件。
现在执行下面的 ' ldapadd ' 命令,将默认 sudoers 配置添加到 OpenLDAP 服务器。' ou=sudo ' 中的任意 OpenLDAP 用户都会应用该默认 sudoers 配置。
sudo ldapadd -x -D cn=Manager,dc=hwdomain,dc=lan -W -f sudoconf.ldif
出现提示时输入你的 OpenLDAP root 密码。成功后,你会看到类似如下的输出:

至此,OpenLDAP 服务器上的 sudoers 配置已完成。你现在可以将 OpenLDAP 用户添加到 'ou=sudo ',从而允许这些用户执行 sudo 命令。
将 OpenLDAP 用户添加到 Sudo
在本节中,你将学习如何把 OpenLDAP 用户添加到 'ou=sudo',以允许用户在 OpenLDAP 客户端机器上执行 'sudo' 命令。你可以将已有的 OpenLDAP 用户添加到 ' ou=sudo ',或者使用 ' ou=sudo ' 创建一个新用户。
使用以下 nano 编辑器命令创建一个新文件 'adduser_sudo.ldif'。
nano adduser_sudo.ldif
将以下行添加到文件中。这会将已有的 OpenLDAP 用户 'rocky' 添加到 ' ou=sudo ',并允许用户 'rocky' 在客户端机器上执行 ' sudo ' 命令。同时,务必将域名 ' dc=hwdomain,dc=lan ' 替换为你的 OpenLDAP 服务器域名。
# adduser_sudo.ldif dn: cn=rocky,ou=sudo,dc=hwdomain,dc=lan objectClass: sudoRole objectClass: top cn: rocky sudoCommand: ALL sudoHost: ALL sudoRunAsUser: ALL sudoUser: rocky
完成后保存并关闭文件。
如果你想创建一个带有默认 ' ou=sudo ' 的新 OpenLDAP 用户,请使用以下 LDIF 文件,并务必修改 ' userPassword '、用户名以及默认域名等参数,使其适配你的 OpenLDAP 服务器。
# adduser.ldif
dn: uid=rocky,ou=People,dc=hwdomain,dc=lan
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: rocky
sn: temp
userPassword: {SSHA}cDG5NuQd+rYn6rWh1r5UnysUOwJlt1uk
loginShell: /bin/bash
uidNumber: 2000
gidNumber: 2000
homeDirectory: /home/rocky
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0
dn: cn=rocky,ou=Group,dc=hwdomain,dc=lan
objectClass: posixGroup
cn: rocky
gidNumber: 2000
memberUid: rocky
dn: cn=rocky,ou=sudo,dc=hwdomain,dc=lan
objectClass: sudoRole
objectClass: top
cn: rocky
sudoCommand: ALL
sudoHost: ALL
sudoRunAsUser: ALL
sudoUser: rocky
接下来,执行下面的 'ldapadd' 命令,将更改应用到 OpenLDAP 服务器。出现提示时,输入你的 OpenLDAP 服务器密码。
sudo ldapadd -x -D cn=Manager,dc=hwdomain,dc=lan -W -f adduser_sudo.ldif
成功后,你应当收到类似 ' adding new entry "cn=rocky,ou=sudo,dc=hwdomain,dc=lan" ' 的输出。

最后,执行以下 ' ldapsearch ' 命令来显示并验证 ' ou=sudo ' 上的用户列表。这样,你应当能看到新添加的用户已经存在于 ' ou=sudo ' 中。
sudo ldapsearch -x -b "ou=sudo,dc=hwdomain,dc=lan"

至此,你已将一个名为 ' rocky ' 的已有 OpenLDAP 用户添加到 ' ou=sudo ',并允许该用户在客户端机器上执行 ' sudo ' 命令。
在下一步中,你将为 SSSD 服务添加新配置,以启用基于 OpenLDAP 服务器的 sudoers。
配置 OpenLDAP 客户端机器
在客户端机器上,你必须为 nsswitch 与 sssd 配置添加一些设置。请务必在 OpenLDAP 客户端机器上执行后续命令。
在 Nsswitch 配置文件 '/etc/nsswitch.conf ' 中,你应该定义 sudoers 名称服务,以允许通过 SSSD 服务管理 sudoers。接着,在 SSSD 配置文件 '/etc/sssd/sssd.conf ' 中,你必须添加 ' ldap ' 类型的 ' sudo_provider ',定义 ' sudo ' 服务,然后添加 ' [sudo]' 段落用于额外的 sudoers 配置。
使用以下 nano 编辑器命令打开 Nsswitch 配置文件 ' /etc/nsswitch.conf '。
sudo nano /etc/nsswitch.conf
添加以下配置来定义 ' sudoers ' 名称服务,并允许其通过 SSSD 服务进行管理。
sudoers: files sss
完成后保存并关闭文件。

接下来,执行以下 nano 编辑器命令,打开 SSSD 配置文件 '/etc/sssd/sssd.conf '。
sudo nano /etc/sssd/sssd.conf
在 ' [domain/default] ' 段落中,添加新参数 ' sudoers_base ' 和 ' sudo_provider '。在 ' [sssd ]' 段落中,你必须在 ' services ' 参数上添加 ' sudo '。如果需要额外的 sudoers 配置,请在末尾添加 ' [sudo] ' 段落。
[domain/default] .... sudoers_base ou=sudo,dc=hwdomain,dc=lan sudo_provider = ldap [sssd] services = nss, pam, autofs, sudo domains = default [nss] homedir_substring = /home [sudo]
完成后保存并关闭文件。

最后,执行以下 systemctl 命令来重启 SSSD 服务并应用更改。
sudo systemctl restart sssd
重启 SSSD 服务后,通过 OpenLDAP 服务器进行的 sudoers 管理现已启用。任何登录到默认 sudo ou 的 OpenLDAP 用户,都可以在客户端机器上执行 ' sudo ' 命令。
验证 Sudoers 与 OpenLDAP 服务器的集成
从 OpenLDAP 服务器,使用 OpenLDAP 用户 ' rocky ',通过下面的 ' ssh ' 命令登录到 IP 地址为 ' 192.168.5.80 ' 的客户端机器。
ssh
[email protected]
出现提示时,输入该用户的密码。成功后,你应当已登录到 OpenLDAP 客户端机器。

执行以下命令来验证当前使用的用户、gid 和 uid。你应当看到输出显示 OpenLDAP 用户 ' rocky ' 的 gid 和 uid 均为 ' 2000 '。
id
whoami
最后,执行以下 ' sudo su ' 命令来验证 sudoers 与 OpenLDAP 服务器的集成。
sudo su
出现提示时,输入用户 ' rocky ' 的密码。成功后,你的终端提示符将变为 ' root@client .... '。
现在重新执行以下命令来验证当前使用的用户,你应当看到当前用户为 ' root '。
id
whoami
这证实了 sudoers 与 OpenLDAP 服务器的集成已完成且成功。
结论
在本教程中,你已完成 sudoers 与 OpenLDAP 服务器的配置和集成,使 OpenLDAP 用户能够在客户端机器上执行 'sudo' 命令。你还在客户端机器上将 sudoers 与 SSSD 服务集成,从而自动为 OpenLDAP 用户启用 sudo。
至此,你可以将更多 OpenLDAP 用户添加到 'ou=sudo',以允许这些用户在客户端机器上执行 sudo。同时,你必须更新客户端机器上 nsswitch 与 SSSD 的配置,以便 OpenLDAP 用户能够连接到 OpenLDAP 的 sudo 提供方。
欲了解有关 OpenLDAP 的更多细节,请查阅 OpenLDAP 的官方文档。有关 Sudoers 的内容,请访问 sudoers 的文档。