Linux 基础命令(四)—— 文件的权限和访问控制列表(ACL)
Published On July 24, 2017
文件的权限以及访问控制列表贯穿在整个的Linux使用过程中。我们知道,在Linux 中一切皆文件,因而文件的权限,就自然而然地成为了Linux使用过程中需要频繁接触到的知识内容。而文件权限这一部分地内容,又非常地复杂,因为我们将在这篇文章当中详细地介绍文件的权限,加深自己的理解,同时留作备忘。
1.文件权限
主要介绍文件的权限,以及每种权限代表着哪些含义。
2.修改文件权限
介绍如何修改文件的权限
3.Linux 系统上特殊文件权限
介绍Linux 系统上的文件的特殊权限,SUID,SGID,Sticky
4.访问控制列表
介绍了如何使用ACL(访问控制列表)来设置复杂权限。
关于文件权限可参考如下示意图,此图中列举出了文件的元数据,我们接下来将针对文件的权限进行详细的描述。
- 文件的权限主要针对三类对象进行定义:
Owner: 属主 u
Group: 属组 g
Other: 其他 o
- 每个文件针对每一类的访问者都设定了三种权限
r: Readable 读
w: Writeable 写
x: eXcutable 执行
文件
r: 可以使用文本查看类工具获取其内容。 但是对root用户不起作用。如果没有权限,file 文件将不可用,因为file文件需要读取文件头来获取文件信息。
w: 可以修改其内容,但是对root用户不起作用。
x: 可以将此文件提请内核启动一个进程。即二进制文件,可执行。对root用户有效。目录
r: 可以使用ls命令查看目录内的文件列表。
w: 可以在此目录中创建文件,也可以删除此目录中的文件。
x: 可以使用ls -l 查看此目录中文件列表,可以cd 进入此目录。
X: 只给目录x权限,目录内文件,如果本身就有x权限,则给ugo加上x权限,如果本身不具备x权限,则不给文件x权限。
由上,我们可以知道,一个用户能否对某一个文件进行删除,取决于该用户在该文件所在的目录上的权限,而不取决于在该文件上的权限。
如果用户对目录有写权限,用户就能够删除该目录下的文件。
关于文件权限的所有操作,我们将参考如下表格,这张表清晰的列举了文件权限相对应的操作。
表文件权限
就目前而言,一个用户对于文件一共有三种身份,分别是属主,属组,和其他。我们可以通过最基本的方式来给一个用户提供权限,就是修改文件的属主,属组。
- 修改文件的属主:chown 选项 属主:属组 文件
修改属主: chown USERNAME FILE
修改属组: chown :GROUPNAME FILE
修改属主和属组: chown USERNAME:GROUPNAME FILE
命令中的冒号可以使用 . 来替代
或者直接引用某个文件的属性来替换自己的元数据 chown [OPTION]… –reference=RFILE FILE…
-R : 递归修改目录内的文件。
- 实例
//通过ll命令查看测试环境
drwxr-xr-x. 2 root root 6 Jul 25 09:17 dir
-rw-r--r--. 1 root root 0 Jul 25 09:17 f1
-rw-r--r--. 1 root root 0 Jul 25 09:17 f2
-rw-r--r--. 1 root root 0 Jul 25 09:20 f3
//修改f1属主
chown mage f1
-rw-r--r--. 1 mage root 0 Jul 25 09:17 f1
//修改f2属组
chown :mage f2
-rw-r--r--. 1 root mage 0 Jul 25 09:17 f2
//同时修改属主 属组
chown tom:mage f3
-rw-r--r--. 1 tom mage 0 Jul 25 09:20 f3
//直接应用某个文件的属组属主来改变目标文件的属主属主
chown --reference=f3 f1
-rw-r--r--. 1 tom mage 0 Jul 25 09:17 f1
//ll dir/
-rw-r--r--. 1 root root 0 Jul 25 09:35 f4
-rw-r--r--. 1 root root 0 Jul 25 09:35 f5
//递归修改目录内文件的属主和属组
chown -R mage:tom dir
drwxr-xr-x. 2 mage tom 26 Jul 25 09:35 dir
-rw-r--r--. 1 mage tom 0 Jul 25 09:35 f4
-rw-r--r--. 1 mage tom 0 Jul 25 09:35 f5
- 修改文件的属组:chgrp 选项 属组 文件
修改属组: chgrp GROUPNAME FILE
命令中的冒号可以使用 . 来替代
或者直接引用某个文件的属性来替换自己的元数据 chgrp [OPTION]… –reference=RFILE FILE…
-R : 递归修改目录内的文件。
具体实例可以参考修改文件属主的相关案例。
chmod 修改文件权限
使用方法为: chmod u+wr,g-r,o=rw file
chmod [OPTION]… –reference=RFILE FILE… 参考RFILE文件的权限,将FILE的修改为同RFILE
也可以使用 -R 递归选项
//ll 命令列出实验环境
drwxr-xr--. 2 root root 26 Jul 25 10:04 dir
-rw-r--r--. 1 root root 0 Jul 25 10:03 f1
-rw-r--r--. 1 root root 0 Jul 25 10:03 f2
-rw-r--r--. 1 root root 0 Jul 25 10:04 f3
-rw-r--r--. 1 root root 0 Jul 25 10:08 f4
//ll dir/ 列出实验环境
-rwxr--r--. 1 root root 0 Jul 25 10:04 f5
-rw-r--r--. 1 root root 0 Jul 25 10:04 f6
//实验一: 设置f1 属组权限 为 wx
chmod g=wx f1
//实验二:设置 f2 其他用户权限为 rwx
chmod o+wx f2
//实验三: 设置f3 所有用户的权限为rw
chmod a=rw f3
//实验四: 以f3文件为参考设置f4文件权限与f3一致
chmod --referenec=f3 f4
//实验结果
-rw--wxr--. 1 root root 0 Jul 25 10:03 f1
-rw-r--rwx. 1 root root 0 Jul 25 10:03 f2
-rw-rw-rw-. 1 root root 0 Jul 25 10:04 f3
-rw-rw-rw-. 1 root root 0 Jul 25 10:08 f4
//实验五:递归修改dir路径权限,为o=wX
chmod -R o=wX dir
ll dir/
-rwxr---wx. 1 root root 0 Jul 25 10:04 f5
-rw-r---w-. 1 root root 0 Jul 25 10:04 f6
从实验五可以看出一点,就是X 权限只给目录x权限,目录内文件,如果本身就有x权限,则给ugo加上x权限,如果本身不具备x权限,则不给文件x权限。
在表示权限修改的方法上还可以使用数字法来表示文件的权限。可以参考表文件权限操作。
总的来说,如果一个属主,只具备r权限,那么该属主的权限位使用二进制表示为100.换算成十进制就是4 .同理如果同时具备rw权限,那么使用二进制可以表示为110.换算成十进制就是6.依次类推,我们知道可以使用数字4表示r,2表示w,1表示x,如果全部权限都具备的话,就是7。
下面我们将使用数字法重新实现模式法中的实验。
//ll 命令列出实验环境
drwxr-xr--. 2 root root 26 Jul 25 10:04 dir
-rw-r--r--. 1 root root 0 Jul 25 10:03 f1
-rw-r--r--. 1 root root 0 Jul 25 10:03 f2
-rw-r--r--. 1 root root 0 Jul 25 10:04 f3
-rw-r--r--. 1 root root 0 Jul 25 10:08 f4
//ll dir/ 列出实验环境
-rwxr--r--. 1 root root 0 Jul 25 10:04 f5
-rw-r--r--. 1 root root 0 Jul 25 10:04 f6
//实验一: 设置f1 属组权限 为 wx
chmod 634 f1
//实验二:设置 f2 其他用户权限为 rwx
chmod 647 f2
//实验三: 设置f3 所有用户的权限为rw
chmod 666 f3
//实验四: 以f3文件为参考设置f4文件权限与f3一致
chmod --referenec=f3 f4
//实验结果
-rw--wxr--. 1 root root 0 Jul 25 10:03 f1
-rw-r--rwx. 1 root root 0 Jul 25 10:03 f2
-rw-rw-rw-. 1 root root 0 Jul 25 10:04 f3
-rw-rw-rw-. 1 root root 0 Jul 25 10:08 f4
通过数字法,我们可以发现,如果要设置单个权限的话,模式法更方便,可是如果要设置所有权限的话,使用数字法,会更加的方便快捷。
新建目录和文件的默认权限是由系统中umask值来决定的。
新建FILE权限:666-umask (对位相减) 由数字法赋权限的过程中,我们能够发现,凡是奇数权限,总是包含执行权限的。而一个文件如果默认就包含执行权限其实是非常危险的。因此如果所得结果中某位存在执行(奇数)权限,则将其权限加1.
新建DIR权限:777-umask
非特权用户umask 是002
root的umask是022 设定umask: umask # ,比如 umask 022
umask -S 模式方式显示
umask -p 输出可被调用
全局设置: /etc/bashrc 用户设置 ~/.bashrc
真正作用就是:将umask指定的权限从文件或目录的最大权限中减去。
假设umask 值为135
文件默认最大权限 110 110 110 666
减去umask 指定权限 001 011 101 135
权限对位相减 110 100 010 642
文件默认最大权限 666
减去umask 指定权限 135
权限对位相减 642
也可以直接使用数字对位相减,得到的奇数+1;
为了便于理解,这里再重复一下,就是说,文件默认最大权限(666) 中,如果存在umask中指定的要删除的权限,就将该权限删掉,如果不存在,那就不用变化就好了。
普通权限在一般情况下应用是没有问题。可是在一些特殊场景下,仅仅设置普通权限,并不能满足实际生产需要。
如果一个文件具有SUID,SGID,Sticky权限,那么相应u,g,o 的x权限位会被替换成s权限。
SUID,SGID,权限是用来提升权限的。权限是累加的。也就是说,用户本身的权限,加上SUID,SGID的权限。
我们先来看一个实例
ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
我们能够看到在,passwd 属主的权限为: rws
这里的s 就是特殊权限SUID。
它表现为,当任何用户在使用passwd命令时,它的身份将临时切换为root用户,并具有root用户的权限,而不用考虑该用户对passwd的权限。也可以理解为,某二进制文件如果具有SUID权限,则任何使用该二进制文件的用户,其权限将临时集成该二进制文件属主的权限。
SUID特殊权限使用前提:进程有属主和属组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件“其它”权限
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属主
SUID只对二进制可执行程序有效
SUID设置在目录上无意义
权限设定:
chmod u+s FILE…
chmod u-s FILE…
//将 /usr/bin/passwd s权限去掉
chmod u-s /usr/bin/passwd
-rwxr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
//此时,如果切换普通用户,将不具备写权限。 也就修改不了自己的密码
Changing password for user mage.
Changing password for mage.
(current) UNIX password:
passwd: Authentication token manipulation error
//将权限恢复 切换回root用户
chmod 4755 /usr/bin/passwd
SUID是一种特殊权限,用s 表示。如果一个二进制文件具有SUID权限的话,其属主x权限将被s替代。而且在使用数字法进行权限修改的时候,其数字位单独用4表示。
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属组
权限设定:chmod g+s FILE… chmod g-s FILE…
默认情况下,用户创建文件时,其属组为此用户所属的主组
一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
通常用于创建一个协作目录 ,
权限设定:chmod g+s DIR… chmod g-s DIR…
通过以上描述我们可以发现,如果我们给一个目录设置了SGID权限,然后有多个用户在该目录下创建了不同的文件,而这些文件的属组都是该目录的属组。此时问题出现了,在该目录下的不同用户可以相互删除对方的文件。那么此时,我们就需要使用另外一个特殊权限,来解决这个问题。
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
权限设定:chmod o+t DIR… chmod o-t DIR…
我们首先来看一组实例
//实验环境中创建两个文件,注意,f1没有x权限,f2有x权限
-rw-r--r--. 1 root root 0 Jul 25 14:30 f1
-rwxr--r--. 1 root root 0 Jul 25 14:31 f2
//下面分别给两个文件加上SUID权限。
chmod u+s f1
chmod u+s f2
//执行ll 命令查看两个文件的权限变化
-rwSr--r--. 1 root root 0 Jul 25 14:30 f1
-rwsr--r--. 1 root root 0 Jul 25 14:31 f2
从上面的实例我们可以看出
SUID: user,占据属主的执行权限位
s: 属主拥有x权限
S:属主没有x权限
下面我们来看另外一组实例
//实验环境中创建两个目录文件,注意属组的权限区别
drwxr-xr-x. 2 root root 6 Jul 25 14:36 dir1
drwxr--r-x. 2 root root 6 Jul 25 14:36 dir2
//下面分别给两个目录加上SGID权限
chmod g+s dir1
chmod g+s dir2
//执行 ll 命令观察两个目录文件的权限变化
drwxr-sr-x. 2 root root 6 Jul 25 14:36 dir1
drwxr-Sr-x. 2 root root 6 Jul 25 14:36 dir2
从上面的实例中,我们可以看出
SGID: group,占据属组的执行权限位
s: group拥有x权限
S:group没有x权限
最后一组实例
//实验环境中创建两个目录文件,注意 o 的权限区别
drwxr-xr-x. 2 root root 6 Jul 25 14:41 dir3
drwxr-xr--. 2 root root 6 Jul 25 14:41 dir4
//下面分别给两个目录加上sticky权限
chmod o+t dir3
chmod o+t dir4
// 执行ll 命令观察两个目录的权限变化
drwxr-xr-t. 2 root root 6 Jul 25 14:41 dir3
drwxr-xr-T. 2 root root 6 Jul 25 14:41 dir4
通过上面的实例
Sticky: other,占据other的执行权限位
t: other拥有x权限
T:other没有x权限
chattr +i 不能删除,改名,修改 chattr -i
chattr +a 只能追加内容
lsattr 显示特定属性
ACL:Access Control List ,实现灵活的权限管理
除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test
ACL生效顺序:所有者,自定义用户,自定义组,其他人
// 查看文件或者目录的ACL权限 使用 getfacl FILE|DIR
getfacl f1
# file: f1
# owner: root
# group: root
user::rw-
group::r--
other::r--
//给文件f1加上mage的运行权限
setfacl -m u:mage:w f1
//可以发现,在权限位的后面加上了一个加号,这就说明该文件被赋予了ACL权限
-rw-rwxr--+ 1 root root 0 Jul 25 15:31 f1
// 查看f1的ACL权限
# file: f1
# owner: root
# group: root
user::rw-
user:mage:w
group::r--
mask::rwx
other::r--
//如果此时mage用户去读f1文件,他是不能读取的。
//指定admins组里的成员对f2文件有读写权限
setfacl -m g:admins:rw f2
# file: f2
# owner: root
# group: root
user::rw-
group::r--
group:admins:rw-
mask::rw-
other::r--
//此时mage用户可以对f2文件机型写入吗
//切换到mage用户
echo HelloWorld >> f2
下面这些命令可以自己尝试一下
setfacl -m u:wang:rwx file|directory
setfacl -Rm g:sales:rwX directory //递归
setfacl -M file.acl file|directory //增加权限
setfacl -m g:salesgroup:rw file| directory
setfacl -m d:u:wang:rx directory //设置目录的默认权限
setfacl -x u:wang file |directory
setfacl -X file.acl directory 删除权限
//增加权限和删除权限的文件格式是不一样的。
//定义一个文件用来增加权限
nano file.acl
u:mage:rwx
g:admins:rw
//先查看一下f1 的ACL
# file: f1
# owner: root
# group: root
user::rw-
group::r--
other::r--
//执行修改权限命令
setfacl -M file.acl f1
//查看一下该文件的ACL
# file: f1
# owner: root
# group: root
user::rw-
user:mage:rwx //新增了权限
group::r--
group:admins:rw- //新增了权限
mask::rwx
other::r--
//我们修改一下 file.acl 将刚才添加的权限删除掉 注意格式有所不同的
nano file.acl
u:mage
g:admins
// 执行修改权限命令
setfacl -X file.acl f1
# file: f1
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
通过上面的实例可以看出,权限的修改是可以批量进行的,但是-X 并不能清除ACL的所有权限。
现在我们可以重新来梳理一下,一个文件的权限通常涉及到哪几类用户。 属主,属组,自定义用户,自定义组,Other,一共五类使用者。 而ACL就是对这五类用户的权限进行控制 。
ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限
//设置文件的mask 值
getfacl f1
# file: f1
# owner: root
# group: root
user::rw-
user:mage:rwx
group::r--
group:admins:rw-
mask::rwx
other::r--
//设置文件的mask值位 r--
setfacl -m mask::r-- f1
# file: f1
# owner: root
# group: root
user::rw-
user:mage:rwx #effective:r--
group::rw- #effective:r--
group:admins:rw- #effective:r--
mask::r--
other::r--
- 设置mask值之后我们会发现,自定义用户,自定义组,以及默认的属组,都被mask值限定住了。
可以将mask值理解为最高权限,除了所有者,Other之外,其他的都在mask 的管辖之内。
getfacl 可看到特殊权限:flags
通过ACL赋予目录默认x权限,目录内文件也不会继承x权限
base ACL 不能删除
setfacl -k dir 删除默认ACL权限
setfacl –b file1清除所有ACL权限
getfacl file1 | setfacl –set-file=- file2 复制file1的acl权限给file2
//getfacl 可看到特殊权限:flags
//如果一个文件或目录设置特殊权限,SGID,SUID,Sticky
# file: dir
# owner: root
# group: root
# flags: -s-
user::rwx
group::r-x
other::r-x
- mask只影响除所有者和other的之外的人和组的最大权限Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
用户或组的设置必须存在于mask权限设定范围内才会生效
setfacl -m mask::rx file
- –set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以
示例: setfacl –set u::rw,u:wang:rw,g::r,o::- file1
博客转载自曲良同学 http://www.pojun.tech