5.3 文件的特殊權(quán)限

2022-05-30 13:53 更新

在復(fù)雜多變的生產(chǎn)環(huán)境中,單純?cè)O(shè)置文件的rwx權(quán)限無法滿足我們對(duì)安全和靈活性的需求,因此便有了SUID、SGID與SBIT的特殊權(quán)限位。這是一種對(duì)文件權(quán)限進(jìn)行設(shè)置的特殊功能,可以與一般權(quán)限同時(shí)使用,以彌補(bǔ)一般權(quán)限不能實(shí)現(xiàn)的功能。下面具體解釋這3個(gè)特殊權(quán)限位的功能以及用法。

  1. SUID

SUID是一種對(duì)二進(jìn)制程序進(jìn)行設(shè)置的特殊權(quán)限,可以讓二進(jìn)制程序的執(zhí)行者臨時(shí)擁有屬主的權(quán)限(僅對(duì)擁有執(zhí)行權(quán)限的二進(jìn)制程序有效)。例如,所有用戶都可以執(zhí)行passwd命令來修改自己的用戶密碼,而用戶密碼保存在/etc/shadow文件中。仔細(xì)查看這個(gè)文件就會(huì)發(fā)現(xiàn)它的默認(rèn)權(quán)限是000,也就是說除了root管理員以外,所有用戶都沒有查看或編輯該文件的權(quán)限。但是,在使用passwd命令時(shí)如果加上SUID特殊權(quán)限位,就可讓普通用戶臨時(shí)獲得程序所有者的身份,把變更的密碼信息寫入到shadow文件中。這很像我們?cè)诠叛b劇中見到的手持尚方寶劍的欽差大臣,他手持的尚方寶劍代表的是皇上的權(quán)威,因此可以懲戒貪官,但這并不意味著他永久成為了皇上。因此這只是一種有條件的、臨時(shí)的特殊權(quán)限授權(quán)方法。

查看passwd命令屬性時(shí)發(fā)現(xiàn)所有者的權(quán)限由rwx變成了rws,其中x改變成s就意味著該文件被賦予了SUID權(quán)限。另外有讀者會(huì)好奇,那么如果原本的權(quán)限是rw-呢?如果原先權(quán)限位上沒有x執(zhí)行權(quán)限,那么被賦予特殊權(quán)限后將變成大寫的S。

    [root@linuxprobe ~]# ls -l /etc/shadow
    ----------. 1 root root 1004 Jan 3 06:23 /etc/shadow
    [root@linuxprobe ~]# ls -l /bin/passwd
    -rwsr-xr-x. 1 root root 27832 Jan 29 2017 /bin/passwd
  1. SGID

SGID主要實(shí)現(xiàn)如下兩種功能:

讓執(zhí)行者臨時(shí)擁有屬組的權(quán)限(對(duì)擁有執(zhí)行權(quán)限的二進(jìn)制程序進(jìn)行設(shè)置);

在某個(gè)目錄中創(chuàng)建的文件自動(dòng)繼承該目錄的用戶組(只可以對(duì)目錄進(jìn)行設(shè)置)。

SGID的第一種功能是參考SUID而設(shè)計(jì)的,不同點(diǎn)在于執(zhí)行程序的用戶獲取的不再是文件所有者的臨時(shí)權(quán)限,而是獲取到文件所屬組的權(quán)限。舉例來說,在早期的Linux系統(tǒng)中,/dev/kmem是一個(gè)字符設(shè)備文件,用于存儲(chǔ)內(nèi)核程序要訪問的數(shù)據(jù),權(quán)限為:

    cr--r-----   1 root system 2,  1 Feb 11 2017  kmem

大家看出問題了嗎?除了root管理員或?qū)儆趕ystem組成員外,所有用戶都沒有讀取該文件的權(quán)限。由于在平時(shí)我們需要查看系統(tǒng)的進(jìn)程狀態(tài),為了能夠獲取到進(jìn)程的狀態(tài)信息,可在用于查看系統(tǒng)進(jìn)程狀態(tài)的ps命令文件上增加SGID特殊權(quán)限位。查看ps命令文件的屬性信息:

    -r-xr-sr-x   1 bin system 59346 Feb 11 2017  ps

這樣一來,由于ps命令被增加了SGID特殊權(quán)限位,所以當(dāng)用戶執(zhí)行該命令時(shí),也就臨時(shí)獲取到了system用戶組的權(quán)限,從而可以順利地讀取設(shè)備文件了。

