1. 程式人生 > >05-sudo權限配置

05-sudo權限配置

-a active 結束時間 mount six inf rip 升級 nes

閱讀目錄

  1. 基礎環境準備
  2. 服務端配置
  3. 客戶端配置
  4. 客戶端驗證
  5. 附:sudo常見屬性介紹
  6. 常見錯誤分析

1. 基礎環境準備

本文接文章openldap服務端安裝配置

2. 服務端配置

  1. 導入sudo schema

    openldap默認schema中不包含sudo所需要的數據結構,這時需要我們自行導入sudo schema文件。操作如下

    [root@mldap01 tmp]# rpm -ql sudo-1.8.6p3-27.el6.x86_64 | grep schema
    /usr/share/doc/sudo-1.8.6p3/schema.ActiveDirectory
    /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP
    /usr/share/doc/sudo-1.8.6p3/schema.iPlanet
    [root@mldap01 tmp]# cp -a /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP /etc/openldap/schema/sudo.schema

    技術分享圖片

    [root@mldap01 slapd.d]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
    config file testing succeeded
    [root@mldap01 slapd.d]# chown ldap.ldap -R /etc/openldap/slapd.d
    [root@mldap01 slapd.d]# /etc/init.d/slapd restart
    Stopping slapd:                                            [  OK  ]
    Starting slapd:                                            [  OK  ]
  2. 驗證openldap是否支持sudo

    查看OpenLDAP數據庫目錄中schema所產生的文件

    技術分享圖片

    查看sudo schema所支持的對象類型

    [root@mldap01 ~]# ldapsearch -LLLY EXTERNAL -H ldapi:/// -b cn={12}sudo,cn=schema,cn=config | grep NAME | awk ‘{print $4,$5}‘ | sort 
    SASL/EXTERNAL authentication started
    SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
    SASL SSF: 0
    NAME ‘sudoCommand‘
    NAME ‘sudoHost‘
    NAME ‘sudoNotAfter‘
    NAME ‘sudoNotBefore‘
    NAME ‘sudoOption‘
    NAME ‘sudoOrder‘
    NAME ‘sudoRole‘
    NAME ‘sudoRunAs‘
    NAME ‘sudoRunAsGroup‘
    NAME ‘sudoRunAsUser‘
    NAME ‘sudoUser‘
  3. 定義sudo規則條目及sudo組

    sudoers的配置信息存放在ou=suders的子樹中,默認OpenLDAP用戶並沒有指定sudo規則,openldap首先在目錄樹子樹中尋找條目cn=defaults, 如果找到,那麽所有的sudoOption屬性都會被解析為全局默認值, 這類似於系統sudo(/etc/sudoers)文件中Defaults語句。

    當用戶到OpenLDAP服務端中查詢一個sudo用戶權限時一般有兩到三次查詢。第一次查詢解析全局配置,第二次查詢匹配用戶名或者用戶所在的組(特殊標簽ALL也在此次查詢中匹配),如果沒有找到相關匹配項,則發出第三次查詢,此次查詢返回所有包含用戶組的條目並檢查該用戶是否存在於這些組中。接下來創建openldap的sudoers子樹。具體命令如下。

    [root@mldap01 ~]# cat << EOF | ldapadd -x -D "cn=Manager,dc=gdy,dc=com" -W
    > dn: ou=sudoers,dc=gdy,dc=com
    > objectClass: organizationalUnit
    > objectClass: top
    > ou: sudoers
    > 
    > dn: cn=default,ou=sudoers,dc=gdy,dc=com
    > objectClass: sudoRole
    > cn: default
    > description: Default sudoOption‘s go here
    > sudoOption: requiretty
    > sudoOption: !visiblepw
    > sudoOption: always_set_home
    > sudoOption: env_reset
    > sudoOption: env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
    > sudoOption: env_keep+="MALL 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_TELEPHOME"
    > 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=gdy,dc=com
    > objectClass: sudoRole
    > cn: %dba
    > sudoUser: %dba
    > sudoRunAsUser: oracle
    > sudoRunAsUser: grid
    > sudoOption: !authenticate
    > sudoCommand: /bin/bash
    > 
    > dn: cn=%app,ou=sudoers,dc=gdy,dc=com
    > objectClass: sudoRole
    > cn: %app
    > sudoUser: %app
    > sudoHost: ALL
    > sudoRunAsUser: appman
    > sudoOption: !authenticate
    > sudoCommand: /bin/bash
    > 
    > dn: cn=%admin,ou=sudoers,dc=gdy,dc=com
    > 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=gdy,dc=com
    > objectClass: top
    > objectClass: sudoRole
    > cn: %limit
    > sudoCommand: /usr/bin/chattr
    > sudoHost: limit.gdy.com
    > sudoOption: !authenticate
    > sudoRunAsUser: ALL
    > sudoUser: %limit
    > EOF
    Enter LDAP Password: 
    adding new entry "ou=sudoers,dc=gdy,dc=com"
    
    adding new entry "cn=default,ou=sudoers,dc=gdy,dc=com"
    
    adding new entry "cn=%dba,ou=sudoers,dc=gdy,dc=com"
    
    adding new entry "cn=%app,ou=sudoers,dc=gdy,dc=com"
    
    adding new entry "cn=%admin,ou=sudoers,dc=gdy,dc=com"
    
    adding new entry "cn=%limit,ou=sudoers,dc=gdy,dc=com"

    以上操作中,讀者不難發現app組可以通過sudo切換到系統appman用戶下,而且也不需要輸入驗證密碼,同理admin組裏面的用戶只能通過sudo執行允許的命令,其他越權命令不允許執行。dba組裏面的用戶可以通過sudo命令切換到系統oracle和grid用戶下,且不需要輸入驗證密碼。limit組裏面的用戶只允許在limit.gdy.com機器上通過sudo執行一條命令,且不需要提供驗證密碼,其他任何機器都不能使用sudo命令執行命令。manager組裏面的用戶可以在任何主機上執行sudo命令,沒有任何限制,如果要求OpenLDAP用戶提示輸入密碼,只需要將!authenticate中的感嘆號去掉即可。

  4. 添加OpenLDAP用戶到app組和manager組中

    [root@mldap01 ~]# cat << EOF | ldapadd -D "cn=Manager,dc=gdy,dc=com" -c -x -W
    dn: cn=app,ou=Group,dc=gdy,dc=com 
    objectClass: posixGroup
    cn: app
    gidNumber: 10005
    
    dn: cn=manager,ou=Group,dc=gdy,dc=com
    objectClass: posixGroup
    cn: manager
    gidNumber: 10006
    
    dn: uid=jboss,ou=People,dc=gdy,dc=com
    objectClass: account
    objectClass: posixAccount
    objectClass: shadowAccount
    cn: jboss
    uid: jboss
    uidNumber: 20006
    gidNumber: 10005
    userPassword: {CRYPT}$6$eRYFmeDr$siXSlXkO8OEhzHsLvlslFJZpmLnW1ajWU3wG3b4DVAdP6jYJDpUwwJW2juEir3wbpjU6t2h7sSWfRARb2xJ.G1
    homeDirectory: /home/jboss
    loginShell: /bin/bash
    
    dn: uid=manager01,ou=People,dc=gdy,dc=com
    objectClass: account
    objectClass: posixAccount
    objectClass: shadowAccount
    cn: manager01
    uid: manager01
    uidNumber: 20007
    gidNumber: 10006
    userPassword: {CRYPT}$6$yTg3xJfA$VpThv3kvPG1uFw2.n/VgTnk8W05PED9CdEq.RXbz7SdjGd30z51lyuiBUFfd4F8HGQvWV3pWlplqATQh90fpL.
    homeDirectory: /home/manager01
    loginShell: /bin/bash
    EOF
    Enter LDAP Password: 
    adding new entry "cn=app,ou=Group,dc=gdy,dc=com"
    
    adding new entry "cn=manager,ou=Group,dc=gdy,dc=com"
    
    adding new entry "uid=jboss,ou=People,dc=gdy,dc=com"
    
    adding new entry "uid=manager01,ou=People,dc=gdy,dc=com"
  5. 通過ldapsearch指令查看jboss用戶及app組相關信息

    [root@mldap01 ~]# ldapsearch -x -LLL uid=jboss
    dn: uid=jboss,ou=people,dc=gdy,dc=com
    objectClass: account
    objectClass: posixAccount
    objectClass: shadowAccount
    cn: jboss
    uid: jboss
    uidNumber: 20006
    gidNumber: 10005
    homeDirectory: /home/jboss
    loginShell: /bin/bash
    
    [root@mldap01 ~]# ldapsearch -x -LLL cn=app 
    dn: cn=app,ou=Group,dc=gdy,dc=com
    objectClass: posixGroup
    cn: app
    gidNumber: 10005

3. 客戶端配置

  1. 查看當前sudo版本是否支持openldap的sudo規則,不支持的版本需要進行升級

    [user1@test01 openldap]$ rpm -qi sudo  | grep -i version 
    Version     : 1.8.6p3                           Vendor: CentOS
    // 如果sudo版本為1.7.4p5則需要對sudo進行升級,否則無法支持openldap服務器sudo規則的匹配
    
    [user1@test01 openldap]$ sudo -V
    Sudo version 1.8.6p3
    Sudoers policy plugin version 1.8.6p3
    Sudoers file grammar version 42
    Sudoers I/O plugin version 1.8.6p3   //sudo版本的信息
  2. 客戶端加入OpenLDAP服務端

    本文略,具體參考openldap客戶端安裝

  3. 修改nsswitch.conf配置文件,添加sudo查找順序,命令如下

    [root@mldap01 ~]# cat >> /etc/nsswitch.conf << EOF
    > sudoers:      ldap files
    > EOF
    [root@mldap01 ~]# cat /etc/nsswitch.conf | grep -i sudoers
    sudoers:      ldap files
  4. 修改sudo-ldap.conf配置文件,添加支持後端openldap驗證sudo的參數,命令如下:

    [root@mldap01 ~]# cat >> /etc/sudo-ldap.conf << EOF
    > SUDOERS_BASE ou=Sudoers,dc=gdy,dc=com
    > EOF
    [root@mldap01 ~]# cat /etc/sudo-ldap.conf | grep -i Sudoers
    ## SUDOERS_BASE base
    ##  Multiple SUDOERS_BASE lines may be specified, in which
    #sudoers_base ou=SUDOers,dc=example,dc=com
    ## SUDOERS_DEBUG debug_level
    #sudoers_debug 1
    uri ldap://mldap01.gdy.com
    SUDOERS_BASE ou=sudoers,dc=gdy,dc=com

4. 客戶端驗證

驗證OpenLDAP帳號通過sudo提取系統用戶權限

```shell
ldif格式的appman用戶及組
dn: uid=appman,ou=people,dc=gdy,dc=com
uid: appman
cn: appman
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {CRYPT}$6$2v5NKeJj$e1G81HKtTa0fnNX1nqhX1ym/63/X0lHEnobGd0ZBHiwUhcy9SlF8RC.6bPH.CtEbfEVSnn.rRBkRWCAisUrgn/
shadowLastChange: 17675
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 30000
gidNumber: 30000
homeDirectory: /home/appman

dn: cn=appman,ou=Group,dc=gdy,dc=com
objectClass: posixGroup
objectClass: top
cn: appman
userPassword: {crypt}x
gidNumber: 30000

[root@test01 ~]# ssh [email protected]
[email protected]‘s password: 
Last login: Thu May 24 13:49:07 2018 from localhost
[jboss@test01 ~]$ sudo -l
Matching Defaults entries for jboss on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MALL 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_TELEPHOME", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin:/bin:/usr/sbin:/usr/bin, !visiblepw, always_set_home,
    env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC 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

User jboss may run the following commands on this host:
    (appman) NOPASSWD: /bin/bash
[jboss@test01 ~]$ sudo -i -u appman
[appman@test01 ~]$        # 切換成功
```

5. 附:sudo常見屬性介紹

sudo常見的屬性有以下幾個

  • sudoCommand:可執行的二進制命令,如useradd、userdel、mount、umount等。
  • sudoHost:可在哪些機器上執行sudoCommand定義的BASH命令。
  • sudoNotAfter:起始時間sudo規則匹配。
  • sudoNotBefore:結束時間sudo規則匹配。
  • sudoOption:定義超過自身權限及切換至其他用戶時,是否需要輸入當前用戶密碼。
  • sudoOrder:sudo規則執行順序,其屬性是一個整數。
  • sudoRole:定義的規則。
  • sudoRunAS:可切換到定義的用戶身份下執行BASH命令。
  • sudoRunAsGroup:可切換到定義所屬組並具有該組的權限。
  • sudoRunAsUser:定義可切換至哪些用戶下執行命令。
  • sudoUser:限制哪些用戶或哪些組內的成員具有sudo相關規則。

6. 常見錯誤分析

  1. 例1,報錯/home/appman: No such file or directory

    [jboss@test01 ~]$ sudo -i -u appman
    sudo: unable to change directory to /home/appman: No such file or directory
    sudo: unable to execute /bin/bash: No such file or directory

    解決方法:在本機創建appman的家目錄就可以了

05-sudo權限配置