一、openLDAP sudo权限常见属性

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

二、在OpenLDAP服务端实现用户权限控制

1.导入sudo schema

[root@ldap01 ~]# rpm -ql sudo|grep schema.OpenLDAP
/usr/share/doc/sudo-1.8.23/schema.OpenLDAP
[root@ldap01 ~]# cp /usr/share/doc/sudo-1.8.23/schema.OpenLDAP /etc/openldap/schema/sudo.schema
[root@ldap01 ~]# cd /etc/openldap/schema/
[root@ldap01 schema]# restorecon sudo.schema 
[root@ldap01 schema]# mkdir ~/sudo
[root@ldap01 schema]# echo 'include /etc/openldap/schema/sudo.schema' ~/sudo/sudoSchema.conf 
[root@ldap01 schema]# slapcat -f ~/sudo/sudoSchema.conf -F /tmp/ -n0 -s "cn={0}sudo,cn=schema,cn=config" ~/sudo/sudo.ldif
[root@ldap01 schema]# sed -i "s/{0}sudo/{13}sudo/g" ~/sudo/sudo.ldif       #如果13不够可以用最大值100,后面会自动调整
[root@ldap01 schema]# head -n -8 ~/sudo/sudo.ldif ~/sudo/sudo-config.ldif  #删除structuralObjectClass及以下所有行
[root@ldap01 schema]# ldapadd -Y EXTERNAL -H ldapi:/// -f  ~/sudo/sudo-config.ldif
[root@ldap01 schema]# ls /etc/openldap/slapd.d/cn\=config  #查看openLDAP数据库目录中schema产生的文件,不难发现,当前目录多了一个关于 sudo 的配置文件 cn={13}sudo.ldif 文件
[root@ldap01 schema]# ldapsearch -LLLY EXTERNAL -H ldapi:/// -b "cn={13}sudo,cn=schema,cn=config"|grep NAME|awk '{print $4,$5}'|sort #查看sudo schema支持的对象类型

可能出现的错误

[root@ldap01 schema]# ldapadd -Y EXTERNAL -H ldapi:/// -f  ~/sudo/sudo-config.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn={12}sudo,cn=schema,cn=config"
ldap_add: Server is unwilling to perform (53)
	additional info: operation requires sibling renumbering
# 请修改 13 编号为其他数值,如果无法确定请查看目录下是否有重复的:
[root@ldap01 schema]# ls /etc/openldap/slapd.d/cn\=config/cn\=schema
cn={0}core.ldif       cn={11}pmi.ldif      cn={1}cosine.ldif  cn={3}collective.ldif  cn={5}duaconf.ldif   cn={7}inetorgperson.ldif  cn={9}misc.ldif
cn={10}openldap.ldif  cn={12}ppolicy.ldif  cn={2}nis.ldif     cn={4}corba.ldif       cn={6}dyngroup.ldif  cn={8}java.ldif

2.定义sudo规则条目及sudo组

[root@ldap01 ~]# vim ~/sudo/duso_perm.ldif
dn: ou=sudoers,dc=ldap01,dc=pwb,dc=com     #将sudoers配置信息存放在ou=suders的子树中
objectclass: organizationalUnit
ou: sudoers

dn: cn=defaults,ou=sudoers,dc=ldap01,dc=pwb,dc=com #openLDAP首先会在子树中寻找cn=defaults条目,如果找到则所有dusoOption属性都会被解析为全局默认值  类似/etc/sudoers文件中的Defaults文件
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: requiretty
sudoOption: !visiblepw
sudoOption: always_set_home
sudoOption: env_reset
sudoOption: env_keep="COLORS DISPLAY HOSTNAME HISTSIZE TNPUTRC KDEDIR LS COLORS"
sudoOption: env_keep+="MAIL 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_TELEPHONE"
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=ldap01,dc=pwb,dc=com  #定义DBA组,允许组内用户可以通过sudo命令切换到系统oracle和grid用户下,不需要密码
objectClass: sudoRole
cn: %dba
sudoUser: %dba
sudoHost: ALL
sudoRunAsUser: oracle
sudoRunAsUser: grid
sudoOption: !authenticate
sudoCommand:  /bin/bash

dn: cn=%app,ou=sudoers,dc=ldap01,dc=pwb,dc=com  #定义app组,允许组内可以sudo切换到系统appman用户下,不需要密码
objectClass: sudoRole
cn: %app
sudoUser: %app
sudoHost: ALL
sudoRunAsUser: appman
sudoOption: !authenticate
sudoCommand:/bin/bash

