10. 檔案許可權與歸屬
1.Linux的檔案型別
在 Linux 系統中,每個檔案都有所屬的所有者和所有組,並且規定了檔案的所有者、所有組以及其他人對檔案所擁有的可讀(r)、可寫(w)、可執行(x)等許可權。
對於普通檔案:“可讀”表示能夠讀取檔案的實際內容;“可寫”表示能夠編輯、新增、修改、刪除檔案的實際內容;“可執行”則表示能夠執行一個指令碼程式。
對於目錄檔案:“可讀”表示能夠讀取目錄內的檔案列表;“可寫”表示能夠在目錄內新增、刪除、重新命名檔案;而“可執行”則表示能夠進入該目錄。
如,若某個檔案的許可權為7 則代表可讀、可寫、可執行(4+2+1);若許可權為6 則代表可讀、可寫(4+2)
包含了檔案的型別、訪問許可權、所有者(屬主)、所屬組(屬組)、佔用的磁碟大小、修改時間和檔名稱等資訊。
2.檔案的特殊許可權
1)SUID
SUID是一種對二進位制程式進行設定的特殊許可權,可以讓二進位制程式的執行者臨時擁有屬主的許可權(僅對擁有執行許可權的二進位制程式有效)。
例如,所有使用者都可以執行passwd 命令來修改自己的使用者密碼,而使用者密碼儲存在/etc/shadow 檔案中。仔細檢視這個檔案就會發現它的預設許可權是000,也就是說除了root 管理員以外,所有使用者都沒有檢視或編輯該檔案的許可權。但是,在使用passwd 命令時如果加上SUID 特殊許可權位,就可讓普通使用者臨時獲得程式所有者的身份,把變更的密碼資訊寫入到shadow 檔案中。
檢視 passwd 命令屬性時發現所有者的許可權由rwx 變成了rws,其中x 改變成s 就意味著該檔案被賦予了SUID 許可權。如果原先許可權位上沒有x 執行許可權,那麼被賦予特殊許可權後將變成大寫的S。
2)SGID
SGID 主要實現如下兩種功能:
1)讓執行者臨時擁有屬組的許可權(對擁有執行許可權的二進位制程式進行設定);
2)在某個目錄中建立的檔案自動繼承該目錄的使用者組(只可以對目錄進行設定)。
舉例:
1)在早期的Linux 系統中,/dev/kmem 是一個字元裝置檔案,用於儲存核心程式要訪問的資料,許可權為:
cr--r----- 1 root system 2, 1 Feb 11 2017 kmem
檢視ps 命令檔案的屬性資訊:
-r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps
由於ps 命令被增加了SGID 特殊許可權位,所以當用戶執行該命令時,也就臨時獲取到了system 使用者組的許可權,從而可以順利地讀取裝置檔案了。
2)每個檔案都有其歸屬的所有者和所屬組,當建立或傳送一個檔案後,這個檔案就會自動歸屬於執行這個操作的使用者(即該使用者是檔案的所有者)。如果現在需要在一個部門內設定共享目錄,讓部門內的所有人員都能夠讀取目錄中的內容,那麼就可以建立部門共享目錄後,在該目錄上設定SGID 特殊許可權位。這樣,部門內的任何人員在裡面建立的任何檔案都會歸屬於該目錄的所屬組,而不再是自己的基本使用者組。此時,我們用到的就是SGID的第二個功能,即在某個目錄中建立的檔案自動繼承該目錄的使用者組(只可以對目錄進行設定)。
[root@Centos /]# cd tmp/ [root@Centos tmp]# mkdir testdir [root@Centos tmp]# ls -ald testdir/ drwxr-xr-x. 2 root root 6 Aug 13 18:01 testdir/ [root@Centos tmp]# chmod -Rf 777 testdir/ [root@Centos tmp]# chmod -Rf g+s testdir/ [root@Centos tmp]# ls -ald testdir/ drwxrwsrwx. 2 root root 6 Aug 13 18:01 testdir/
在使用上述命令設定好目錄的777 許可權(確保普通使用者可以向其中寫入檔案),併為該目錄設定了SGID 特殊許可權位後,就可以切換至一個普通使用者,然後嘗試在該目錄中建立檔案,並檢視新建立的檔案是否會繼承新建立的檔案所在的目錄的所屬組名稱:
[root@Centos tmp]# su - centos Last login: Thu Aug 13 17:58:46 CST 2020 on pts/2 [centos@Centos ~]$ cd /tmp/testdir/ [centos@Centos testdir]$ echo "centos" > test [centos@Centos testdir]$ ls -al test -rw-rw-r--. 1 centos root 7 Aug 13 18:06 test
3)SBIT 特殊許可權位可確保使用者只能刪除自己的檔案,而不能刪除其他使用者的檔案。換句話說,當對某個目錄設定了SBIT 粘滯位許可權後,那麼該目錄中的檔案就只能被其所有者執行刪除操作了。
Centos 7 系統中的/tmp 作為一個共享檔案的目錄,預設已經設定了SBIT 特殊許可權位。
當目錄被設定SBIT 特殊許可權位後,檔案的其他人許可權部分的x 執行許可權就會被替換成t 或者T,原本有x 執行許可權則會寫成t,原本沒有x 執行許可權則會被寫成T。
[root@Centos tmp]# su - centos Last login: Thu Aug 13 18:29:15 CST 2020 on pts/2 [centos@Centos ~]$ ls -ald /tmp drwxrwxrwt. 28 root root 4096 Aug 13 18:29 /tmp [centos@Centos ~]$ cd /tmp [centos@Centos tmp]$ ls -ald drwxrwxrwt. 28 root root 4096 Aug 13 18:29 . [centos@Centos tmp]$ echo "Hello world" > test [centos@Centos tmp]$ chmod 777 test [centos@Centos tmp]$ ll test -rwxrwxrwx. 1 centos centos 12 Aug 13 18:30 test
其實,檔案能否被刪除並不取決於自身的許可權,而是看其所在目錄是否有寫入許可權。
假如切換到另外一個普通使用者,然後嘗試刪除這個其他人建立的檔案就會發現,即便讀、寫、執行許可權全開,但是由於SBIT 特殊許可權位的緣故,依然無法刪除該檔案:
[root@Centos home]# su - xinghen1216 [xinghen1216@Centos ~]$ cd /tmp [xinghen1216@Centos tmp]$ rm -rf test rm: cannot remove ‘test’: Operation not permitted
對其他目錄來設定SBIT 特殊許可權位,用chmod 命令就可以了。對應的引數o+t 代表設定SBIT 粘滯位許可權:
[root@Centos ~]# mkdir centos [root@Centos ~]# chmod -R o+t centos/ [root@Centos ~]# ls -ld centos drwxr-xr-t. 2 root root 6 Aug 13 18:50 centos
3.chmod :設定檔案或目錄的許可權,格式為“chmod [引數] 許可權檔案或目錄名稱”
舉例
[root@Centos ~]# touch test01.txt
[root@Centos ~]# ll test01.txt
-rw-r--r--. 1 root root 0 Aug 13 18:19 test01.txt
[root@Centos ~]# chmod 760 test01.txt
[root@Centos ~]# ll test01.txt
-rwxrw----. 1 root root 0 Aug 13 18:19 test01.txt
chown:設定檔案或目錄的所有者和所屬組,格式為“chown [引數] 所有者:所屬組檔案或目錄名稱
[root@Centos ~]# ll test01.txt
-rwxrw----. 1 root root 0 Aug 13 18:19 test01.txt
[root@Centos ~]# chown root:bin test01.txt
[root@Centos ~]# ll test01.txt
-rwxrw----. 1 root bin 0 Aug 13 18:19 test01.txt
chmod 和chown 命令是用於修改檔案屬性和許可權的最常用命令,它們還有一個特別的共性,就是針對目錄進行操作時需要加上大寫引數-R 來表示遞迴操作,即對目錄內所有的檔案進行整體操作。