前文提到,每個(gè)文件都有其歸屬的所有者和所屬組,當(dāng)創(chuàng)建或傳送一個(gè)文件后,這個(gè)文件就會(huì)自動(dòng)歸屬于執(zhí)行這個(gè)操作的用戶(即該用戶是文件的所有者)。如果現(xiàn)在需要在一個(gè)部門內(nèi)設(shè)置共享目錄,讓部門內(nèi)的所有人員都能夠讀取目錄中的內(nèi)容,那么就可以創(chuàng)建部門共享目錄后,在該目錄上設(shè)置SGID特殊權(quán)限位。這樣,部門內(nèi)的任何人員在里面創(chuàng)建的任何文件都會(huì)歸屬于該目錄的所屬組,而不再是自己的基本用戶組。此時(shí),我們用到的就是SGID的第二個(gè)功能,即在某個(gè)目錄中創(chuàng)建的文件自動(dòng)繼承該目錄的用戶組(只可以對(duì)目錄進(jìn)行設(shè)置)。

    [root@linuxprobe ~]# cd /tmp
    [root@linuxprobe tmp]# mkdir testdir
    [root@linuxprobe tmp]# ls -ald testdir/
    drwxr-xr-x. 2 root root 6 Feb 11 11:50 testdir/
    [root@linuxprobe tmp]# chmod -Rf 777 testdir/
    [root@linuxprobe tmp]# chmod -Rf g+s testdir/
    [root@linuxprobe tmp]# ls -ald testdir/
    drwxrwsrwx. 2 root root 6 Feb 11 11:50 testdir/

在使用上述命令設(shè)置好目錄的777權(quán)限(確保普通用戶可以向其中寫入文件),并為該目錄設(shè)置了SGID特殊權(quán)限位后,就可以切換至一個(gè)普通用戶,然后嘗試在該目錄中創(chuàng)建文件,并查看新創(chuàng)建的文件是否會(huì)繼承新創(chuàng)建的文件所在的目錄的所屬組名稱:

    [root@linuxprobe tmp]# su - linuxprobe
    Last login: Wed Feb 11 11:49:16 CST 2017 on pts/0
    [linuxprobe@linuxprobe ~]$ cd /tmp/testdir/
    [linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test
    [linuxprobe@linuxprobe testdir]$ ls -al test
    -rw-rw-r--. 1 linuxprobe root 15 Feb 11 11:50 test

除了上面提到的SGID的這兩個(gè)功能,我們?cè)俳榻B兩個(gè)與本小節(jié)內(nèi)容相關(guān)的命令:chmod和chown。

chmod命令是一個(gè)非常實(shí)用的命令,能夠用來設(shè)置文件或目錄的權(quán)限,格式為“chmod [參數(shù)] 權(quán)限 文件或目錄名稱”。如果要把一個(gè)文件的權(quán)限設(shè)置成其所有者可讀可寫可執(zhí)行、所屬組可讀可寫、其他人沒有任何權(quán)限,則相應(yīng)的字符法表示為rwxrw----,其對(duì)應(yīng)的數(shù)字法表示為760。通過前面的基礎(chǔ)學(xué)習(xí)和當(dāng)前的練習(xí)實(shí)踐,現(xiàn)在大家可以感受到使用數(shù)字法來設(shè)置文件權(quán)限的便捷性了吧。

    [root@linuxprobe ~]# ls -al test
    -rw-rw-r--. 1 linuxprobe root 15 Feb 11 11:50 test
    [root@linuxprobe ~]# chmod 760 test
    [root@linuxprobe ~]# ls -l test
    -rwxrw----. 1 linuxprobe root 15 Feb 11 11:50 test

除了設(shè)置文件或目錄的權(quán)限外,還可以設(shè)置文件或目錄的所有者和所屬組,這里使用的命令為chown,其格式為“chown [參數(shù)] 所有者:所屬組 文件或目錄名稱”。

chmod和chown命令是用于修改文件屬性和權(quán)限的最常用命令,它們還有一個(gè)特別的共性,就是針對(duì)目錄進(jìn)行操作時(shí)需要加上大寫參數(shù)-R來表示遞歸操作,即對(duì)目錄內(nèi)所有的文件進(jìn)行整體操作。

    [root@linuxprobe ~]# ls -l test
    -rwxrw----. 1 linuxprobe root 15 Feb 11 11:50 test
    [root@linuxprobe ~]# chown root:bin test
    [root@linuxprobe ~]# ls -l test
    -rwxrw----. 1 root bin 15 Feb 11 11:50 test
  1. SBIT

現(xiàn)在,大學(xué)里的很多老師都要求學(xué)生將作業(yè)上傳到服務(wù)器的特定共享目錄中,但總是有幾個(gè)“破壞分子”喜歡刪除其他同學(xué)的作業(yè),這時(shí)就要設(shè)置SBIT(Sticky Bit)特殊權(quán)限位了(也可以稱之為特殊權(quán)限位之粘滯位)。SBIT特殊權(quán)限位可確保用戶只能刪除自己的文件,而不能刪除其他用戶的文件。換句話說,當(dāng)對(duì)某個(gè)目錄設(shè)置了SBIT粘滯位權(quán)限后,那么該目錄中的文件就只能被其所有者執(zhí)行刪除操作了。

最初不知道是哪位非資深技術(shù)人員將Sticky Bit直譯成了“粘滯位”,劉遄老師建議將其稱為“保護(hù)位”,這既好記,又能立刻讓人了解它的作用。RHEL 7系統(tǒng)中的/tmp作為一個(gè)共享文件的目錄,默認(rèn)已經(jīng)設(shè)置了SBIT特殊權(quán)限位,因此除非是該目錄的所有者,否則無法刪除這里面的文件。https://www.linuxprobe.com/chapter-05.html

與前面所講的SUID和SGID權(quán)限顯示方法不同,當(dāng)目錄被設(shè)置SBIT特殊權(quán)限位后,文件的其他人權(quán)限部分的x執(zhí)行權(quán)限就會(huì)被替換成t或者T,原本有x執(zhí)行權(quán)限則會(huì)寫成t,原本沒有x執(zhí)行權(quán)限則會(huì)被寫成T。

    [root@linuxprobe tmp]# su - linuxprobe
    Last login: Wed Feb 11 12:41:20 CST 2017 on pts/0
    [linuxprobe@linuxprobe tmp]$ ls -ald /tmp
    drwxrwxrwt. 17 root root 4096 Feb 11 13:03 /tmp
    [linuxprobe@linuxprobe ~]$ cd /tmp
    [linuxprobe@linuxprobe tmp]$ ls -ald
    drwxrwxrwt. 17 root root 4096 Feb 11 13:03 .
    [linuxprobe@linuxprobe tmp]$ echo "Welcome to linuxprobe.com" > test
    [linuxprobe@linuxprobe tmp]$ chmod 777 test
    [linuxprobe@linuxprobe tmp]$ ls -al test 
    -rwxrwxrwx. 1 linuxprobe linuxprobe 10 Feb 11 12:59 test

其實(shí),文件能否被刪除并不取決于自身的權(quán)限,而是看其所在目錄是否有寫入權(quán)限(其原理會(huì)在下個(gè)章節(jié)講到)。為了避免現(xiàn)在很多讀者不放心,所以上面的命令還是賦予了這個(gè)test文件最大的777權(quán)限(rwxrwxrwx)。我們切換到另外一個(gè)普通用戶,然后嘗試刪除這個(gè)其他人創(chuàng)建的文件就會(huì)發(fā)現(xiàn),即便讀、寫、執(zhí)行權(quán)限全開,但是由于SBIT特殊權(quán)限位的緣故,依然無法刪除該文件:

    [root@linuxprobe tmp]# su - blackshield
    Last login: Wed Feb 11 12:41:29 CST 2017 on pts/1
    [blackshield@linuxprobe ~]$ cd /tmp
    [blackshield@linuxprobe tmp]$ rm -f test
    rm: cannot remove ‘test’: Operation not permitted

當(dāng)然,要是也想對(duì)其他目錄來設(shè)置SBIT特殊權(quán)限位,用chmod命令就可以了。對(duì)應(yīng)的參數(shù)o+t代表設(shè)置SBIT粘滯位權(quán)限:

    [blackshield@linuxprobe tmp]$ exit
    Logout
    [root@linuxprobe tmp]# cd ~
    [root@linuxprobe ~]# mkdir linux
    [root@linuxprobe ~]# chmod -R o+t linux/
    [root@linuxprobe ~]# ls -ld linux/
    drwxr-xr-t. 2 root root 6 Feb 11 19:34 linux/
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)