本文由劉遄老師的《Linux就該這么學》摘抄整理而成,寫成博客方便自己后期查閱
該書非常棒,語言簡練,通俗易懂,非常推薦,你可以點連接去學習~
sudo
應用場景與常識
盡管使用su命令后,普通用戶可以完全切換到root管理員身份來完成相應工作,但這將暴露root管理員的密碼,從而增大了系統密碼被黑客獲取的幾率,這顯然並不是最安全的方案。
接下來將介紹如何使用sudo命令把特定命令的執行權限賦予給指定用戶,這樣既可保證普通用戶能夠完成特定的工作,也可以避免泄露root管理員密碼。
我們要做的就是合理配置sudo服務,以便兼顧系統的安全性和用戶的便捷性。
sudo服務的配置原則也很簡單 => 在保證普通用戶完成相應工作的前提下,盡可能少地賦予額外的權限。
sudo命令用於給普通用戶提供額外的權限來完成原本root管理員才能完成的任務
格式:sudo [參數] 命令名稱
sudo 指令可選參數
參數 | 作用 |
---|---|
-h | 列出幫助信息 |
-l | 列出當前用戶可執行的命令 |
-u 用戶名或UID值 | 以指定的用戶身份執行命令 |
-k | 清空密碼的有效時間,下次執行sudo時需要再次進行密碼驗證 |
-b | 在后台執行指定的命令 |
-p | 更改詢問密碼的提示語 |
sudo 的功能
總結來說,sudo命令具有如下功能:
- 限制用戶執行指定的命令
- 記錄用戶執行的每一條命令
- 配置文件(/etc/sudoers)提供集中的用戶管理、權限與主機等參數
- 驗證密碼的后5分鍾內(默認值)無須再讓用戶再次驗證密碼
當然,如果擔心直接修改配置文件會出現問題,則可以使用sudo命令提供的visudo命令來配置用戶權限。
當然,如果擔心直接修改配置文件會出現問題,則可以使用sudo命令提供的visudo命令來配置用戶權限。(只有root管理員才可以使用visudo命令編輯sudo服務的配置文件。)
visudo: >>> /etc/sudoers: syntax error near line 111 <<<
What now?
Options are:
(e)dit sudoers file again
(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)
使用visudo命令配置sudo命令的配置文件時,其操作方法與Vim編輯器中用到的方法一致,因此在編寫完成后記得在末行模式下保存並退出。
在sudo命令的配置文件中,按照下面的格式將第99行(大約)填寫上指定的信息:
誰可以使用 允許使用的主機=(以誰的身份) 可執行命令的列表
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL
在填寫完畢后記得要先保存再退出,然后切換至指定的普通用戶身份,此時就可以用sudo -l命令查看到所有可執行的命令了
(下面的命令中,驗證的是該普通用戶的密碼,而不是root管理員的密碼,請讀者不要搞混了):
[root@linuxprobe ~]# su - linuxprobe
Last login: Thu Sep 3 15:12:57 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ sudo -l
[sudo] password for linuxprobe:此處輸入linuxprobe用戶的密碼
Matching Defaults entries for linuxprobe 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 linuxprobe may run the following commands on this host:
(ALL) ALL
接下來是見證奇跡的時刻!作為一名普通用戶,是肯定不能看到root管理員的家目錄(/root)中的文件信息的,但是,只需要在想執行的命令前面加上sudo命令就可以了:
[linuxprobe@linuxprobe ~]$ ls /root
ls: cannot open directory /root: Permission denied
[linuxprobe@linuxprobe ~]$ sudo ls /root
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
效果立竿見影!
但是考慮到生產環境中不允許某個普通用戶擁有整個系統中所有命令的最高執行權(這也不符合前文提到的權限賦予原則,即盡可能少地賦予權限),因此ALL參數就有些不合適了。
因此只能賦予普通用戶具體的命令以滿足工作需求,這也受到了必要的權限約束。
如果需要讓某個用戶只能使用root管理員的身份執行指定的命令,切記一定要給出該命令的絕對路徑,否則系統會識別不出來。
我們可以先使用whereis命令找出命令所對應的保存路徑,然后把配置文件第99行的用戶權限參數修改成對應的路徑即可:
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) /usr/bin/cat
在編輯好后依然是先保存再退出。再次切換到指定的普通用戶,然后嘗試正常查看某個文件的內容,此時系統提示沒有權限。這時再使用sudo命令就可以順利地查看文件內容了:
[root@linuxprobe ~]# su - linuxprobe
Last login: Thu Sep 3 15:51:01 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[linuxprobe@linuxprobe ~]$ sudo cat /etc/shadow
root:$6$GV3UVtX4ZGg6ygA6$J9pBuPGUSgZslj83jyoI7ThJla9ZAULku3BcncAYF00Uwk6Sqc4E36MnD1hLtlG9QadCpQCNVJs/5awHd0/pi1:16626:0:99999:7:::
bin:*:16141:0:99999:7:::
daemon:*:16141:0:99999:7:::
adm:*:16141:0:99999:7:::
lp:*:16141:0:99999:7:::
sync:*:16141:0:99999:7:::
shutdown:*:16141:0:99999:7:::
halt:*:16141:0:99999:7:::
mail:*:16141:0:99999:7:::
operator:*:16141:0:99999:7:::
games:*:16141:0:99999:7:::
ftp:*:16141:0:99999:7:::
nobody:*:16141:0:99999:7:::
………………省略部分文件內容………………
不知道你有沒有發現,每次執行sudo命令后都會要求驗證一下密碼。雖然這個密碼就是當前登錄用戶的密碼,但是每次執行sudo命令都要輸入一次密碼其實也挺麻煩的,這時可以添加NOPASSWD參數,使得用戶執行sudo命令時不再需要密碼驗證:
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis poweroff
poweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff