sudo基于ldap鉴权
简介
sudo是一个应用程序,允许用户在 Linux 上获取 root 或管理员权限。sudo可以通过多种方式进行配置,用户可以在本地计算机或服务器上设置 sudo,也可以通过第三方软件实现集中式的 sudo 管理。在本教程中,将使用 OpenLDAP 服务器来设置集中式的 sudo 部署。通过这种方式,用户可以在 OpenLDAP 服务器上实现集中管理用户和 sudo 权限,从而加快客户端的部署过程。任何在客户端机器上配置了 sudo 身份验证源的 SSSD 服务,都会允许 OpenLDAP 中的用户使用 sudo。
前置条件
- 已完成yum源的配置,配置方式可参考HCE的REPO源配置与软件安装进行公网yum源的配置。
- 已经部署OpenLDAP服务端和客户端
- 客户端已经安装并配置SSSD 服务
操作步骤
- 导入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 ) )
- 执行以下命令创建转换配置文件:
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导入ldap,使ldap能支持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文件,并写入以下内容:
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默认配置项仅作演示,请根据实际情况进行修改
- 执行以下命令向ldap服务端添加sudoers配置:
ldapadd -x -D cn=Manager,dc=huawei,dc=com -W -f sudoers.ldif
命令中的管理员账户请根据实际OpenLDAP部署情况进行修改
- 在OpenLDAP客户端,创建sudoers.ldif文件,并写入以下内容:
- 添加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 shadowLastChange: 0 shadowMax: 0 shadowWarning: 0 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=Manager,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,效果如下:
- 登录OpenLDAP用户(此处以test1用户为例)后执行sudo -l,效果如下: