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