关键词
目录文件权限,权限继承,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互独立。 |
重点:权限针对目录下的内容即子文件/子目录,不是这些子文件/子目录的内容。
特殊权限---SUIDSGIDStickyBit
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(setfaclgetfacl)
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