Linux文件权限及FACL文件访问控制列表

Linux 系统是一种典型的多用户系统,它通过给不同的用户分配不同的权限来确保系统的安全性。
同时,Linux 系统针对不同用户访问同一文件(包括目录文件)的权限也做了不同的规定。

一、文件权限

(一)文件的基本权限

文件的基本权限主要包括文件属主、属组以及其他用户(组)对该文件的读( r)、写(w)、执行(x)权限
属主也就是文件的所有者;属组指在该文件所在用户组中的用户;其他用户(others)指的是既不为属主也不属于属组的其他用户。
文件的基本权限可通过ls -l命令进行查看

[root@hollowman ~]# mkdir hollowman
[root@hollowman ~]# ls -ld hollowman
drwxr-xr-x. 2 root root 6 Dec 20 22:27 hollowman

ls -l后,屏幕显示字符串解析:
第1位:表示文件类型,这里为d表示的是目录文件。

d :目录文件;
-  :文件;
l  :链接文档(link file);
b :硬盘(分区)、光盘等存储设备;
c  :键盘、鼠标等字符设备。

第2-10位:每三位1组,分别对应属主、属组、other的读、写、执行权限。
这里rwxr-xr-x:表示属主有读写执行(rwx)权限;属组只有读和执行权限(r-x),others也只有读和执行权限(r-x)。

第11位:表示是否设置facl权限,如果设置了,则显示加号(+);如果没设置,则显示点(.),第三大点有介绍facl知识。
其他显示说明:后面第一个root表示属主是root,第二个root表示属组是root,6表示该文件占用6个字节大小,Dec 20 22:27表示最后一次修改时间,hollowman表示文件(目录)名称
在这里插入图片描述

修改文件基本权限:
1.chown:修改文件属主(所有者)和属组(该文件所在的用户组)。
基本语法:chown [选项] [属主名][:属组名] 文件名

[root@hollowman ~]# chown -R hollowman hollowman   #-R 表示对目录进行递归设置
[root@hollowman ~]# ls -ld hollowman
drwxr-xr-x. 2 hollowman root 6 Dec 20 22:27 hollowman

2.chmod:修改用户权限(也就是ls -l 显示的第2-10位)
有2种表示文件基本权限的方式:字母表示法数字表示法

  • 读:字母表示是r,数字表示是4;
  • 写:字母表示是w,数字表示是2;
  • 执行:字母表示是x,数字表示是1;
  • 无权限:字母表示是-,数字表示是0。
    如果用数字表示,可以通过各种权限的数值表示相加来表示,如rwx=4+2+1=7,r-x=4+0+1=5

几种常见用法:

chmod [-R]  [u=abc] [,g=abc] [,o=abc]  文件名  #a、b、c分别对应r(-)、w(-)、x(-)
chmod [-R]  [u {+|-} [a][b][c]] [,g {+|-} [a][b][c]] [,o {+|-} [a][b][c]]  文件名   
chmod [-R] xyz 文件名     #xyz分别对应u、g、o三中身份的数字表示的权限。

几个例子:

[root@hollowman ~]# chmod -R u=rwx,g=rwx,o=rwx hollowman/    #全权限
[root@hollowman ~]# ls -ld hollowman/
drwxrwxrwx. 2 hollowman hollowman 6 Dec 20 22:52 hollowman/  
[root@hollowman ~]# chmod -R u-x,g-w,o-r hollowman/    #u去掉x权限,g去掉w权限,o去掉r权限
[root@hollowman ~]# ls -ld
drw-r-x-wx. 16 root root 4096 Dec 20 22:27 .
[root@hollowman ~]# chmod -R 765 hollowman/   #u设置rwx权限,g设置rw-权限,o设置r-x权限。
[root@hollowman ~]# ls -ld hollowman/
drwxrw-r-x. 2 hollowman hollowman 6 Dec 20 22:52 hollowman/

(二)文件的特殊权限。

