1. 程式人生 > >sudo-為普通使用者提權

sudo-為普通使用者提權

目錄

sudo簡介

Sudosubstitute user [或 superuser]do)是linux系統管理指令,允許系統管理員委派授權給某些使用者(或使用者組)以root使用者或其他使用者身份執行某些(或全部)命令的能力,同時提供命令及其引數的審計跟蹤。

sudo特性

  • sudo能夠授權指定使用者在指定主機上執行某些命令。 如果未授權使用者嘗試使用 sudo,會提示聯絡管理員。
  • sudo可以提供日誌,記錄每個使用者使用sudo操作。
  • sudo為系統管理員提供配置檔案,允許系統管理員集中地管理使用者的使用許可權和使用的主機。
  • sudo使用時間戳檔案來完成類似“檢票”的系統,預設存活期為5分鐘的“入場券” 。

相關檔案

配置檔案: /etc/sudoers,/etc/sudoers.d/ 可以修改/etc/sudoers也可以在/etc/sudoers.d/目錄下新建配置檔案

時間戳檔案:/var/db/sudo

日誌檔案:/var/log/secure

配置檔案

配置支援使用萬用字元glob
  • :任意單一字元
  • *:匹配任意長度字元
    • [wxc]:匹配其中一個字元
    • [!wxc]:除了這三個字元的其他字元
  • x:轉義
    • [[alpha]]:字母:示例:/bin/ls [[alpha]]*
配置檔案規則:
  1. 別名定義:不是必須的除了
  2. 授權規則:必須的
授權規則格式:
  • user host=(runas) command

使用者 登入主機=(代表使用者) 命令

