文档首页/ Huawei Cloud EulerOS/ 最佳实践/ sudo基于OpenLDAP鉴权
更新时间:2026-03-02 GMT+08:00
分享

sudo基于OpenLDAP鉴权

简介

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

前置条件

已完成本机yum源的配置,可参考HCE的REPO源配置与软件安装进行yum源的配置。

  • 已经部署OpenLDAP服务端和客户端。
  • 客户端已经安装并配置SSSD 服务。

操作步骤

  1. 将 SELinux 从 Enforcing 模式切换到 Permissive 模式,防止SELinux 策略阻止OpenLDAP用户登录与sudo登录。

    检查SELinux模式,可能会打印Enforcing,那就需要修改:

    getenforce

    将 SELinux 从 Enforcing 模式切换到 Permissive 模式:

    setenforce 0

  2. 导入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 )
          )

      上面内容定义了类似/etc/sudoers文件中的属性,以替代/etc/sudoers文件管理系统中sudo权限。

    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导入OpenLDAP,使OpenLDAP能支持sudo配置:
      ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/sudo.ldif
      systemctl restart slapd

  3. 创建sudoers组织单元。

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

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

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

  4. 在OpenLDAP服务端执行添加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
      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命令进行生成。

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

  5. 客户端配置。

    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

  6. sudo命令验证。

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

      如果是在HCE作为OpenLDAP客户端,且Rocky Linux作为OpenLDAP服务端的场景下,还要继续参考以下操作步骤继续修改:

  1. 修改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

  1. 修改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都已被覆盖修改

    修改并保存效果如图:

  1. 修改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

    修改并保存效果如图:

  1. 修改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

    修改并保存效果如图:

  1. 修改OpenLDAP客户端的/etc/hosts。

    添加OpenLDAP服务端主机信息、本机OpenLDAP客户端信息。

    例如:echo '192.168.122.254 ldap01.huawei.com' >> /etc/hosts

    效果如图所示:

  1. 修改OpenLDAP服务端的/etc/hosts。

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

  1. 检查或修改OpenLDAP客户端的/etc/pam.d/sudo为以下内容

    #%PAM-1.0
    auth       include      system-auth
    account    include      system-auth
    password   include      system-auth
    session    include      system-auth

  1. 确认OpenLDAP客户端nslcd已运行。

    HCE作为OpenLDAP客户端时,确保nslcd已启用:

    systemctl status nslcd

  1. OpenLDAP客户端停用nscd缓存服务。

    可选,不一定需要停用。

    停止 nscd:

    systemctl stop nscd

    禁用开机启动:

    systemctl disable nscd

相关文档