更新时间:2025-07-29 GMT+08:00
分享

sudo基于ldap鉴权

简介

sudo是一个应用程序,允许用户在 Linux 上获取 root 或管理员权限。sudo可以通过多种方式进行配置,用户可以在本地计算机或服务器上设置 sudo,也可以通过第三方软件实现集中式的 sudo 管理。在本教程中,将使用 OpenLDAP 服务器来设置集中式的 sudo 部署。通过这种方式,用户可以在 OpenLDAP 服务器上实现集中管理用户和 sudo 权限,从而加快客户端的部署过程。任何在客户端机器上配置了 sudo 身份验证源的 SSSD 服务,都会允许 OpenLDAP 中的用户使用 sudo。

前置条件

  • 已完成yum源的配置,配置方式可参考HCE的REPO源配置与软件安装进行公网yum源的配置。
  • 已经部署OpenLDAP服务端和客户端
  • 客户端已经安装并配置SSSD 服务

操作步骤

  1. 导入sudo schema

    1. 在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 )
          )
    2. 执行以下命令创建转换配置文件:
      cat > ./schema_conv.conf << EOL
      include /etc/openldap/schema/sudo.schema
      EOL
    3. 执行以下命令将schema转为ldif文件:
      mkdir /tmp/ldif
      slaptest -f ./schema_conv.conf -F /tmp/ldif/
    4. 将生成的ldif文件复制到schema目录:
      cp /tmp/ldif/cn\=config/cn\=schema/cn\=\{0\}sudo.ldif /etc/openldap/schema/sudo.ldif
    5. 打开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
    6. 执行以下命令修改文件权限:
      chown ldap:ldap /etc/openldap/schema/sudo.ldif
    7. 执行以下命令将上述schema导入ldap,使ldap能支持sudo配置:
      ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/sudo.ldif
      systemctl restart slapd

  2. 创建sudoers组织单元

    1. 在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默认配置项仅作演示,请根据实际情况进行修改

    2. 执行以下命令向ldap服务端添加sudoers配置:
      ldapadd -x -D cn=Manager,dc=huawei,dc=com -W -f sudoers.ldif

      命令中的管理员账户请根据实际OpenLDAP部署情况进行修改

  3. 添加OpenLDAP用户到sudoers组织单元

    1. 如果将已有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命令进行生成。

    2. 执行以下命令向OpenLDAP服务端添加配置:
      ldapadd -x -D cn=Manager,dc=huawei,dc=com -W -f user_add.ldif

  4. 客户端配置

    1. 向/etc/nsswitch.conf添加以下配置,使sssd服务可以管理sudoers配置:
      sudoers: files sss

      效果如下:

    2. 修改/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等字段请根据实际情况修改

    3. 执行以下命令清理sssd缓存并重启sssd服务:
      systemctl stop sssd
      sss_cache -E
      systemctl restart sssd

  5. sudo命令验证

    1. 登录OpenLDAP用户(此处以test1用户为例)后执行sudo -l,效果如下:

相关文档