除了用户(组)对文件本身的读、写、执行权限,Linux还提供了三种特殊权限:SUID、SGID、SBIT

1.SUID

1)只能对二进制执行程序(如系统中的命令)设定SUID权限,其他文件包括脚本文件即使设置SUID权限也无实际意义。
2)设定SUID权限后,其他用户在执行该文件时,就相当于以文件所有者(也就是属主)的身份在执行程序。因此,属主应该首先授予(x)权限,否则,其他用户也无法获得执行权限,设置了SUID权限同样也无实际意义。。
3)设置SUID权限的目的,是通过以属主的身份来完成其他文件的相关操作(用户本身并不具备操作其他文件的权限),被赋予SUID权限的文件其实起到了桥接的作用,并且只在桥接过程中有效。
4) SUID体现在文件所有者(属主)权限的执行权限位(ls -l的第4位),当文件设定了SUID权限,通过在ls -l查看显示的第4位由字母"x"变成了小写字母"s"(如果文件所有者没有执行权限,也就是第4位为"-",则字母变为大写字母S,这种SUID设定无意义)

沿用使用最多也最经典的一个例子:
/etc/shadow文件存储着用户的密码信息,ls发现任何用户都没有读写和可执行权限,当然,作为超级管理员root是不受这些权限约束的。

[root@hollowman ~]# ls -l /etc/shadow
----------. 1 root root 1311 Dec 20 17:54 /etc/shadow

其他用户要想完成修改密码动作,并将密码保存至这个文件中。而完成密码修改及保存工作的程序可以通过/bin/passwd和/urs/bin/passwd这两个执行文件来完成。

