1. 程式人生 > >Linux下sudo命令例項講解

Linux下sudo命令例項講解

1、概念:

   sudo是linux下常用的允許普通使用者使用超級使用者許可權的工具,允許系統管理員讓普通使用者執行一些或者全部的root命令,如halt,reboot,su等等。這樣不僅減少了root使用者的登陸和管理時間,同樣也提高了安全性。Sudo不是對shell的一個代替,它是面向每個命令的。

   它的特性主要有這樣幾點:

       1、sudo能夠限制使用者只在某臺主機上執行某些命令。

       2、sudo提供了豐富的日誌,詳細地記錄了每個使用者幹了什麼。它能夠將日誌傳到中心主機或者日誌伺服器。

       3、sudo使用時間戳檔案--日誌 來執行類似的“檢票”系統。當用戶呼叫sudo並且輸入它的密碼時,使用者獲得了一張存活期為5分鐘的票(這個值可以在編譯的時候改變)。

       4、sudo的配置檔案是/etc/sudoers,屬性必須為0440,它允許系統管理員集中的管理使用者的使用許可權和使用的主機。

2、編輯配置檔案命令:visudo

       注意:編輯sudo的配置檔案/etc/sudoers是一般不要直接使用vi(vi /etc/sudoers)去編輯,因為sudoers配置有一定的語法,直接用vi編輯儲存系統不會檢查語法,如有錯也儲存了可能導致無法使用sudo工具,最好使用visudo命令去配置。雖然visudo也是呼叫vi去編輯,但是儲存時會進行語法檢查,有錯會有提示。

3、語法,引數

