LDAP学习笔记之八:openLDAP sudo权限
一、openLDAP sudo权限常见属性
1 2 3 4 5 6 7 8 9 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 | [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支持的对象类型 |
可能出现的错误
1 2 3 4 5 6 7 8 9 10 11 | [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组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | [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:%limitdn: 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权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | [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.添加索引
1 2 3 4 5 6 7 | [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.安装依赖包
1 2 3 | [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 服务端
1 2 3 | [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 查找顺序
1 2 3 4 | [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 的参数
1 2 3 4 | [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 提取系统用户权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [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
"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)