關鍵詞
目錄文件權限,權限繼承,ACL,chmod, chown, umask, setfacl, getfacl
如上圖,在Linux/Unix的文件系統的基礎rwx權限,是文件/目錄對應"擁有者"、"組成員"、"其它成員"的權限設置位。
如上圖,是對"擁有者"設置了SUID。
如上圖,是對"組成員"設置了SGID。
如上圖,是對"其它成員"設置了StickyBit。
目錄/文件的權限基礎---rwx
文件的rwx
文件是實際含有數據的地方,包括一般文本文件、數據庫內容文件、二進制可執行文件(binary program)等等。 因此,權限對於文件來說,他的意義是這樣的:
- r (read):可讀取此一文件的實際內容,如讀取文本文件的文字內容等;
- w (write):可以編輯、新增或者是修改該文件的內容(但不含刪除該文件);
- x (execute):該文件具有可以被系統執行的權限。
那個可讀(r)代表讀取文件內容是還好了解,那么可執行(x)呢?這里你就必須要小心啦! 因為在Windows底下一個文件是否具有執行的能力是藉由『 擴展名 』來判斷的, 例如:.exe, .bat, .com 等等,但是在Linux底下,我們的文件是否能被執行,則是藉由是否具有『x』這個權限來決定的!跟檔名是沒有絕對的關系的!
至於最后一個w這個權限呢?當你對一個文件具有w權限時,你可以具有寫入/編輯/新增/修改文件的內容的權限, 但並不具備有刪除該文件本身的權限!對於文件的rwx來說, 主要都是針對『文件的內容』而言,與文件檔名的存在與否沒有關系喔!因為文件記錄的是實際的數據嘛!
r |
w |
x |
|||
1 |
0 |
0 |
可讀取文件內容。 |
||
0 |
1 |
0 |
可修改文件內容。在無r權下還是可以寫入內容,舊文件備份到另文件。 |
||
0 |
0 |
1 |
可以命令、腳本執行。 |
||
1/0 |
1/0 |
1/0 |
三個權限互相獨立,不為其它的前提條件。 |
重點:權限只針對文件的內容。
目錄的rwx
文件是存放實際數據的所在,那么目錄主要是儲存啥玩意啊?目錄主要的內容在記錄文件名列表,文件名與目錄有強烈的關連啦! 所以如果是針對目錄時,那個 r, w, x 對目錄是什么意義呢?
- r (read contents in directory):
表示具有讀取目錄結構列表的權限,所以當你具有讀取(r)一個目錄的權限時,表示你可以查詢該目錄下的文件名數據。 所以你就可以利用 ls 這個指令將該目錄的內容列表顯示出來! -
w (modify contents of directory):
這個可寫入的權限對目錄來說,是很了不起的! 因為他表示你具有異動該目錄結構列表的權限,也就是底下這些權限:- 建立新的文件與目錄;
- 刪除已經存在的文件與目錄(不論該文件的權限為何!)
- 將已存在的文件或目錄進行更名;
- 搬移該目錄內的文件、目錄位置。
總之,目錄的w權限就與該目錄底下的文件名異動有關就對了啦!
- x (access directory):
咦!目錄的執行權限有啥用途啊?目錄只是記錄文件名而已,總不能拿來執行吧?沒錯!目錄不可以被執行,目錄的x代表的是用戶能否進入該目錄成為工作目錄的用途! 所謂的工作目錄(work directory)就是你目前所在的目錄啦!舉例來說,當你登入Linux時, 你所在的家目錄就是你當下的工作目錄。而變換目錄的指令是『cd』(change directory)啰!
r |
w |
x |
|||
1 |
0 |
0 |
命令ls可以查詢目錄內文件/目錄名字,但不能查詢出大小、權限信息。 |
||
0 |
1 |
0 |
不能在目錄內創建、刪除目錄/文件 |
||
0 |
0 |
1 |
只可以切換當前目錄為此目錄(命令cd 成功執行)。 |
||
1/0 |
1/0 |
1 |
X權是r權、w權的前提條件,r與w互獨立。 |
重點:權限針對目錄下的內容即子文件/子目錄,不是這些子文件/子目錄的內容。
特殊權限---SUID\SGID\StickyBit
Set UID
當 s 這個標志出現在文件擁有者的 x 權限上時,例如剛剛提到的 /usr/bin/passwd 這個文件的權限狀態:『-rwsr-xr-x』,此時就被稱為 Set UID,簡稱為 SUID 的特殊權限。那么SUID的權限對於一個文件的特殊功能是什么呢?基本上SUID有這樣的限制與功能:
-
SUID 權限僅對二進位程序(binary program)有效;
-
運行者對於該程序需要具有 x 的可運行權限;
-
本權限僅在運行該程序的過程中有效 (run-time);
-
運行者將具有該程序擁有者 (owner) 的權限。
講這么硬的東西你可能對於 SUID 還是沒有概念,沒關系,我們舉個例子來說明好了。我們的 Linux 系統中,所有帳號的密碼都記錄在 /etc/shadow 這個文件里面,這個文件的權限為:『-r-------- 1 root root』,意思是這個文件僅有root可讀且僅有root可以強制寫入而已。既然這個文件僅有 root 可以修改,那么鳥哥的 vbird 這個一般帳號使用者能否自行修改自己的密碼呢?你可以使用你自己的帳號輸入『passwd』這個命令來看看,嘿嘿!一般使用者當然可以修改自己的密碼了!
SUID是一種特殊類型的給定的一個文件的文件權限的。通常在Linux / Unix中,當程序運行時,它會從登錄用戶那里繼承訪問權限。SUID定義為向用戶授予臨時權限,使其具有文件所有者(而不是運行它的用戶)的權限來運行程序/文件。簡而言之,用戶在執行文件/程序/命令時將獲得文件所有者的權限以及所有者UID和GID。
在哪里使用SUID?
1)需要root登錄才能執行某些命令/程序/腳本。
2)您不想提供特定用戶的憑據,但希望以所有者身份運行某些程序的地方。
3)如果您不想使用SUDO命令,但是想要授予文件/腳本等的執行權限。
Set GID
與 SUID 不同的是,SGID 可以針對文件或目錄來配置!如果是對文件來說, SGID 有如下的功能:
-
SGID 對二進位程序有用;
-
程序運行者對於該程序來說,需具備 x 的權限;
-
運行者在運行的過程中將會獲得該程序群組的支持!
除了 binary program 之外,事實上 SGID 也能夠用在目錄上,這也是非常常見的一種用途!當一個目錄配置了 SGID 的權限后,他將具有如下的功能:
-
使用者若對於此目錄具有 r 與 x 的權限時,該使用者能夠進入此目錄;
-
使用者在此目錄下的有效群組(effective group)將會變成該目錄的群組;
-
用途:若使用者在此目錄下具有 w 的權限(可以新建文件),則使用者所創建的新文件,該新文件的群組與此目錄的群組相同。
SGID是一種特殊類型的給定的一個文件/文件夾的文件的權限。通常在Linux / Unix中,當程序運行時,它會從登錄用戶那里繼承訪問權限。SGID的定義是授予用戶臨時權限以運行具有文件組權限的程序/文件,該權限成為該組的成員以執行文件。簡而言之,用戶在執行文件夾/文件/程序/命令時將獲得文件組的權限。
SGID與SUID相似。兩者之間的區別在於,執行文件時,SUID假定為文件權限的所有者,而SGID假定為組的權限,而不是登錄用戶的繼承權限。
Sticky Bit
這個 Sticky Bit, SBIT 目前只針對目錄有效,對於文件已經沒有效果了。 SBIT 對於目錄的作用是:
-
當使用者對於此目錄具有 w, x 權限,亦即具有寫入的權限時;
-
當使用者在該目錄下創建文件或目錄時,僅有自己與 root 才有權力刪除該文件
SUID
SGID
StickyBit
基礎權限
x
x
w
對象
二進制文件
二進制文件、目錄
目錄
精細權限設置及權限繼承---ACL(setfacl\getfacl)
ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統的 owner,group,others 的 read,write,execute 權限之外的細部權限配置。ACL 可以針對單一使用者,單一文件或目錄來進行 r,w,x 的權限規范,對於需要特殊權限的使用狀況非常有幫助。
那 ACL 主要可以針對哪些方面來控制權限呢?他主要可以針對幾個項目:
- 使用者 (user):可以針對使用者來配置權限;
- 群組 (group):針對群組為對象來配置其權限;
- 默認屬性 (mask):還可以針對在該目錄下在創建新文件/目錄時,規范新數據的默認權限
如何配置與觀察 ACL 呢?很簡單,利用這兩個命令就可以了:
-
getfacl:取得某個文件/目錄的 ACL 配置項目;
-
setfacl:配置某個目錄/文件的 ACL 規范。
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
Options
-b, --remove-all |
Remove all extended ACL entries. The base ACL entries of the owner, group and others are retained. |
-k, --remove-default |
Remove the Default ACL. If no Default ACL exists, no warnings are issued. |
-n, --no-mask |
Do not recalculate the effective rights mask. The default behavior of setfacl is to recalculate the ACL mask entry, unless a mask entry was explicitly given. The mask entry is set to the union of all permissions of the owning group, and all named user and group entries. (These are exactly the entries affected by the mask entry). |
--mask |
Do recalculate the effective rights mask, even if an ACL mask entry was explicitly given. (See the -n option.) |
-d, --default |
All operations apply to the Default ACL. Regular ACL entries in the input set are promoted to Default ACL entries. Default ACL entries in the input set are discarded. (A warning is issued if that happens). |
--restore=file |
Restore a permission backup created by "getfacl -R" or similar. All permissions of a complete directory subtree are restored using this mechanism. If the input contains owner comments or group comments, setfacl attempts to restore the owner and owning group. If the input contains flags comments (which define the setuid, setgid, and sticky bits), setfacl sets those three bits accordingly; otherwise, it clears them. This option cannot be mixed with other options except "--test". |
--test |
Test mode. Instead of changing the ACLs of any files, the resulting ACLs are listed. |
-R, --recursive |
Apply operations to all files and directories recursively. This option cannot be mixed with "--restore". |
-L, --logical |
"Logical walk": follow symbolic links to directories. The default behavior is to follow symbolic link arguments, and skip symbolic links encountered in subdirectories. Only effective in combination with -R. This option cannot be mixed with "--restore". |
-P, --physical |
"Physical walk": do not follow symbolic links to directories. This also skips symbolic link arguments. Only effective in combination with -R. This option cannot be mixed with "--restore". |
-v, --version |
Print the version of setfacl, and exit. |
-h, --help |
Print a help message explaining the command line options. |
-- |
A double-dash marks the end of command line options; all remaining parameters are interpreted as file names. This option is especially useful for file names that start with a dash. |
- |
If the file name parameter is a single dash, setfacl reads a list of files from standard input. |
ACL Entries
setfacl recognizes the following ACL entry formats (spaces in the following formats are optional, but are included for legibility):
[d[efault]:] [u[ser]:]uid [:perms] |
Permissions of the user with user ID uid, or permissions of the file's owner if uid is empty. |
[d[efault]:] g[roup]:gid [:perms] |
Permissions of the group with group ID gid, or permissions of the owning group if gid is empty. |
[d[efault]:] m[ask][:] [:perms] |
Effective rights mask. |
[d[efault]:] o[ther][:] [:perms] |
Permissions of others. |
權限繼承
[d[efault]:] m[ask][:] [:perms]
參考資料:
- LINUX CHMOD COMMAND EXAMPLES TO UNDERSTAND IT
- WHAT IS SUID AND HOW TO SET SUID IN LINUX/UNIX
- WHAT IS SGID AND HOW TO SET SGID IN LINUX
- WHAT IS A STICKY BIT AND HOW TO SET IT IN LINUX
- acl(5) - Linux man page
- setfacl(1) - Linux man page
- Linux setfacl command
- Access Control Lists
- https://man.archlinux.org/man/chmod.1p
- https://wiki.archlinux.org/title/Umask
- http://cn.linux.vbird.org/linux_basic/0410accountmanager_3.php
- https://pubs.opengroup.org/onlinepubs/9699919799/utilities/chmod.html#tag_20_17_13