文件默認權限
從Linux之用戶組、文件權限詳解了解到文件與目錄的基本權限管理,文件在創建時如果不指定具體的權限,那么系統會給它分配一個默認的權限,這個默認權限就是umask。
vbird@Ubuntu1604:~$ umask //我們可以使用umask命令來查看默認權限 0002
第1個0是特殊默認權限,可以先不用管。后面002就是我們創建文件/目錄的默認權限。由於普通文件默認沒有可執行權限,即只有r、w權限,所以權限最大為666(-rw-rw-rw-)。目錄需要進入訪問權限,需要有r、w、x權限,所以權限最大為777(drwxrwxrwx)。而umask是該默認值需要減去的權限,此時,umask為002(第1個0先不管),普通文件默認權限=(-rw-rw-rw-)-(--------w-)=664(-rw-rw-r--),目錄默認權限=(drwxrwxrwx)-(--------w-)=775(drwxrwxr-x)。
vbird@Ubuntu1604:~$ touch aa vbird@Ubuntu1604:~$ mkdir bb vbird@Ubuntu1604:~$ ls -l total 20 -rw-rw-r-- 1 vbird vbird 0 9月 9 14:56 aa drwxrwxr-x 2 vbird vbird 4096 9月 9 14:56 bb
剛才使用umask查看到默認權限是0002,linux中除了常見的讀(r)、寫(w)、執行(x)權限以外,還有3個特殊的權限,分別是setuid、setgid和stick bit,就對應着第1個0值。
文件特殊權限:SUID、SGID、SBIT
setuid:SUID,全稱為set UID,在高位起第三位上表現為s。
當我們普通用戶使用passwd進行修改密碼的時候,passwd會去訪問/etc/shadow,但是普通用戶根本沒有讀寫的權限,那怎么辦呢?linux在我們運行passwd修改密碼的時候,會暫時獲取/etc/shadow文件擁有者root的權限,然后對/etc/shadow進行讀寫訪問,訪問完之后釋放文件擁有者的權限。這就是setuid的魅力。簡單來說就是,使用者暫時獲取文件(目錄)擁有者的權限,使用完再釋放。
setgid:SGID和SUID類似,在高起第六位上表現為s。
SGID改變的是執行者的所屬組,可以對可執行文件和目錄設置。通過對目錄設置SGID屬性,可以使得訪問在該目錄下創建的所有文件的所有權,都繼承原目錄的所有者,而非創建者。因為一旦有用戶進入到該目錄下,由於具有SGID權限,進入目錄后的用戶就會變成該目錄的所有者,在該目錄下創建的所有文件,都以該目錄的所有者的身份創建。
利用好這個權限位在很多團隊合作的項目上更加方便管理。比如一個共同維護的數據文件夾,為了方便管理,只允許管理員對里面的數據具有改變和刪除的權利,但是卻有很多用戶需要有在該目錄下添加數據文件的權利,利用SGID可以很好的解決這一點。
stick bit:SBID權限同樣只對目錄有效,在權限位的最低位表現為t。
通過對目錄設置SBID權限,並且該目錄的權限為777,則所有用戶可以在該目錄下都可以創建文件,並且文件所有者是自己。但是在SBID權限的目錄下,只有root和文件的所有者才能刪除該文件,即使文件的屬性為777也不能被其他用戶刪除。這個權限在共享過程中非常實用。共享的文件任何人都有讀寫的權利,但是只有文件的所有者才能刪除該文件。
SUID/SGID/SBIT權限設置
SUID數值為4,SGID數值為2,SBIT數值為1,umask中默認權限中的從左往右第1個值為SUID/SGID/SBIT權限。
文件隱藏權限
除了以上權限外,linux還提供了一套隱藏權限機制。需要使用chattr設置隱藏權限,lsattr查看隱藏權限。
命令功能:
查看文件的隱藏權限
命令格式:
lsattr [ -RVadv ] [ files... ]
命令參數:
-R 遞歸查看目錄下文件
-V 顯示程序的版本
-a 不忽略以“.”開頭的隱藏文件
-v 列出文件的版本號和生成號
命令實例:
見chattr
命令功能:
查看文件的隱藏權限
命令格式:
chattr [ -RVf ] [ -v version ] [ mode ] files...
命令參數:
+-= :分別為 [+ 增加] [- 減少] [= 設定] 屬性的意思
A :當設定了 A 這個屬性時,這個檔案(或目錄)的訪問時間atime (access) 將不可被修改, 可避免例如手提式計算機容易有磁盤 I/O 錯誤的情況發生!
S :這個功能有點類似 sync 的功能!就是會將數據同步寫入磁盤當中!可以有效的避免數據流失!
a :當設定 a 之后,這個檔案將只能增加數據,而不能刪除,只有 root 才能設定這個屬性。
c :這個屬性設定之后,將會自動的將此檔案壓縮,在讀取的時候將會自動解壓縮出來,但是在儲存的時候,將會先進行壓縮之后再儲存(看來對於大檔案似乎蠻有用的!)
d :當 dump (備份)程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)具有 dump 功效!
i :這個 i 可就很厲害了!他可以讓一個檔案不能被刪除、改名、設定連結也無法寫入或新增數據!對於系統安全性有相當大的幫助! (只有root才能設置)
j :當使用 ext3 這個檔案系統格式時,設定 j 屬性將會使檔案在寫入時先記錄在 journal 中! 但是當 filesystem 設定參數為 data=journalled 時,由於已經設定了日志了,所以這個屬性無效!
s :當檔案設定了 s 參數時,他將會被完全的移除出這個硬盤空間。
u :與 s 相反的,當使用 u 來設定檔案時,則數據內容其實還存在磁盤中,可以使用來找回該文件。
-R 遞歸查看目錄下文件
-V 顯示程序的版本
-v 列出文件的版本號和生成號
備注:chattr命令很多設置必須root才能設置
命令實例:
1.新建1個文件aa,然后設置隱藏權限i使之不能被刪除。(只有root才能執行此操作)
root@Ubuntu1604:/home/vbird# touch aa root@Ubuntu1604:/home/vbird# lsattr aa -------------e-- aa root@Ubuntu1604:/home/vbird# chattr +i aa root@Ubuntu1604:/home/vbird# lsattr aa ----i--------e-- aa root@Ubuntu1604:/home/vbird# rm aa rm: cannot remove 'aa': Operation not permitted root@Ubuntu1604:/home/vbird# chattr -i aa root@Ubuntu1604:/home/vbird# rm aa root@Ubuntu1604:/home/vbird# ls aa ls: cannot access 'aa': No such file or directory