zoukankan      html  css  js  c++  java
  • 05-sudo权限配置

    阅读目录

    1. 基础环境准备
    2. 服务端配置
    3. 客户端配置
    4. 客户端验证
    5. 附:sudo常见属性介绍
    6. 常见错误分析

    1. 基础环境准备

    本文接文章openldap服务端安装配置

    2. 服务端配置

    1. 导入sudo schema

      openldap默认schema中不包含sudo所需要的数据结构,这时需要我们自行导入sudo schema文件。操作如下

      [root@mldap01 tmp]# rpm -ql sudo-1.8.6p3-27.el6.x86_64 | grep schema
      /usr/share/doc/sudo-1.8.6p3/schema.ActiveDirectory
      /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP
      /usr/share/doc/sudo-1.8.6p3/schema.iPlanet
      [root@mldap01 tmp]# cp -a /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP /etc/openldap/schema/sudo.schema
      

      [root@mldap01 slapd.d]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
      config file testing succeeded
      [root@mldap01 slapd.d]# chown ldap.ldap -R /etc/openldap/slapd.d
      [root@mldap01 slapd.d]# /etc/init.d/slapd restart
      Stopping slapd:                                            [  OK  ]
      Starting slapd:                                            [  OK  ]
      
    2. 验证openldap是否支持sudo

      查看OpenLDAP数据库目录中schema所产生的文件

      查看sudo schema所支持的对象类型

      [root@mldap01 ~]# ldapsearch -LLLY EXTERNAL -H ldapi:/// -b cn={12}sudo,cn=schema,cn=config | grep NAME | awk '{print $4,$5}' | sort 
      SASL/EXTERNAL authentication started
      SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
      SASL SSF: 0
      NAME 'sudoCommand'
      NAME 'sudoHost'
      NAME 'sudoNotAfter'
      NAME 'sudoNotBefore'
      NAME 'sudoOption'
      NAME 'sudoOrder'
      NAME 'sudoRole'
      NAME 'sudoRunAs'
      NAME 'sudoRunAsGroup'
      NAME 'sudoRunAsUser'
      NAME 'sudoUser'
      
    3. 定义sudo规则条目及sudo组

      sudoers的配置信息存放在ou=suders的子树中,默认OpenLDAP用户并没有指定sudo规则,openldap首先在目录树子树中寻找条目cn=defaults, 如果找到,那么所有的sudoOption属性都会被解析为全局默认值, 这类似于系统sudo(/etc/sudoers)文件中Defaults语句。

      当用户到OpenLDAP服务端中查询一个sudo用户权限时一般有两到三次查询。第一次查询解析全局配置,第二次查询匹配用户名或者用户所在的组(特殊标签ALL也在此次查询中匹配),如果没有找到相关匹配项,则发出第三次查询,此次查询返回所有包含用户组的条目并检查该用户是否存在于这些组中。接下来创建openldap的sudoers子树。具体命令如下。

      [root@mldap01 ~]# cat << EOF | ldapadd -x -D "cn=Manager,dc=gdy,dc=com" -W
      > dn: ou=sudoers,dc=gdy,dc=com
      > objectClass: organizationalUnit
      > objectClass: top
      > ou: sudoers
      > 
      > dn: cn=default,ou=sudoers,dc=gdy,dc=com
      > objectClass: sudoRole
      > cn: default
      > description: Default sudoOption's go here
      > sudoOption: requiretty
      > sudoOption: !visiblepw
      > sudoOption: always_set_home
      > sudoOption: env_reset
      > sudoOption: env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
      > sudoOption: env_keep+="MALL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
      > sudoOption: env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
      > sudoOption: env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHOME"
      > sudoOption: env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
      > sudoOption: secure_path=/sbin:/bin:/usr/sbin:/usr/bin
      > 
      > dn: cn=%dba,ou=sudoers,dc=gdy,dc=com
      > objectClass: sudoRole
      > cn: %dba
      > sudoUser: %dba
      > sudoRunAsUser: oracle
      > sudoRunAsUser: grid
      > sudoOption: !authenticate
      > sudoCommand: /bin/bash
      > 
      > dn: cn=%app,ou=sudoers,dc=gdy,dc=com
      > objectClass: sudoRole
      > cn: %app
      > sudoUser: %app
      > sudoHost: ALL
      > sudoRunAsUser: appman
      > sudoOption: !authenticate
      > sudoCommand: /bin/bash
      > 
      > dn: cn=%admin,ou=sudoers,dc=gdy,dc=com
      > objectClass: sudoRole
      > cn: %admin
      > sudoUser: %admin
      > sudoHost: ALL
      > sudoOption: authenticate
      > sudoCommand: /bin/rm
      > sudoCommand: /bin/rmdir
      > sudoCommand: /bin/chmod
      > sudoCommand: /bin/chown
      > sudoCommand: /bin/dd
      > sudoCommand: /bin/mv
      > sudoCommand: /bin/cp
      > sudoCommand: /sbin/fsck*
      > sudoCommand: /sbin/*remove
      > sudoCommand: /usr/bin/chattr
      > sudoCommand: /sbin/mkfs*
      > sudoCommand: !/usr/bin/passwd
      > sudoOrder: 0
      > 
      > dn: cn=%limit,ou=sudoers,dc=gdy,dc=com
      > objectClass: top
      > objectClass: sudoRole
      > cn: %limit
      > sudoCommand: /usr/bin/chattr
      > sudoHost: limit.gdy.com
      > sudoOption: !authenticate
      > sudoRunAsUser: ALL
      > sudoUser: %limit
      > EOF
      Enter LDAP Password: 
      adding new entry "ou=sudoers,dc=gdy,dc=com"
      
      adding new entry "cn=default,ou=sudoers,dc=gdy,dc=com"
      
      adding new entry "cn=%dba,ou=sudoers,dc=gdy,dc=com"
      
      adding new entry "cn=%app,ou=sudoers,dc=gdy,dc=com"
      
      adding new entry "cn=%admin,ou=sudoers,dc=gdy,dc=com"
      
      adding new entry "cn=%limit,ou=sudoers,dc=gdy,dc=com"
      

      以上操作中,读者不难发现app组可以通过sudo切换到系统appman用户下,而且也不需要输入验证密码,同理admin组里面的用户只能通过sudo执行允许的命令,其他越权命令不允许执行。dba组里面的用户可以通过sudo命令切换到系统oracle和grid用户下,且不需要输入验证密码。limit组里面的用户只允许在limit.gdy.com机器上通过sudo执行一条命令,且不需要提供验证密码,其他任何机器都不能使用sudo命令执行命令。manager组里面的用户可以在任何主机上执行sudo命令,没有任何限制,如果要求OpenLDAP用户提示输入密码,只需要将!authenticate中的感叹号去掉即可。

    4. 添加OpenLDAP用户到app组和manager组中

      [root@mldap01 ~]# cat << EOF | ldapadd -D "cn=Manager,dc=gdy,dc=com" -c -x -W
      dn: cn=app,ou=Group,dc=gdy,dc=com 
      objectClass: posixGroup
      cn: app
      gidNumber: 10005
      
      dn: cn=manager,ou=Group,dc=gdy,dc=com
      objectClass: posixGroup
      cn: manager
      gidNumber: 10006
      
      dn: uid=jboss,ou=People,dc=gdy,dc=com
      objectClass: account
      objectClass: posixAccount
      objectClass: shadowAccount
      cn: jboss
      uid: jboss
      uidNumber: 20006
      gidNumber: 10005
      userPassword: {CRYPT}$6$eRYFmeDr$siXSlXkO8OEhzHsLvlslFJZpmLnW1ajWU3wG3b4DVAdP6jYJDpUwwJW2juEir3wbpjU6t2h7sSWfRARb2xJ.G1
      homeDirectory: /home/jboss
      loginShell: /bin/bash
      
      dn: uid=manager01,ou=People,dc=gdy,dc=com
      objectClass: account
      objectClass: posixAccount
      objectClass: shadowAccount
      cn: manager01
      uid: manager01
      uidNumber: 20007
      gidNumber: 10006
      userPassword: {CRYPT}$6$yTg3xJfA$VpThv3kvPG1uFw2.n/VgTnk8W05PED9CdEq.RXbz7SdjGd30z51lyuiBUFfd4F8HGQvWV3pWlplqATQh90fpL.
      homeDirectory: /home/manager01
      loginShell: /bin/bash
      EOF
      Enter LDAP Password: 
      adding new entry "cn=app,ou=Group,dc=gdy,dc=com"
      
      adding new entry "cn=manager,ou=Group,dc=gdy,dc=com"
      
      adding new entry "uid=jboss,ou=People,dc=gdy,dc=com"
      
      adding new entry "uid=manager01,ou=People,dc=gdy,dc=com"
      
    5. 通过ldapsearch指令查看jboss用户及app组相关信息

      [root@mldap01 ~]# ldapsearch -x -LLL uid=jboss
      dn: uid=jboss,ou=people,dc=gdy,dc=com
      objectClass: account
      objectClass: posixAccount
      objectClass: shadowAccount
      cn: jboss
      uid: jboss
      uidNumber: 20006
      gidNumber: 10005
      homeDirectory: /home/jboss
      loginShell: /bin/bash
      
      [root@mldap01 ~]# ldapsearch -x -LLL cn=app 
      dn: cn=app,ou=Group,dc=gdy,dc=com
      objectClass: posixGroup
      cn: app
      gidNumber: 10005
      

    3. 客户端配置

    1. 查看当前sudo版本是否支持openldap的sudo规则,不支持的版本需要进行升级

      [user1@test01 openldap]$ rpm -qi sudo  | grep -i version 
      Version     : 1.8.6p3                           Vendor: CentOS
      // 如果sudo版本为1.7.4p5则需要对sudo进行升级,否则无法支持openldap服务器sudo规则的匹配
      
      [user1@test01 openldap]$ sudo -V
      Sudo version 1.8.6p3
      Sudoers policy plugin version 1.8.6p3
      Sudoers file grammar version 42
      Sudoers I/O plugin version 1.8.6p3   //sudo版本的信息
      
    2. 客户端加入OpenLDAP服务端

      本文略,具体参考openldap客户端安装

    3. 修改nsswitch.conf配置文件,添加sudo查找顺序,命令如下

      [root@mldap01 ~]# cat >> /etc/nsswitch.conf << EOF
      > sudoers:      ldap files
      > EOF
      [root@mldap01 ~]# cat /etc/nsswitch.conf | grep -i sudoers
      sudoers:      ldap files
      
    4. 修改sudo-ldap.conf配置文件,添加支持后端openldap验证sudo的参数,命令如下:

      [root@mldap01 ~]# cat >> /etc/sudo-ldap.conf << EOF
      > SUDOERS_BASE ou=Sudoers,dc=gdy,dc=com
      > EOF
      [root@mldap01 ~]# cat /etc/sudo-ldap.conf | grep -i Sudoers
      ## SUDOERS_BASE base
      ##  Multiple SUDOERS_BASE lines may be specified, in which
      #sudoers_base ou=SUDOers,dc=example,dc=com
      ## SUDOERS_DEBUG debug_level
      #sudoers_debug 1
      uri ldap://mldap01.gdy.com
      SUDOERS_BASE ou=sudoers,dc=gdy,dc=com
      

    4. 客户端验证

    验证OpenLDAP帐号通过sudo提取系统用户权限

    ```shell
    ldif格式的appman用户及组
    dn: uid=appman,ou=people,dc=gdy,dc=com
    uid: appman
    cn: appman
    objectClass: account
    objectClass: posixAccount
    objectClass: top
    objectClass: shadowAccount
    userPassword: {CRYPT}$6$2v5NKeJj$e1G81HKtTa0fnNX1nqhX1ym/63/X0lHEnobGd0ZBHiwUhcy9SlF8RC.6bPH.CtEbfEVSnn.rRBkRWCAisUrgn/
    shadowLastChange: 17675
    shadowMin: 0
    shadowMax: 99999
    shadowWarning: 7
    loginShell: /bin/bash
    uidNumber: 30000
    gidNumber: 30000
    homeDirectory: /home/appman
    
    dn: cn=appman,ou=Group,dc=gdy,dc=com
    objectClass: posixGroup
    objectClass: top
    cn: appman
    userPassword: {crypt}x
    gidNumber: 30000
    
    [root@test01 ~]# ssh jboss@127.0.0.1
    jboss@127.0.0.1's password: 
    Last login: Thu May 24 13:49:07 2018 from localhost
    [jboss@test01 ~]$ sudo -l
    Matching Defaults entries for jboss on this host:
        requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MALL PS1 PS2 QTDIR
        USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER
        LC_TELEPHOME", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin:/bin:/usr/sbin:/usr/bin, !visiblepw, always_set_home,
        env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
        env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME
        LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin:/bin:/usr/sbin:/usr/bin
    
    User jboss may run the following commands on this host:
        (appman) NOPASSWD: /bin/bash
    [jboss@test01 ~]$ sudo -i -u appman
    [appman@test01 ~]$        # 切换成功
    ```
    

    5. 附:sudo常见属性介绍

    sudo常见的属性有以下几个

    • sudoCommand:可执行的二进制命令,如useradd、userdel、mount、umount等。
    • sudoHost:可在哪些机器上执行sudoCommand定义的BASH命令。
    • sudoNotAfter:起始时间sudo规则匹配。
    • sudoNotBefore:结束时间sudo规则匹配。
    • sudoOption:定义超过自身权限及切换至其他用户时,是否需要输入当前用户密码。
    • sudoOrder:sudo规则执行顺序,其属性是一个整数。
    • sudoRole:定义的规则。
    • sudoRunAS:可切换到定义的用户身份下执行BASH命令。
    • sudoRunAsGroup:可切换到定义所属组并具有该组的权限。
    • sudoRunAsUser:定义可切换至哪些用户下执行命令。
    • sudoUser:限制哪些用户或哪些组内的成员具有sudo相关规则。

    6. 常见错误分析

    1. 例1,报错/home/appman: No such file or directory

      [jboss@test01 ~]$ sudo -i -u appman
      sudo: unable to change directory to /home/appman: No such file or directory
      sudo: unable to execute /bin/bash: No such file or directory
      

      解决方法:在本机创建appman的家目录就可以了

  • 相关阅读:
    log4j(四)——如何控制不同风格的日志信息的输出?
    log4j(三)——如何控制不同级别的日志信息的输出?
    log4j(二)——如何控制日志信息的输出?
    【完全开源】知乎日报UWP版:增加Live磁贴、Badge、以及Toast通知
    【完全开源】知乎日报UWP版:项目结构说明、关键源代码解释
    【完全开源】知乎日报UWP版(下篇):商店APP、github源码、功能说明。Windows APP 良心出品。
    UWP开发:APP之间的数据交互(以微信为例)
    【完全开源】知乎日报UWP版(上篇):界面设计、官方API分析
    【完全开源】博客园客户端UWP版 带源码、带APP(下篇)
    UWP开发之控件:用WebView做聊天框
  • 原文地址:https://www.cnblogs.com/cishi/p/9127572.html
Copyright © 2011-2022 走看看