dn: cn=%admin,ou=sudoers,dc=ldap01,dc=pwb,dc=com #定义admin组,组内用户只能sudo执行允许的命令,其他越权命令不允许执行
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=ldap01,dc=pwb,dc=com  #定义limit组,组内用户只能在limit.pwb.com机器上执行chattr命令,其他都不允许
objectClass: top
objectClass: sudoRole
cn:%limit
sudoCommand:/usr/bin/chattr
sudoHost: limit.pwb.com
sudoOption: !authenticate
sudoRunAsUser: ALL
sudoUser:%limit
dn: cn=%manager,ou=sudoers,dc=ldap01,dc=pwb,dc=com #定义manager组,组内用户可以在任何主机上执行sudo命令,没有任何限制
objectClass: sudoRole
objectClass: top
cn: %manager
sudoUser: ALL
sudoHost: ALL
sudoCommand: ALL
sudoRunAsUser: ALL
sudoOption: !authenticate
[root@ldap01 schema]# ldapadd -x -D cn=admin,dc=ldap01,dc=pwb,dc=com -W -f ~/sudo/duso_perm.ldif

3.用户加入sudo 组,继承 sudo权限

[root@ldap01 ~]# vim ~/sudo/add_sudo_user.ldif
dn: cn=app,ou=Group,dc=ldap01,dc=pwb,dc=com
objectClass: posixGroup
cn: app
gidNumber: 10005

dn: cn=manager,ou=Group,dc=ldap01,dc=pwb,dc=com
objectClass: posixGroup
cn: manager
gidNumber: 10006

dn: uid=jboss,ou=People,dc=ldap01,dc=pwb,dc=com
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: jboss
uid: jboss
uidNumber: 20006
gidNumber: 10005
userPassword: jboss
homeDirectory: /home/jboss
loginShell: /bin/bash

dn: uid=manager01,ou=People,dc=ldap01,dc=pwb,dc=com
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: manager01
uid: manager01
uidNumber: 20007
gidNumber: 10006
userPassword: manager01
homeDirectory: /home/manager01
loginShell: /bin/bash
[root@ldap01 ~]#  ldapadd -x -D cn=admin,dc=ldap01,dc=pwb,dc=com -W -f ~/sudo/add_sudo_user.ldif 
#如果想自定义用户和组条目可以在文件最上份定义,并将组及用户的ou替换即可
dn: ou=groups,dc=ldap01,dc=pwb,dc=com 
ou: Group
objectClass: top
objectClass: organizationalUnit

dn: ou=peoples,dc=ldap01,dc=pwb,dc=com  
ou: People
objectClass: top
objectClass: organizationalUnit
[root@ldap01 ~]# ldapsearch -x -LLL uid=jboss  #通过 ldapsearch 查看 jboss 用户及 app 组相关信息
[root@ldap01 ~]# ldapsearch -x -LLL cn=app

GUI界面查看

ldap 集成jenkins ldap sudo_Group

4.添加索引

[root@ldap01 ~]# cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
# Add indexes
dn: olcDatabase={2}hdb,cn=config
changetype:  modify
add: olcDbIndex
olcDbIndex: sudoUser eq
EOF

三、在客户端配置OpenLDAP相关sudo设置

1.安装依赖包

[root@client01 ~]# yum install openldap-client nss-pam-ldapd openssh-ldap fprintd-pam -y 
[root@client01 ~]# rpm -qi sudo |grep -i version
Version     : 1.8.23

2.客户端加入 OpenLDAP 服务端

[root@client01 log]# echo '192.168.1.131 ldap01.pwb.com ldap01' >> /etc/hosts
[root@client01 ~]#  authconfig --savebackup=openldap.bak #备份 authconfig --restorebackup=openldap.bak(还原)
[root@client01 ~]#  authconfig --enableldap --enableldapauth --enablemkhomedir --enableforcelegacy --disablesssd --disablesssdauth --disableldaptls --enablelocauthorize --ldapserver=ldap01.pwb.com --ldapbasedn="dc=ldap01,dc=pwb,dc=com" --enableshadow --update

3.修改 nsswitch.conf 配置文件,添加 sudu 查找顺序

[root@client01 ~]# cp /etc/nsswitch.conf /etc/nsswitch.conf.baks  
[root@client01 ~]# cat >> /etc/nsswitch.conf << EOF
> sudoers:    ldap files
> EOF

4.修改 sudo-ldap.conf 配置文件,添加支持后端 OpenLDAP 验证 sudo 的参数

[root@client01 ~]# cat >> /etc/sudo-ldap.conf << EOF  
> SUDOERS_BASE ou=sudoers,dc=ldap01,dc=pwb,dc=com
> uri ldap://ldap01.pwb.com
> EOF

5.验证 OpenLDAP 账号通过 sudo 提取系统用户权限  

[root@client01 log]# ssh manager01@192.168.1.132  #192.168.1.132是客户端的机器IP
manager01@192.168.1.132's password: 
Creating directory '/home/manager01'.
[manager01@client01 ~]$ sudo -l
匹配 %2$s 上 %1$s 的默认条目:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE TNPUTRC 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, !visiblepw, always_set_home, match_group_by_gid,
    always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE 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

用户 manager01 可以在 client01 上运行以下命令:
    (ALL) NOPASSWD: ALL
[manager01@client01 ~]$ sudo cat /etc/passwd   #验证 OpenLDAP 账号通过 sudo 提取系统用户权限
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

   

"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少