一、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界面查看
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
参考:http://wiki.shileizcc.com/confluence/pages/viewpage.action?pageId=40566794
"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少