阅读目录

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

1. 基础环境准备

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

2. 服务端配置

  1. 导入sudo schema

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

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

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

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

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

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

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

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

    1. [root@mldap01 ~]# cat << EOF | ldapadd -x -D "cn=Manager,dc=gdy,dc=com" -W
    2. > dn: ou=sudoers,dc=gdy,dc=com
    3. > objectClass: organizationalUnit
    4. > objectClass: top
    5. > ou: sudoers
    6. >
    7. > dn: cn=default,ou=sudoers,dc=gdy,dc=com
    8. > objectClass: sudoRole
    9. > cn: default
    10. > description: Default sudoOption's go here
    11. > sudoOption: requiretty
    12. > sudoOption: !visiblepw
    13. > sudoOption: always_set_home
    14. > sudoOption: env_reset
    15. > sudoOption: env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
    16. > sudoOption: env_keep+="MALL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
    17. > sudoOption: env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
    18. > sudoOption: env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHOME"
    19. > sudoOption: env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
    20. > sudoOption: secure_path=/sbin:/bin:/usr/sbin:/usr/bin
    21. >
    22. > dn: cn=%dba,ou=sudoers,dc=gdy,dc=com
    23. > objectClass: sudoRole
    24. > cn: %dba
    25. > sudoUser: %dba
    26. > sudoRunAsUser: oracle
    27. > sudoRunAsUser: grid
    28. > sudoOption: !authenticate
    29. > sudoCommand: /bin/bash
    30. >
    31. > dn: cn=%app,ou=sudoers,dc=gdy,dc=com
    32. > objectClass: sudoRole
    33. > cn: %app
    34. > sudoUser: %app
    35. > sudoHost: ALL
    36. > sudoRunAsUser: appman
    37. > sudoOption: !authenticate
    38. > sudoCommand: /bin/bash
    39. >
    40. > dn: cn=%admin,ou=sudoers,dc=gdy,dc=com
    41. > objectClass: sudoRole
    42. > cn: %admin
    43. > sudoUser: %admin
    44. > sudoHost: ALL
    45. > sudoOption: authenticate
    46. > sudoCommand: /bin/rm
    47. > sudoCommand: /bin/rmdir
    48. > sudoCommand: /bin/chmod
    49. > sudoCommand: /bin/chown
    50. > sudoCommand: /bin/dd
    51. > sudoCommand: /bin/mv
    52. > sudoCommand: /bin/cp
    53. > sudoCommand: /sbin/fsck*
    54. > sudoCommand: /sbin/*remove
    55. > sudoCommand: /usr/bin/chattr
    56. > sudoCommand: /sbin/mkfs*
    57. > sudoCommand: !/usr/bin/passwd
    58. > sudoOrder: 0
    59. >
    60. > dn: cn=%limit,ou=sudoers,dc=gdy,dc=com
    61. > objectClass: top
    62. > objectClass: sudoRole
    63. > cn: %limit
    64. > sudoCommand: /usr/bin/chattr
    65. > sudoHost: limit.gdy.com
    66. > sudoOption: !authenticate
    67. > sudoRunAsUser: ALL
    68. > sudoUser: %limit
    69. > EOF
    70. Enter LDAP Password:
    71. adding new entry "ou=sudoers,dc=gdy,dc=com"
    72. adding new entry "cn=default,ou=sudoers,dc=gdy,dc=com"
    73. adding new entry "cn=%dba,ou=sudoers,dc=gdy,dc=com"
    74. adding new entry "cn=%app,ou=sudoers,dc=gdy,dc=com"
    75. adding new entry "cn=%admin,ou=sudoers,dc=gdy,dc=com"
    76. 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组中

    1. [root@mldap01 ~]# cat << EOF | ldapadd -D "cn=Manager,dc=gdy,dc=com" -c -x -W
    2. dn: cn=app,ou=Group,dc=gdy,dc=com
    3. objectClass: posixGroup
    4. cn: app
    5. gidNumber: 10005
    6. dn: cn=manager,ou=Group,dc=gdy,dc=com
    7. objectClass: posixGroup
    8. cn: manager
    9. gidNumber: 10006
    10. dn: uid=jboss,ou=People,dc=gdy,dc=com
    11. objectClass: account
    12. objectClass: posixAccount
    13. objectClass: shadowAccount
    14. cn: jboss
    15. uid: jboss
    16. uidNumber: 20006
    17. gidNumber: 10005
    18. userPassword: {CRYPT}$6$eRYFmeDr$siXSlXkO8OEhzHsLvlslFJZpmLnW1ajWU3wG3b4DVAdP6jYJDpUwwJW2juEir3wbpjU6t2h7sSWfRARb2xJ.G1
    19. homeDirectory: /home/jboss
    20. loginShell: /bin/bash
    21. dn: uid=manager01,ou=People,dc=gdy,dc=com
    22. objectClass: account
    23. objectClass: posixAccount
    24. objectClass: shadowAccount
    25. cn: manager01
    26. uid: manager01
    27. uidNumber: 20007
    28. gidNumber: 10006
    29. userPassword: {CRYPT}$6$yTg3xJfA$VpThv3kvPG1uFw2.n/VgTnk8W05PED9CdEq.RXbz7SdjGd30z51lyuiBUFfd4F8HGQvWV3pWlplqATQh90fpL.
    30. homeDirectory: /home/manager01
    31. loginShell: /bin/bash
    32. EOF
    33. Enter LDAP Password:
    34. adding new entry "cn=app,ou=Group,dc=gdy,dc=com"
    35. adding new entry "cn=manager,ou=Group,dc=gdy,dc=com"
    36. adding new entry "uid=jboss,ou=People,dc=gdy,dc=com"
    37. adding new entry "uid=manager01,ou=People,dc=gdy,dc=com"
  5. 通过ldapsearch指令查看jboss用户及app组相关信息

    1. [root@mldap01 ~]# ldapsearch -x -LLL uid=jboss
    2. dn: uid=jboss,ou=people,dc=gdy,dc=com
    3. objectClass: account
    4. objectClass: posixAccount
    5. objectClass: shadowAccount
    6. cn: jboss
    7. uid: jboss
    8. uidNumber: 20006
    9. gidNumber: 10005
    10. homeDirectory: /home/jboss
    11. loginShell: /bin/bash
    12. [root@mldap01 ~]# ldapsearch -x -LLL cn=app
    13. dn: cn=app,ou=Group,dc=gdy,dc=com
    14. objectClass: posixGroup
    15. cn: app
    16. gidNumber: 10005

3. 客户端配置

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

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

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

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

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

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

4. 客户端验证

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

  1. ```shell
  2. ldif格式的appman用户及组
  3. dn: uid=appman,ou=people,dc=gdy,dc=com
  4. uid: appman
  5. cn: appman
  6. objectClass: account
  7. objectClass: posixAccount
  8. objectClass: top
  9. objectClass: shadowAccount
  10. userPassword: {CRYPT}$6$2v5NKeJj$e1G81HKtTa0fnNX1nqhX1ym/63/X0lHEnobGd0ZBHiwUhcy9SlF8RC.6bPH.CtEbfEVSnn.rRBkRWCAisUrgn/
  11. shadowLastChange: 17675
  12. shadowMin: 0
  13. shadowMax: 99999
  14. shadowWarning: 7
  15. loginShell: /bin/bash
  16. uidNumber: 30000
  17. gidNumber: 30000
  18. homeDirectory: /home/appman
  19. dn: cn=appman,ou=Group,dc=gdy,dc=com
  20. objectClass: posixGroup
  21. objectClass: top
  22. cn: appman
  23. userPassword: {crypt}x
  24. gidNumber: 30000
  25. [root@test01 ~]# ssh jboss@127.0.0.1
  26. jboss@127.0.0.1's password:
  27. Last login: Thu May 24 13:49:07 2018 from localhost
  28. [jboss@test01 ~]$ sudo -l
  29. Matching Defaults entries for jboss on this host:
  30. requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MALL PS1 PS2 QTDIR
  31. 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
  32. 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,
  33. env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
  34. 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
  35. LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
  36. User jboss may run the following commands on this host:
  37. (appman) NOPASSWD: /bin/bash
  38. [jboss@test01 ~]$ sudo -i -u appman
  39. [appman@test01 ~]$ # 切换成功
  40. ```

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

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

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

05-sudo权限配置的更多相关文章

  1. sudo权限配置

    首先要禁止root的用户登录ssh  在ssh配置文件里面把root用户no掉,一般公司不允许用第三方软件直接root登陆. 一.linux给用户添加sudo权限: 有时候,linux下面运行sudo ...

  2. 04.Linux-CentOS系统sudo权限配置

    visudo权限配置普通用户的使用权限范围配置文件: (请根据自己公司需求配置) [root@localhost ~]# visudo ## Allow root to run any command ...

  3. Linux用户配置sudo权限

    Linux用户配置sudo权限 创建sudo权限用户 #useradd supope #passwd supope #visudo #supope         ALL=(ALL)       AL ...

  4. blfs(systemd版本)学习笔记-编译安装sudo并创建普通用户配置sudo权限

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! blfs书中sudo的安装配置章节:http://www.linuxfromscratch.org/blfs/view/stab ...

  5. blfs(systemv版本)学习笔记-编译安装sudo并创建普通用户配置sudo权限

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! blfs书中sudo的安装配置章节:http://www.linuxfromscratch.org/blfs/view/8.3/ ...

  6. PHP 执行命令时sudo权限的配置

    PHP 执行命令时sudo权限的配置 1.先写一个PHP文件 <?php system('whoami'); 先看自己的apache2的用户是谁,下面是笔者的截图,笔者使用apche2的用户是w ...

  7. Linux用户配置sudo权限(visudo)

    sudo的工作过程如下: 1,当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限 2,确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认 ...

  8. Linux 账号管理与 ACL 权限配置

    要登陆 Linux 系统一定要有账号与口令才行,否则怎么登陆,您说是吧?不过, 不同的使用者应该要拥有不同的权限才行吧?我们还可以透过 user/group 的特殊权限配置, 来规范出不同的群组开发项 ...

  9. 05: zabbix 监控配置

    目录:zabbix其他篇 01: 安装zabbix server 02:zabbix-agent安装配置 及 web界面管理 03: zabbix API接口 对 主机.主机组.模板.应用集.监控项. ...

  10. CentOS学习笔记--账号管理与权限配置

    Linux 的账号管理与权限配置 管理员的工作中,相当重要的一环就是『管理账号』啦! 使用者标识符: UID 与 GID 虽然我们登陆 Linux 主机的时候,输入的是我们的账号,但是其实 Linux ...

随机推荐

  1. redis lru实现策略

    转载自http://blog.chinaunix.net/uid-20708886-id-5753422.html 在使用redis作为缓存的场景下,内存淘汰策略决定的redis的内存使用效率.在大部 ...

  2. 如何更优雅的在kubernetes平台下记录日志

    背景 传统项目里面记录日志大多数都是将日志记录到日志文件,升级到分布式架构以后,日志开始由文件转移到elasticsearch(es)中来存储,达到集中管理.在kubernetes平台里面把日志记录到 ...

  3. 从零开始学 Web 之 ES6(六)ES6基础语法四

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  4. Notyf - 超级简单、响应式的 JS 通知插件

    通知是网站的常用功能之一,可以用来显示消息.通告.提示等等.Notyf 是一款超级简单.响应式的 JS 通知插件,不依赖 jQuery 库,可以独立使用.赶紧试用一下吧! 在线演示      免费下载 ...

  5. thinkphp通用控制器

    <?php namespace 目录\Controller; class TypeController extends Controller { public function add() { ...

  6. 主从热备+负载均衡(LVS + keepalived)

    前言 淘宝架构师李智慧大牛的书籍<大型网站技术架构>以及旭龙兄的博客  --->[大型网站技术实践]初级篇:借助LVS+Keepalived实现负载均衡. 从上参考而得来本文,本文旨 ...

  7. Docker安装(Debian8)-构建简单的SpringBoot应用

    安装docker 1. 建立仓库 移除已安装的docker(docker以前被称为docker或者docker-enginer现在称为docker-ce) apt-get remove docker ...

  8. anaconda更新库命令

    输入y更新库

  9. 【Spring】8、Spring框架中的单例Beans是线程安全的么

    看到这样一个问题:spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上, ...

  10. 【Java深入研究】1、object类

    一.概述Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 参考英文:* Class {@code Object} is the ro ...