sudo [ -Vhl LvkKsHPSb ] │ [ -p prompt ] [ -c class│- ] [ -a auth_type ] [-u username│#uid ] command
引數:
-V 顯示版本編號
-h 會顯示版本編號及指令的使用方式說明
-l 顯示出自己(執行 sudo 的使用者)的許可權
-v 因為 sudo 在第一次執行時或是在 N 分鐘內沒有執行(N 預設為五)會問密碼,這個引數是重新做一次確認,如果超過 N 分鐘,也會問密碼
-k 將會強迫使用者在下一次執行 sudo 時問密碼(不論有沒有超過 N 分鐘)
-b 將要執行的指令放在背景執行
-p prompt 可以更改問密碼的提示語,其中 %u 會代換為使用者的帳號名稱, %h 會顯示主機名稱
-u username/#uid 不加此引數,代表要以 root 的身份執行指令,而加了此引數,可以以 username 的身份執行指令(#uid 為該 username 的使用者號碼)
-s 執行環境變數中的 SHELL 所指定的 shell ,或是 /etc/passwd 裡所指定的 shell
-H 將環境變數中的 HOME (家目錄)指定為要變更身份的使用者家目錄(如不加 -u 引數就是系統管理者 root )
command 要以系統管理者身份(或以 -u 更改為其他人)執行的指令

二、實戰演練

1定義一個使用者(tom)使其擁有新增使用者的特殊許可權,並進行建立使用者操作。

①、建立tom併為其建立密碼

[[email protected] ~]# useradd tom
[[email protected] ~]# echo "tom" | passwd --stdin tom
Changing password for user tom.
passwd: all authentication tokens updated successfully.

②、修改配置檔案,為tom新增特殊許可權useradd

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
tom     ALL=(root)      /usr/sbin/useradd       ##新增許可權,這裡的/usr/sbin/useradd表示普通使用者執行時必須使用全路徑,可以使用which 命令檢視哦!
## Allows members of the 'sys' group to run networking, software,


③、切換到使用者tom,驗證特殊許可權

[[email protected] ~]# su - tom    ##切換使用者
[[email protected] ~]$ sudo -l    ##檢視此使用者擁有的特殊許可權
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.
[sudo] password for tom:     ##這裡需要驗證密碼,以保證是使用者本人執行操作
Matching Defaults entries for tom on this host:
    requiretty, !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 tom may run the following commands on this host:
    (root) /usr/sbin/useradd    ##可以以root身份,使用useradd命令
tom執行useradd
[[email protected] ~]$ sudo /usr/sbin/useradd test1    ##新增使用者test1
[[email protected] ~]$ tail -1 /etc/passwd
test1:x:501:501::/home/test1:/bin/bash        ##新增成功
④、檢視日誌/vat/log/secure
注意:要切換回root才有許可權檢視日誌
[[email protected] ~]# tail /var/log/secure
Apr  5 13:55:58 localhost su: pam_unix(su-l:session): session opened for user tom by root(uid=0)
Apr  5 13:56:11 localhost su: pam_unix(su-l:session): session closed for user tom
Apr  5 13:56:17 localhost passwd: pam_unix(passwd:chauthtok): password changed for tom
Apr  5 13:56:17 localhost passwd: gkr-pam: couldn't update the 'login' keyring password: no old password was entered
Apr  5 13:56:23 localhost su: pam_unix(su-l:session): session opened for user tom by root(uid=0)
Apr  5 13:56:43 localhost sudo:      tom : TTY=pts/0 ; PWD=/home/tom ; USER=root ; COMMAND=list
##tom以管理員身份執行了list命令
Apr  5 14:00:50 localhost sudo:      tom : TTY=pts/0 ; PWD=/home/tom ; USER=root ; COMMAND=/usr/sbin/useradd test1 
##tom以管理員身份執行了useradd命令,新增使用者test1
Apr  5 14:00:50 localhost useradd[2128]: new group: name=test1, GID=501
Apr  5 14:00:50 localhost useradd[2128]: new user: name=test1, UID=501, GID=501, home=/home/test1, shell=/bin/bash
Apr  5 14:07:15 localhost su: pam_unix(su-l:session): session closed for user tom
以後可以使用此命令日誌檢視主機是否遭到入侵攻擊,或者檢視某使用者登入進來並使用特殊許可權執行錯誤指令等等。所以我們要實時監控此檔案的動向。

⑤、-k引數示例

[[email protected] ~]# su - tom
[[email protected] ~]$ sudo -k    ##結束密碼有效期
[[email protected] ~]$ sudo /usr/sbin/useradd test2
[sudo] password for tom:     ##有效期結束後,執行特殊命令,需重新驗證密碼
[[email protected] ~]$ tail -1 /etc/passwd
test2:x:502:502::/home/test2:/bin/bash    #新增test2成功
2、別名應用,alias:

sudoers檔案支援使用別名對同類物件進行分組:組名必須使用全大寫字母,使用逗號將同類物件命令隔開。
Host_Alias:主機別名
User_Alias:使用者別名
Runas_Alias:在哪些主機以誰的身份執行  的別名
Cmnd_Alias:命令別名
①、在配置檔案中定義別名
[[email protected] ~]# visudo
Host_Alias USERHOSTS = 172.16.0.0/16,127.0.0.0/8,192.168.0.0/24    ##定義主機別名,可以在哪些機器執行特殊命令
Cmnd_Alias    USERADMIN=/usr/sbin/useradd,/usr/sbin/usermod,/usr/sbin/userdel    ##定義命令別名
root    ALL=(ALL)       ALL
tom     ALL=(root)      USERADMIN    ##此處定義tom可以執行別名USERADMIN中的所有命令
tom     USERHOSTS=(ROOT)        USERADMIN    ##可以在別名USERHOSTS中機器上執行別名USERADMIN中的命令



驗證:

[[email protected] ~]# su - tom
[[email protected] ~]$ sudo /usr/sbin/userdel -r test2    ##刪除使用者test2
[sudo] password for tom:
[[email protected] ~]$ tail -1 /etc/passwd    ##刪除成功
test1:x:501:501::/home/test1:/bin/bash
②、設禁止某使用者執行某操作
tom ALL=(root) /usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root
##tom可以以root的身份更改密碼,但禁止更改root的密碼。

③、設定執特權命了時,無需輸入密碼

tom   ALL=(root)    /usr/sbin/useradd,NOPASSWD: /usr/sbin/userdel,/usr/sbin/groupdel,PASSWD: /usr/sbin/usermod,/usr/sbin/groupmod
##這裡的/usr/sbin/useradd 操作時必須使用密碼;/usr/sbin/userdel, /usr/sbin/groupdel操作時可以不使用密碼(跟在其後的所有操作一律不使用密碼);/usr/sbin/usermod, /usr/sbin/groupmod 操作時還是要輸入密碼;還有PASSWD和NOPASSWD不可定義於別名中哦!

驗證:
[[email protected] ~]# su - tom
[[email protected] ~]$ sudo /usr/sbin/useradd test3
[sudo] password for tom:
[[email protected] ~]$ sudo -k
[[email protected] ~]$ sudo /usr/sbin/useradd test4
[sudo] password for tom:     ##useradd每次都需要輸入密碼
[[email protected] ~]$ sudo -k
[[email protected] ~]$ sudo /usr/sbin/userdel test3    ##執行userdel沒有要求輸入密碼,NOPASSWD設定生效
[[email protected] ~]$ tail -3 /etc/passwd
tom:x:500:500::/home/tom:/bin/bash
test1:x:501:501::/home/test1:/bin/bash
test4:x:503:503::/home/test4:/bin/bash