5.6 su命令與sudo服務(wù)

2022-05-30 14:02 更新

各位讀者在實(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
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號