示例:root ALL=(ALL) ALL

  • 格式說明:

    • user:執行命令者的身份
    • username:使用者名稱
    • #uid:使用者UID
    • %group_name:組名
    • %#gid:使用者組GID
    • User_Alias:使用者別名

    使用者別名:格式User_Alias USER=使用者1,使用者2...。例:User_Alias DBA=haiyun,wang;其中DBA是別名,haiyun,wang是別名內的使用者。注:別名必須為大寫。

  • host:通過哪些主機

    • iphostnameIP或者主機名
    • network(/netmask
      ):網段
    • Host_Alias:主機別名

    主機別名:格式Host_Alias HOST=主機1,主機2...。例:Host_Alias HOST=192.168.8.10,192.168.8.100。其中:HOST是別名,192.168.8.10,192.168.8.100是別名中的IP。注:別名必須大寫。

  • (runas):以哪個使用者的身份
    • username:使用者名稱
  • #uid:使用者UID
  • %group_name:組名
  • %#gid:使用者組GID
  • Runas_Alias:使用者別名

    使用者別名:格式Runas_Alias USER=使用者1,使用者2...。用法同User_Alias。注:別名必須大寫。

  • command:執行哪些命令
    • command name:命令名稱,注:寫絕對路徑
    • directory:目錄下的命令
    • sudoedit:有編輯sudoers檔案的許可權,授權的使用者可以自定義許可權
    • Cmnd_Alias:命令別名
      命令別名:格式Cmnd_Alias CMD=命令1,命令2...。例:Cmnd_Alias CMD=/bin/cat,/bin/mount。其中,CMD為別名,/bin/cat,/bin/mount為別名中的命令。注:別名必須大寫。

      命令執行不需要密碼,在Commands前可以加NOPASSWD:CMD例如:haiyun ALL=(ALL) NOPASSWD: ALL。代表haiyun使用者可以執行所有命令,且不需要密碼。注:這只是一個例子,並不建議這麼做。
  • 範例

    範例1:使使用者haiyun能夠有許可權掛載/dev/sr0/mnt/cdrom目錄下
    [root@A ~]# vi /etc/sudoers            #修改檔案/etc/sudoers
    root    ALL=(ALL)   ALL             #在此行後面新增,下面內容。注:命令要寫絕對路徑
    haiyun ALL=(ALL) /bin/mount /dev/sr0 /mnt/cdrom
    [root@A ~]# su - haiyun                # 切換到haiyun使用者
    [haiyun@A ~]$ sudo /bin/mount /dev/sr0 /mnt/cdrom # 使用sudo執行掛載命令
    [sudo] password for haiyun:                 # 輸入使用者haiyun的密碼
    mount: block device /dev/sr0 is write-protected, mounting read-only     #掛載成功
    [haiyun@A ~]$ df /dev/sr0         #確認掛載成功
    Filesystem     1K-blocks    Used Available Use% Mounted on
    /dev/sr0         3878870 3878870         0 100% /mnt/cdrom
    範例2:使使用者haiyun能夠有許可權編輯/etc/sudoers檔案
    [root@A ~]# sudoedit /etc/sudoers.d/test   #編輯檔案/etc/sudoers.d/test
    haiyun ALL=(ALL) /usr/bin/sudoedit /etc/sudoers.d/test  #是使用者haiyun可以編輯test檔案
    [root@A ~]# su - haiyun
    [haiyun@A ~]$ sudo /usr/bin/sudoedit /etc/sudoers.d/test
    [sudo] password for haiyun: 
    #haiyun ALL=(ALL) /usr/bin/sudoedit /etc/sudoers.d/test     #haiyun使用者可以編輯test檔案
    [haiyun@A ~]$ sudo /usr/bin/sudoedit /etc/sudoers.d/test  # 註釋後已經不能使用 
    Sorry, user haiyun is not allowed to execute '/usr/bin/sudoedit /etc/sudoers.d/test' as root on A.
    範例3:使wang使用者和haiyun使用者能夠有許可權修改IP,使用別名實現,且不需要輸入密碼
    [root@A ~]# sudoedit /etc/sudoers.d/test       # 
    User_Alias NETUSER=wang,haiyun      # 定義別名NETUSER,有兩個使用者wang,haiyun
    Cmnd_Alias IP=/sbin/ip      # 定義命令別名為 /sbin/ip
    NETUSER  ALL=(root)  NOPASSWD: IP       # NOPASSWD代表無需輸入密碼
    [haiyun@A ~]$ sudo ip add add 192.168.1.2/24 dev eth0         # 使用haiyun使用者執行新增IP命令
    [haiyun@A ~]$ ip addr show dev eth0       # 檢視eth0的iP,已經新增
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:de:d2:82 brd ff:ff:ff:ff:ff:ff
        inet 172.18.250.42/16 brd 172.18.255.255 scope global eth0
        inet 192.168.1.2/24 scope global eth0
        inet6 fe80::20c:29ff:fede:d282/64 scope link 
           valid_lft forever preferred_lft forever
    [root@A ~]# su - wang      # 切換到wang使用者 
    [wang@A ~]$ ip add del 192.168.1.2/24 dev eth0    # 直接刪除IP是沒有許可權的
    RTNETLINK answers: Operation not permitted
    [wang@A ~]$ sudo ip add del 192.168.1.2/24 dev eth0   # 使用sudo可以刪除
    [wang@A ~]$ ip addr show eth0     # 檢視eth0IP已經別刪除
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:de:d2:82 brd ff:ff:ff:ff:ff:ff
        inet 172.18.250.42/16 brd 172.18.255.255 scope global eth0
        inet6 fe80::20c:29ff:fede:d282/64 scope link 
           valid_lft forever preferred_lft forever
    範例4:使wang使用者和haiyun使用者能夠有許可權檢視/etc/shadow檔案,預設為haiyun使用者。
    [root@A ~]# sudoedit /etc/sudoers.d/test   # 編輯/etc/sudoers.d/test檔案   
    Defaults:haiyun runas_default=wang
    haiyun ALL=(root) /bin/cat /etc/shadow
    [root@A ~]# sudo /bin/cat /etc/shadow  # 使用sudo檢視/etc/shadow檔案
    root:$6$SVxwnkSIO7UUYS71$Nga3eujjzHub.oIfdEY12TLdVwpbJ/WNDaLTrvl4.WkfMYiEGCfW85vX5vVWj08mWT2nkkFXHoge7SaZGIKcA.:17392:0:99999:7:::
    bin:*:17246:0:99999:7:::
    [root@A ~]# sudo -u wang /bin/cat /etc/shadow  # 使用wang使用者檢視shadow檔案,無許可權
    /bin/cat: /etc/shadow: Permission denied
    範例5:使haiyun使用者能夠有許可權使用/usr/sbin/目錄下的所有命令除了/usr/sbin/userdel命令
    [root@A ~]# sudoedit /etc/sudoers.d/test   # 新增規則使haiyun使用者能夠使用/usr/sbin/目錄下的所有命令除了/usr/sbin/userdel命令
    haiyun ALL=(root) /usr/sbin/,!/usr/sbin/userdel
    [haiyun@A ~]$ useradd test        # 直接新增使用者是沒有許可權的
    -bash: /usr/sbin/useradd: Permission denied
    [haiyun@A ~]$ sudo useradd test       # 使用sudo可以新增
    [haiyun@A ~]$ id test     # 檢視test的UID等資訊
    uid=514(test) gid=514(test) groups=514(test)
    [haiyun@A ~]$ sudo userdel -r test        # 刪除test使用者,是沒有許可權的
    Sorry, user haiyun is not allowed to execute '/usr/sbin/userdel -r test' as root on A.
    範例6:使使用者haiyun能夠有許可權檢視/var/log/message後的所有檔案
    [[email protected] ~]# sudoedit /etc/sudoers.d/test   #編輯/etc/sudoer.d/test檔案
    haiyun ALL=(root) /bin/cat /var/log/message*    #使haiyun使用者能夠檢視/var/log/message檔案
    [[email protected] ~]$ sudo /bin/cat /var/log/messages /etc/shadow #但這樣又會有一個問題後面跟一個其他檔案也能查看了
    Sep 13 09:30:29 centos6 xinetd[1391]: xinetd Version 2.3.14 started with libwrap loadavg labeled-networking options compiled in.
    Sep 13 09:30:29 centos6 xinetd[1391]: Started working: 0 available services
    Sep 13 12:52:37 centos6 yum[2876]: Installed: zlib-devel-1.2.3-29.el6.x86_64
    Sep 13 14:15:12 centos6 yum[7400]: Installed: aide-0.14-11.el6.x86_64
    Sep 13 19:16:39 centos6 dhclient[1114]: DHCPREQUEST on eth0 to 172.18.0.1 port 67 (xid=0x44c4eda2)
    Sep 13 19:16:40 centos6 dhclient[1114]: DHCPACK from 172.18.0.1 (xid=0x44c4eda2)
    Sep 13 19:16:42 centos6 dhclient[1114]: bound to 172.18.250.42 -- renewal in 41913 seconds.
    。。。省略後面內容
    root:$6$SVxwnkSIO7UUYS71$Nga3eujjzHub.oIfdEY12TLdVwpbJ/WNDaLTrvl4.WkfMYiEGCfW85vX5vVWj08mWT2nkkFXHoge7SaZGIKcA.:17392:0:99999:7:::
    bin:*:17246:0:99999:7:::
    。。。省略後面內容
    [[email protected] ~]# sudoedit /etc/sudoers.d/test   #再次編輯/etc/sudoer.d/test檔案
    haiyun ALL=(root) /bin/cat /var/log/message*,!/bin/cat /var/log/messages* * #我們將後面跟空的檔案排除了
    [[email protected] ~]$ sudo /bin/cat /var/log/messages-20170820 /etc/shadow  #這樣是不可以看的
    Sorry, user haiyun is not allowed to execute '/bin/cat /var/log/messages-20170820 /etc/shadow' as root on centos6.haiyun.com.
    [[email protected] ~]$ sudo /bin/cat /var/log/messages-20170820  #跟一個檔案就可以了
    Aug 20 09:26:49 centos6 kernel: type=1305 audit(1503192408.924:3): audit_pid=1238 old=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:auditd_t:s0 res=1
    Aug 20 09:27:00 centos6 automount[1319]: problem reading master map, maximum wait exceeded
    Aug 20 09:27:00 centos6 automount[1319]: automount: warning: could not read at least one map source after waiting, continuing ...
    Aug 20 09:27:01 centos6 kdump: kexec: loaded kdump kernel
    Aug 20 09:27:01 centos6 kdump: started up
    。。。後面內容省略

    sudo命令和引數

    • sudo –i –u wang 切換身份為wang使用者
    • `sudo -u user 預設為root,使用指定的使用者執行命令
    • sudo -l 列出使用者在主機上可用的和被禁止的命令
    • sudo -v 再延長密碼有效期限5分鐘,更新時間戳
    • sudo -k 清除時間戳(1970-01-01),下次需要重新輸密碼
    • sudo -b 在後臺執行指令

    su命令

    su命令用於變更為其他使用者的身份,除 root 外,需要鍵入該使用者的密碼。

    su - username:代表使用login-shell的變數檔案讀取方式來登陸系統

    su username -c command:僅進行一次命令

    注意事項:

    1. centos 7 將普通使用者新增到wheel組因為whell組預設sudo有全部許可權的。注意此行:%wheel ALL=(ALL) ALLcentos 7預設是開啟的。
    2. 假設rootUID不是0的話,那麼也可以利用sudo實現管理操作。可以考略將此行:root ALL=(ALL) ALL禁用掉。