[root@hollowman ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 34512 Aug 13  2018 /bin/passwd
[root@hollowman ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 34512 Aug 13  2018 /usr/bin/passwd

可以看出上面的/bin/passwd/usr/bin/passwd第4位都是小写s,也就是设定了SUID值。这样,我们就可以用其他用户执行这个程序来完成密码修改动作了。

怎么设置SUID权限呢?
SUID权限和基本权限类似,也有字母和数字两种权限表示法。
字母表示法是字符"s"。如:chmod u+s 可执行文件名
数字表示法是数字4。 如:chmod 4777 可执行程序名
注意:这里用了4位数字来设置文件权限,其中第一位就是特殊权限,后面三位才是基本权限。

2.GUID

SGID特殊权限有两种情况:

  1. 当对二进制程序设置GUID时,可以让用户临时获取到文件属组的权限(和SUID类似,只不过这里是获得了属组成员身份)
  2. 当对目录设置GUID时,可以让目录内新创建的文件属性中的属组自动继承该目录的属组。
  3. SGID体现在文件/目录属组权限的执行位(ls -l第7位),当文件/目录设定了SGID权限,通过在ls -l查看显示的第7位由字母"x"变成了小写字母"s"(如果文件属组没有执行权限,也就是第7位为"-",则字母变为大写字母S)

SGID权限设置,同样也是两种权限表示法。
字母表示法是字符"s"。如:chmod g+s 文件/目录名
数字表示法是数字2。 如:chmod 2777 文件/目录名
注意:如果用数字来设置文件权限,当要同时设置SUID和SGID时(只有二进制程序才会用得到),就相当于4+2=6了,如chmod 6777 文件名

演示:
在root用户的家目录下建立一个test目录,可以看出属组为root

[root@hollowman ~]# mkdir test
[root@hollowman ~]# ls -ld test
drwxr-xr-x. 2 root root 6 Dec 22 23:11 test

在test目录下创建file文件,可以发现属组还是root

[root@hollowman ~]# touch test/file
[root@hollowman ~]# ls -l test
total 0
-rw-r--r--. 1 root root      0 Dec 22 23:12 file

将test目录属组设置为hollowman,并设置GUID权限

[root@hollowman ~]# chown :hollowman test
[root@hollowman ~]# chmod g+s test
[root@hollowman ~]# ls -ld test
drwxr-sr-x. 2 root hollowman 6 Dec 22 23:13 test

在test目录下新建newfile文件,发现属组已继承test目录的属组hollowman

[root@hollowman ~]# touch test/newfile
[root@hollowman ~]# ls -l test/
total 0
-rw-r--r--. 1 root root      0 Dec 22 23:12 file
-rw-r--r--. 1 root hollowman 0 Dec 22 23:14 newfile
3.SBIT(粘滞位权限或者说文件保护权限)
  1. SBIT只针对目录文件有效。
  2. SBIT的作用:当一个目录对于属组可写(或者全局可写)时,组内的所有用户(或者所有其他用户)都可以在此该目录内创建新文件和删除所有的文件,这样的权限是致命的;当设置了SBIT权限后,则属组内的每个用户(或者所有其他用户)都只能创建新文件和删除自己的文件,而不能删除其他用户的文件。
  3. SBIT体现在目录的other用户权限的执行位(ls -l第10位),当目录设定了SBIT权限,通过在ls -l查看显示的第10位由字母"x"变成了小写字母"t"(如果目录的other用户没有执行权限,也就是第10位为"-",则字母变为大写字母T)
  4. Linux系统的/tmp目录已经设置了SBIT权限,也就是该目录下只允许删除自己的文件。

SBIT权限设置,照样也是两种权限表示法。
字母表示法是字符"t"。如:chmod o+t 目录名
数字表示法是数字1。 如:chmod 1777 目录名
数字法总结:SUID为4,SGID为2,SBIT为1,需要设置三种权限中的某几种时,只要将代表这几种权限的数字相加即可(类似于rwx数字权限设置),chmod 7777 目录名 表示特殊权限全开(当然全开有些权限并无意义)
字母法特权设置命令:chmod [u+s],[g+s],[o+t] 文件名
字母发特权删除命令:chmod [u-s],[g-s],[o-t] 文件名

(三)文件的隐藏权限

Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,默认情况下不能直接被用户发觉。
隐藏权限不能用常规的ls命令查看,专用的设置命令是chattr,专用的查看命令是lsattr

[root@hollowman ~]# lsattr
------------------ ./hollowman
[root@hollowman ~]# chattr +i hollowman    
[root@hollowman ~]# lsattr
----i------------- ./hollowman

上例设置给hollowman目录设置了一个i的隐藏权限(表示仅能修改hollowman目录内的子文件内容而不能新建或删除文件)。
有关选项:

i	无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
a	仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S	文件内容在变更后立即同步到硬盘(sync)
s	彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
A	不再修改这个文件或目录的最后访问时间(atime)
b	不再修改文件或目录的存取时间
D	检查压缩文件中的错误
d	使用dump命令备份时忽略本文件/目录
c	默认将文件或目录进行压缩
u	当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t	让文件系统支持尾部合并(tail-merging)
x	可以直接访问压缩文件中的内容

实例:

[root@hollowman ~]# touch ./hollowman/newfile
touch: setting times of './hollowman/newfile': No such file or directory
[root@hollowman ~]# chattr -i hollowman
[root@hollowman ~]# touch ./hollowman/newfile

上例,我们在设置了i这个隐藏权限的hollowman目录下新建newfile文件,正如其选项作用一样给出了错误提示,接着删除i权限,再次新建文件,此时文件成功创建。

二、文件访问控制列表FACL(File Access Control List)

有时候我们需要在某些特定的用户和用户组设置一些额外的访问权限,而这些特权通过给文件赋予权限的方式无法解决,这时候就需要用到FACL了。
也就是说文件权限可以解决共性(user,group,other)权限设置问题,而FACL则可以解决个性(如group中的个别用户,other中的个别用户或群体)权限设置问题。

1.getfacl

读取文件的ACL权限

[root@hollowman ~]# getfacl hollowman/       
# file: hollowman/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

上例演示了读取/root/hollowman目录的facl

2.setfacl

设置文件的ACL权限,语法:setfacl [-bkndRLPvh] [{-m|-x} acl权限] [{-M|-X} acl文件] 文件 ...

-m,       --modify-acl 更改文件的访问控制列表
-M,       --modify-file=file 从文件读取访问控制列表条目更改
-x,       --remove=acl 根据文件中访问控制列表移除条目
-X,       --remove-file=file 从文件读取访问控制列表条目并删除
-b,       --remove-all 删除所有扩展访问控制列表条目
-k,       --remove-default 移除默认访问控制列表
          --set=acl 设定替换当前的文件访问控制列表
          --set-file=file 从文件中读取访问控制列表条目设定
          --mask 重新计算有效权限掩码
-n,       --no-mask 不重新计算有效权限掩码
-d,       --default 应用到默认访问控制列表的操作
-R,       --recursive 递归操作子目录
-L,       --logical 依照系统逻辑,跟随符号链接
-P,       --phollowmansical 依照自然逻辑,不跟随符号链接
          --restore=file 恢复访问控制列表,和“getfacl -R”作用相反
          --test 测试模式,并不真正修改访问控制列表权限
-v,       --version           显示版本并退出
-h,       --help              显示本帮助信息

实例:

[root@hollowman ~]# setfacl -Rm u:hollowman:rwx hollowman/  #目录设置facl要加R选项,表示递归操作
[root@hollowman ~]# getfacl hollowman/    
# file: hollowman/
# owner: root
# group: root
user::rwx
user:hollowman:rwx       #这里增加了刚添加的对hollowman用户的facl权限
group::r-x
mask::rwx    #奇怪吧,这里也新增了一个的mask权限
other::r-x

mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。
一般使用setfacl命令后会重新计算mask权限,默认会自动从所有权限中的获取最高的一个权限(如只要有一个rwx权限,则mask就会设置位rwx,如果最高时rw,则mask一般也会默认设置为rw);也可以用-n选项不计算mask权限,也可以修改mask权限。

[root@hollowman ~]# setfacl -Rm g:hollowman:rwx hollowman/
[root@hollowman ~]# getfacl hollowman/
# file: hollowman/
# owner: root
# group: root
user::rwx
user:hollowman:rwx
group::r-x
group:hollowman:rwx  #这里增加了刚添加的对hollowman用户组的facl权限
mask::rwx
other::r-x

还有,我们怎么样通过getfacl命令来知道文件是否设置了facl权限呢?
ls -l命令,可以看到第11位,有个加号(+),这就说明该文件设置了facl权限,而没有设置facl权限的文件,这里是一个点(.)

[root@hollowman ~]# ls -ld hollowman
drwxrwxr-x+ 2 root root 6 Dec 20 20:20 hollowman

3.FACL权限备份

对于FACL权限的设置都是立即且永久生效的,且不需要再编辑什么配置文件。但要是不小心设置错了,怎么办呢,可以先备份一个FACL权限,然后通过–restore选项恢复该FACL权限。
1) 备份hollowman目录的facl权限

[root@hollowman ~]# groupadd hy   #新建一个用户组hy,以便接下来的实验
[root@hollowman ~]# getfacl -R hollowman >back.acl

2) 添加一个对hy用户组的facl权限。

[root@hollowman ~]# setfacl -Rm g:hy:rwx hollowman/  #添加对hy用户组的facl权限
[root@hollowman ~]# getfacl hollowman/
# file: hollowman/
# owner: root
# group: root
user::rwx
user:hollowman:rwx
group::r-x
group:hollowman:rwx 
group:hy:rwx
mask::rwx
other::r-x

3) 恢复facl权限的备份后, 再次读取hollowman目录的facl权限,发现刚才添加的hy用户组的权限已经消失。

[root@hollowman ~]# setfacl --restore back.acl    
[root@hollowman ~]# getfacl hollowman/    
# file: hollowman/
# owner: root
# group: root
user::rwx
user:hollowman:rwx
group::r-x
group:hollowman:rwx
mask::rwx
other::r-x

猜你喜欢

转载自blog.csdn.net/ymz641/article/details/111569712
今日推荐