文件權限
從 Linux Wiki
出於安全的考慮,多用戶操作系統需要具備保障個人隱私和系統安全的機制。在Linux中,無論是文檔還是硬件設備都以文件的形式存在,相應地,安全機制也主要表現為對文件訪問權限的控制。[1][2][3]
除了本文所討論的內容之外,SELinux(Security-Enhanced Linux)是另一種著名的安全機制,它是美國國家安全局(NAS)對於強制訪問控制的實現,是一種更為可靠,也明顯更為複雜的安全機制。在Fedora和Red Hat Enterprise Linux上默認安裝了這一機制。
目錄 |
權限的定義
基礎權限
要確定一個用戶對某個文件或目錄是否具有相應的權限,先要明確該用戶與文件或目錄之間的關係。在Linux系統中,定義了如下三種關係:
- 文件所有者(owner)
- 擁有文件的用戶。創建文件時是創建文件的用戶(可用whoami命令查看)。
- 組(group)
- 文件所屬的組。創建文件時用戶的組(可用id命令查看)。
- 其他人(other)
- 既不是文件所有者,也不是文件所屬的組的成員的其他用戶。
根據用戶對文件或目錄操作種類的不同,又定義了三種操作權限,並為每種權限賦予一個簡寫形式和數值(數值的用途後面討論):
權限 | 簡 | 值 | 對普通文件的作用 | 對文件夾的作用[4] |
---|---|---|---|---|
讀取 | r | 4 | 查看文件內容 | 列出目錄中的文件(ls) |
寫入 | w | 2 | 修改文件內容 | 在目錄中刪除、添加或重命名文件(夾) |
執行 | x | 1 | 文件可以作為程序執行 | 訪問子目錄及文件及shell中cd到此目錄 |
上面的三種關係與三種操作權限的組合,構成了一個含有9個二進制位的權限標識。
特殊權限
還有三種與用戶身份無關的三個文件權限屬性。即SUID、SGID和Sticky。
- SUID(Set User ID, 4)
- 該屬性只對有執行權限的文件有效,對目錄無效。執行具有SUID權限的程序時,引發的進程的所有者是程序文件的所有者,而不是啟動程序的用戶(除非二者是同一個人)。比如,如果一個程序的所有者是root且具有SUID屬性,一個普通用戶執行此程序時,如同root執行此程序一樣。[5](請注意該屬性對Shell腳本程序無效。)該屬性為一些特殊程序(如lpr)的啟動帶來了方便。但有時也帶來了安全隱患:比如一個具有SUID屬性的程序如果在執行時運行了一個shell,那麼用戶可以籍此得到系統的最高權限。SUID可用s表示。
- SGID(Set Group ID, 2)
- 對於可執行文件,SGID與SUID類似,引發的進程的所有組是程序文件所屬的組。對於目錄,SGID屬性會使目錄中新建文件的所屬組與該目錄相同。SGID也可以用s表示。
- Sticky, 1
- 僅對目錄有效。帶sticky屬性的目錄下的文件或目錄可以被其擁有者刪除或改名。常利用sticky屬性創建這樣的目錄:組用戶可以在此目錄中創建新文件、修改文件內容,但只有文件所有者才能對自己的文件進行刪除或改名。如系統中的/tmp文件夾。在屬性字符串中,通常用t表示。
最初sticky屬性只可執行文件有效。正如其字面意思,它讓具有sticky屬性的可執行文件在執行結束後將程序代碼仍滯留於內存中,以加快需要反覆執行的大程序的裝載速度。由於虛擬內存技術的引入,該功能已經沒有意義。
權限的表示
符號表示
一個文件的權限可以用字符串直觀的表示,使用ls -l命令可以看到表示權限的字符串。
下面來看幾個例子:
-rw-r--r-- 1 gnixnehc gnixnehc 131 08-12 13:22 normal_text -rwxr-xr-x 1 gnixnehc gnixnehc 6809 08-12 13:22 normal_exe drwxr-xr-x 2 gnixnehc gnixnehc 4096 07-03 01:13 normal_dir -rwsr-sr-x 1 gnixnehc gnixnehc 6809 08-12 13:22 suid_exe drwxrwxrwt 12 root root 16384 08-12 21:07 tmp
藍色的部分就是權限字符串,權限表示三個為一組,依次是所有者權限、組權限、其他人權限。每組的順序均為rwx,如果有相應權限,則表示成相應字母,如果不具有相應權限,則用-表示。
上面的例子中,第一行是一個普通文本文件,第二行是個普通的可執行程序,第三行是個普通的文件夾。第四行是帶SUID、SGID的程序,最後一行則是/tmp的權限。
數值表示
為了簡化表述,也可使用八進制數來表示權限。即用一個四位八進制數來表示,其中最高位表示特殊權限,隨後的三位依次是所有者權限、組權限和其他人權限。每一個八進制位的權限數值是文件具有的相應權限所對應的數值之後,如:
0755=rwxr-xr-x
而
rw---x-w-=0(4+2)(1)(2)=0612
修改權限
文件所有者或超級用戶可以修改一個文件或目錄的權限。修改權限可以使用chmod命令,也可以使用桌面環境的文件管理程序。
如,chmod 700 foo 命令會將 foo 的權限更改為 700(見#數值表示)。
除了使用八進制數值權限,還可以用 [ugoa][[+-=][rwxst] 格式設置相應權限。[6]第一個字符是u、g、 o 或 a 中的一個(分別表示用戶、組、其他人和所有人)。還可以選擇添加(+)、刪除(-)或設置(=)各種不同權限。如
chmod u+x foo
可設置 foo 的執行位,並保持其他位不變。
chmod g-rw something
則可以移除組的讀和寫權限。
另一種使用 chmod 的方法是使用 --reference 參數:
chmod --reference file1 file2
可以讓 file2 的權限與 file1 一樣。
要更改文件的所有者,可使用 chown 命令。如
chown sean foo
命令可將 foo 的所有者更改為 sean。只有根用戶可以修改文件的所有者。
chgrp 命令可以更改文件的組。普通用戶必須屬於新的組。
參考資料
- ↑ Linux文件和目錄訪問權限設置
- ↑ Linux文件權限隱藏的細節深入分析
- ↑ IBM Developer Networks: 學習 Linux,101: 管理文件權限和所有權
- ↑ Linux文件夾權限 學習筆記
- ↑ Set-User-ID Permission for Executable Files
- ↑ IBM Developer Networks: 學習 Linux,302(混合環境): Linux 文件系統和共享/服務權限