
# sudo基于OpenLDAP鉴权
#### 简介
sudo是一个应用程序，允许 Linux普通用户上获取 root 或管理员权限。sudo可以通过多种方式进行配置，用户可以在本地计算机或服务器上设置 sudo，也可以通过第三方软件实现集中式的 sudo 管理。在本教程中，将使用 OpenLDAP 服务器来设置集中式的sudo配置。通过这种方式，用户可以在 OpenLDAP 服务器上实现集中管理用户和 sudo 权限，从而加快客户端的部署过程。任何在客户端机器上配置了 sudo 身份验证源的 SSSD 服务，都会允许 OpenLDAP 中的用户使用 sudo。
#### 前置条件
已完成本机yum源的配置，可参考[HCE的REPO源配置](https://support.huaweicloud.com/usermanual-hce/hce_repo.html)进行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修改为下图所示： ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002532585955.png "点击放大")
      并删除文件末尾的下面这些行，行的内容根据实际情况会有所不同：
      ```
      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组织单元，并添加默认配置。
      ![](https://support.huaweicloud.com/bestpractice-hce/public_sys-resources/note_3.0-zh-cn.png)
      本例域名和sudo默认配置项仅作演示，请根据实际情况进行修改。
      
   
   2. 执行以下命令向OpenLDAP服务端添加sudoers配置：
      ```
      ldapadd -x -D cn=root,dc=huawei,dc=com -W -f sudoers.ldif
      ```
      ![](https://support.huaweicloud.com/bestpractice-hce/public_sys-resources/note_3.0-zh-cn.png)
      命令中的管理员账户请根据实际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
      ```
      ![](https://support.huaweicloud.com/bestpractice-hce/public_sys-resources/note_3.0-zh-cn.png)
      请根据实际情况修改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
      ```
      效果如下：
      ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002500666050.png)
      
   
   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
      ```
      效果如下：
      ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002500825904.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-hce/public_sys-resources/note_3.0-zh-cn.png)
      上述段落名\[domain/ldap\]和sssd段落下的domains等字段请根据实际情况修改。
      
   
   3. 执行以下命令清理sssd缓存并重启sssd服务:
      ```
      systemctl stop sssd
      sss_cache -E
      systemctl restart sssd
      ```
      
   
   
   
   
6. sudo命令验证。 
   1. 登录OpenLDAP用户（此处以test1用户为例）后执行**sudo -l** ，效果如下：
      ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002532505941.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-hce/public_sys-resources/warning_3.0-zh-cn.png)
      如果是在HCE作为OpenLDAP客户端，且Rocky Linux作为OpenLDAP服务端的场景下，还要继续参考以下操作步骤继续修改。
      
   
   
   
   

7. 修改OpenLDAP客户端的/etc/sssd/sssd.conf文件为以下内容，可以用以下内容做覆盖： 
   ![](https://support.huaweicloud.com/bestpractice-hce/public_sys-resources/warning_3.0-zh-cn.png)
   修改前先备份/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
   ```
   ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002532585959.png "点击放大")
   其中，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
   ```
   
   

8. 修改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的修改方式：
   ![](https://support.huaweicloud.com/bestpractice-hce/public_sys-resources/warning_3.0-zh-cn.png)
   修改前先备份/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都已被覆盖修改
   ```
   修改并保存效果如图：
   ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002500666056.png)
   
   

9. 修改OpenLDAP客户端的/etc/pam.d/system-auth为以下内容。 
   HCE OpenLDAP客户端的/etc/pam.d/system-auth里引用的是库文件pam_ldap.so。
   /etc/pam.d/system-auth可参考修改为如下：
   ![](https://support.huaweicloud.com/bestpractice-hce/public_sys-resources/warning_3.0-zh-cn.png)
   修改前先备份/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
   ```
   修改并保存效果如图：
   ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002500825908.png)
   
   

10. 修改OpenLDAP客户端的/etc/pam.d/password-auth为以下内容。 
    HCE OpenLDAP客户端的/etc/pam.d/password-auth里引用的是库文件pam_ldap.so。
    /etc/pam.d/password-auth可参考修改为如下：
    ![](https://support.huaweicloud.com/bestpractice-hce/public_sys-resources/warning_3.0-zh-cn.png)
    修改前先备份/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
    ```
    修改并保存效果如图：
    ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002532505943.png "点击放大")
    
    

11. 修改OpenLDAP客户端的/etc/hosts。 
    添加OpenLDAP服务端主机信息、本机OpenLDAP客户端信息。
    例如：echo '192.168.122.254 ldap01.huawei.com' \>\> /etc/hosts
    效果如图所示：
    ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002532585961.png "点击放大")
    
    

12. 修改OpenLDAP服务端的/etc/hosts。 
    添加OpenLDAP服务端主机信息，下图示例中ldap01就是此Rocky Linux作为OpenLDAP服务端的虚机。
    ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002500666058.png "点击放大")
    
    

13. 检查或修改OpenLDAP客户端的/etc/pam.d/sudo为以下内容。 
    ```
    #%PAM-1.0
    auth       include      system-auth
    account    include      system-auth
    password   include      system-auth
    session    include      system-auth
    ```
    ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002500825912.png "点击放大")
    
    

14. 确认OpenLDAP客户端nslcd已运行。 
    HCE作为OpenLDAP客户端时，确保nslcd已启用：
    ```
    systemctl status nslcd
    ```
    
    

15. OpenLDAP客户端停用nscd缓存服务。 
    可选，不一定需要停用。
    停止 nscd：
    ```
    systemctl stop nscd
    ```
    禁用开机启动：
    ```
    systemctl disable nscd
    ```
    
    
 
