W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
各位讀者在實(shí)驗(yàn)環(huán)境中很少遇到安全問題,并且為了避免因權(quán)限因素導(dǎo)致配置服務(wù)失敗,從而建議使用root管理員來學(xué)習(xí)本書,但是在生產(chǎn)環(huán)境中還是要對安全多一份敬畏之心,不要用root管理員去做所有事情。因?yàn)橐坏﹫?zhí)行了錯(cuò)誤的命令,可能會(huì)直接導(dǎo)致系統(tǒng)崩潰,這樣一來,不但客戶指責(zé)、領(lǐng)導(dǎo)批評,沒準(zhǔn)獎(jiǎng)金也會(huì)雞飛蛋打。但轉(zhuǎn)頭一想,盡管Linux系統(tǒng)為了安全性考慮,使得許多系統(tǒng)命令和服務(wù)只能被root管理員來使用,但是這也讓普通用戶受到了更多的權(quán)限束縛,從而導(dǎo)致無法順利完成特定的工作任務(wù)。
su命令可以解決切換用戶身份的需求,使得當(dāng)前用戶在不退出登錄的情況下,順暢地切換到其他用戶,比如從root管理員切換至普通用戶:
[root@linuxprobe ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@linuxprobe ~]# su - linuxprobe
Last login: Wed Jan 4 01:17:25 EST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ id
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
細(xì)心的讀者一定會(huì)發(fā)現(xiàn),上面的su命令與用戶名之間有一個(gè)減號(-),這意味著完全切換到新的用戶,即把環(huán)境變量信息也變更為新用戶的相應(yīng)信息,而不是保留原始的信息。強(qiáng)烈建議在切換用戶身份時(shí)添加這個(gè)減號(-)。
另外,當(dāng)從root管理員切換到普通用戶時(shí)是不需要密碼驗(yàn)證的,而從普通用戶切換成root管理員就需要進(jìn)行密碼驗(yàn)證了;這也是一個(gè)必要的安全檢查:
[linuxprobe@linuxprobe root]$ su root
Password:
[root@linuxprobe ~]# su - linuxprobe
Last login: Mon Aug 24 19:27:09 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]#
盡管像上面這樣使用su命令后,普通用戶可以完全切換到root管理員身份來完成相應(yīng)工作,但這將暴露root管理員的密碼,從而增大了系統(tǒng)密碼被黑客獲取的幾率;這并不是最安全的方案。
劉遄老師接下來將介紹如何使用sudo命令把特定命令的執(zhí)行權(quán)限賦予給指定用戶,這樣既可保證普通用戶能夠完成特定的工作,也可以避免泄露root管理員密碼。我們要做的就是合理配置sudo服務(wù),以便兼顧系統(tǒng)的安全性和用戶的便捷性。sudo服務(wù)的配置原則也很簡單—在保證普通用戶完成相應(yīng)工作的前提下,盡可能少地賦予額外的權(quán)限。
sudo命令用于給普通用戶提供額外的權(quán)限來完成原本root管理員才能完成的任務(wù),格式為“sudo [參數(shù)] 命令名稱”。sudo服務(wù)中可用的參數(shù)以及相應(yīng)的作用如表5-7所示。
表5-7 sudo服務(wù)中的可用參數(shù)以及作用
參數(shù) | 作用 |
---|---|
-m | 修改權(quán)限 |
-M | 從文件中讀取權(quán)限 |
-x | 刪除某個(gè)權(quán)限 |
-b | 刪除全部權(quán)限 |
-R | 遞歸子目錄 |
總結(jié)來說,sudo命令具有如下功能:
限制用戶執(zhí)行指定的命令:
記錄用戶執(zhí)行的每一條命令;
配置文件(/etc/sudoers)提供集中的用戶管理、權(quán)限與主機(jī)等參數(shù);
驗(yàn)證密碼的后5分鐘內(nèi)(默認(rèn)值)無須再讓用戶再次驗(yàn)證密碼。
當(dāng)然,如果擔(dān)心直接修改配置文件會(huì)出現(xiàn)問題,則可以使用sudo命令提供的visudo命令來配置用戶權(quán)限。這條命令在配置用戶權(quán)限時(shí)將禁止多個(gè)用戶同時(shí)修改sudoers配置文件,還可以對配置文件內(nèi)的參數(shù)進(jìn)行語法檢查,并在發(fā)現(xiàn)參數(shù)錯(cuò)誤時(shí)進(jìn)行報(bào)錯(cuò)。
只有root管理員才可以使用visudo命令編輯sudo服務(wù)的配置文件。
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命令的配置文件時(shí),其操作方法與Vim編輯器中用到的方法一致,因此在編寫完成后記得在末行模式下保存并退出。在sudo命令的配置文件中,按照下面的格式將第99行(大約)填寫上指定的信息:
誰可以使用 允許使用的主機(jī)=(以誰的身份) 可執(zhí)行命令的列表
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL
在填寫完畢后記得要先保存再退出,然后切換至指定的普通用戶身份,此時(shí)就可以用sudo -l命令查看到所有可執(zhí)行的命令了(下面的命令中,驗(yàn)證的是該普通用戶的密碼,而不是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
接下來是見證奇跡的時(shí)刻!作為一名普通用戶,是肯定不能看到root管理員的家目錄(/root)中的文件信息的,但是,只需要在想執(zhí)行的命令前面加上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
效果立竿見影!但是考慮到生產(chǎn)環(huán)境中不允許某個(gè)普通用戶擁有整個(gè)系統(tǒng)中所有命令的最高執(zhí)行權(quán)(這也不符合前文提到的權(quán)限賦予原則,即盡可能少地賦予權(quán)限),因此ALL參數(shù)就有些不合適了。因此只能賦予普通用戶具體的命令以滿足工作需求,這也受到了必要的權(quán)限約束。如果需要讓某個(gè)用戶只能使用root管理員的身份執(zhí)行指定的命令,切記一定要給出該命令的絕對路徑,否則系統(tǒng)會(huì)識別不出來。我們可以先使用whereis命令找出命令所對應(yīng)的保存路徑,然后把配置文件第99行的用戶權(quán)限參數(shù)修改成對應(yīng)的路徑即可:
[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
在編輯好后依然是先保存再退出。再次切換到指定的普通用戶,然后嘗試正常查看某個(gè)文件的內(nèi)容,此時(shí)系統(tǒng)提示沒有權(quán)限。這時(shí)再使用sudo命令就可以順利地查看文件內(nèi)容了:
[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:::
………………省略部分文件內(nèi)容………………
大家千萬不要以為到這里就結(jié)束了,劉遄老師還有更壓箱底的寶貝。不知大家是否發(fā)覺在每次執(zhí)行sudo命令后都會(huì)要求驗(yàn)證一下密碼。雖然這個(gè)密碼就是當(dāng)前登錄用戶的密碼,但是每次執(zhí)行sudo命令都要輸入一次密碼其實(shí)也挺麻煩的,這時(shí)可以添加NOPASSWD參數(shù),使得用戶執(zhí)行sudo命令時(shí)不再需要密碼驗(yàn)證:
[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
這樣,當(dāng)切換到普通用戶后再執(zhí)行命令時(shí),就不用再頻繁地驗(yàn)證密碼了,我們在日常工作中也就痛快至極了。
[root@linuxprobe ~]# su - linuxprobe
Last login: Thu Sep 3 15:58:31 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ poweroff
User root is logged in on seat0.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl poweroff -i'.
[linuxprobe@linuxprobe ~]$ sudo poweroff
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: