LDAP學習筆記之八:openLDAP sudo權限


一、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 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM