(一)Red Hat Linux 文件权限
Linux系统中不仅是对用户与组根据UID,GID进行了管理,还对Linux系统中的文件,按照用户与组进行分类,针对不同的群体进行了权限管理,用他来确定谁能通过何种方式对文件和目录进行访问和操作。
一、概念
身份:一个用户对于一个文件或者目录而言,具有的身份。
(1)文件的权限针对三类对象进行定义
owner 属主,缩写u
group 属组,缩写g
other 其他,缩写o
root用户是超级管理员,但root组是一个普通组。
(2)每个文件针对每类访问者定义了三种主要权限
r:Read 可读--能够读取文件或者目录内容的权限
w:Write 可写--能够修改文件或者目录的内容
x:eXecute 可执行
针对文件而言,x叫可执行;
针对目录而言,x是否能够成为一个用户的工作目录
Tips:
X:针对目录加执行权限,文件不加执行权限(因文件具备执行权限有安全隐患)
root账户不受文件权限的读写限制,执行权限受限制
查看示例:
Tips:解读-rw-r--r--
输出结果的第一个字段就是描述文件和目录权限的编码。这个字段的第一个字符代表了对象的类型:
- 代表文件
d 代表目录
I 代表链接
c 代表字符型设备
b 代表块设备
n 代表网络设备
后面的有3组三字符的编码,分别是对应的owner、group、other组,rwx对应的权限类型在上面已经给出。
Tips:文件权限在对于文件和目录时具有不同的含义
文件权限:
r(read):可读取此文件的实际内容,如读取文本文件的文字内容;
w(write):可以编辑、新增或是修改文件的内容(不包含删除文件);
x(execute):该文件具有可以被系统执行的权限;
文件夹权限:
r:表示具有读取目录结构列表的权限,当你具有一个目录的r权限时,表示你可以查询到该目录下的文件名数据
w:表示具有改变目录结构的权限,包括新建文件与目录、删除文件与目录、重命名文件及目录、移动文件及目录位置
x:代表用户能否进入该目录成为工作目录
利用一个示例进行说明:
如前所述:文件/etc/fstab的other组权限为r--,他的属主为root,属组为root。即当将使用者更换为user10时(此时他就是other身份),此时user10的权限就是r--(只可读)
此时user10可以读取/etc/fstab,但是若对文件进行修改时,当退出保存时,会报出以下错误,代表user10没有/etc/fstab。同理,若该文件是个可执行文件(如.sh),user10也不能对他执行。
对于目录权限的分析:
可知当使用用户user10,具备的权限是r(可读)和x(可执行)
当一个用户针对一个目录具备r权限的时候,是能够查看到该目录下的内容的,但只限一系列文件名以及目录名称。若目录r权限去掉,则无法读取这个目录下的文件名和目录名。
为other组加回r权限,而删去x权限,此时的user10连进入目录都做不到了(修改权限的方法在下面继续探讨)
Tips:总结
只要你想一个用户针对一个目录可访问:具备读取r和执行x权限是必要的,单纯的r和单纯的w都是没有任何意义的。
而针对目录的w(写入)很简单,即是否能在该目录下创建或者删除文件。
所以,针对目录的权限设置,存在以下3种情况:
<1> r-x
<2> rwx
<3> ---
以下这些情况基本不存在:
r-- :仅能读取到目录中的文件名,不能访问目录
-w- : 连目录都访问不到,写权限没有意义
--x : 只能cd进入访问目录,不能读写
rw- : 连目录都访问不到,读写权限没有意义
-wx :只能访问目录不能读取目录内容,写权限没有意义
对于文件而言的权限设置,一般存在以下几种:
r-- 可以仅仅读取
rw- 可以读写
rwx 可读可写可执行
--- 什么权限都没有
r-x 可读可执行
(3)使用数字对权限的表示
可以将rwx分别对应一个三位数的二进制,当拥有此权限时,将该位置的数字置为1,否则为0。
因此 r=4 w=2 x=1 而每种身份各自的权限是各自三个权限数字的累加。
示例如下:
一、权限修改
1、修改权限
命令:chmod 修改权限 要修改权限的文件或目录
A、记号法
Tips:
u:拥有者 g:所属组 o:其他人
=:直接赋予权限
+:在原基础上加权限
-:在原基础上减权限
B、数字法
Tips:
数字表示权限的方式如前所述。
拥有者(u)的权限:rwx=4+2+1=7
所属组的权限(g):r-x=4+1=5
其他人的权限(o):-wx=2+1=3
2、身份修改
A、修改所属者:chown
命令:chown 要修改的所属者 要修改的文件或目录
B、修改所属组:chgrp
命令:chgrp 要修改的所属组 要修改的文件或目录
Tips:使用命令修改所属者或所属组为user10后,管理员(root)还是可以对该目录进行操作。所以root用户拥有最高的权限,也可以看做无论怎么更改,root拥有系统上所有文件的所有权限。
二、默认权限
创建目录的默认权限为755,创建文件的默认权限为644
决定默认权限的是一个叫umask(反掩码)的默认属性,root用户的umask的值默认为0022
一个目录的创建权限等于:满权限(777)-umask值=777-022=755
一个文件的创建权限等于:满权限(666)-umask值=666-022=644
Tips:root用户和普通用户的umask值不一样的。(可以查看/etc/profile文件)
Tips:修改umask值
临时修改:直接使用命令--umask 修改后的值
永久修改:编辑配置文件/etc/profile --vim /etc/profile,修改的位置如下图,修改后需要source /etc/profile之后永久生效。
三、特殊权限
(1)SUID
作为一个普通用户,是否可以自己更改自己的密码呢?答案是可以的。
Linux系统的所有用户名和密码均存放在文件/etc/shadow中。修改一个用户的密码,其实就是更改配置文件 /etc/shadow
由上图可知,该文件任何人均没有修改的权限,即便是root用户。
但是为什么普通用户user40却能执行passwd命令对自己的密码进行更改呢?
在linux系统中,当执行一个命令时,其实就是执行在/usr目录中的一个二进制可执行文件,可以使用命令which来定位到某个命令对应的二进制可执行文件(如下图所示)
可以看到,命令passwd的二进制可执行文件的所属者权限中,执行权限的位置上从x变成了s,也就是我们所说的GUID。
普通文件:rwx 带SUID的文件:rws
SUID:当一个s权限出现在所属者的x位上
作用: 当一个普通用户user40去执行一个带有SUID的二进制文件 (passwd),那么这个用户(test1)在执行过程中,会暂时获得获取到这个二进制文件(passwd)的拥有者(root)的权限。后续操作比如修改文件(passwd) 这个文件的时候,会拿着(root)这个拥有者的身份去执行,这个操作仅仅对二进制文件生效。
原理:普通用户执行passwd→/etc/shadow→root身份去执行
Tips:
如果是rwS,则本身文件是没执行权限的,仅仅获得了SUID功能而已,SGID同样适用。
操作命令:chmod u+s filename/directoryname
(2)SGID
与SUID同理,当一个s权限出现在属组的x位上时,为SGID
A、针对二进制文件:文件执行过程中获取文件属组的权限。
B、针对目录:默认情况下,我们新建一个文件或目录的时候,它的属组是这个用户的初始组。
加上SGID之后,其下新建的目录及文件会继承该目录的属组(不继承属主)。
操作命令:chmod g+s filename/directoryname
(3)sticky(粘滞位)
sticky bit:仅对目录生效,若该目录其他人(other)的执行权限出现了t,那么该目录下的文件或目录,仅文件所有者及root用户能删除。
操作命令:chmod o+t filename/directoryname
通过目录可以看出里面的文件f3和f5的所属者分别对应root和user10。此时如果使用user20对这两个文件进行删除操作,会提示因没有权限而被拒绝。
Tips:
超级权限数值法:suid 4XXX / sgid 2XXX / sticky bit 1XXX
(4)写保护特殊权限:i和a
操作方法:
修改:chattr +i/+a filename
列出:lsattr filename
+i:硬写保护,只能读不能写,不能删除
加了硬写保护后,不能删除,不能通过重定向修改文件。
也不能用vim直接修改
+a:软写保护,只能读不能写,不能删除原有内容,但是能通过重定向追加更新内容
可以通过重定向的方式(echo)修改文件
(5)给特定用户设置对应的权限--ACL
当需要给不同用户设置对应不同的文件(目录)权限时,可以通过设置文件访问控制列表,即ACL(Access Control List)规则来实现。
查看acl:getfacl
设置acl:setfacl
A、通过getfacl获取文件(目录)的ACL列表
B、setfacl设置ACL规则
为文件设置:
setfacl -m u:user10:rw- /tmp/testprivillege/f1
为目录(若是递归)设置:
setfacl -Rm u:user20:rwx /tmp/testprivillege/
由于是递归的添加,可以看到该目录下的文件也会添加上对应的规则
C、删除ACL规则
删除一条记录:
setfacl -x u:user20 /tmp/testprivillege/f1
删除所有记录:
setfacl -b /tmp/testprivillege/f1
D、默认ACL:定义用户对于文件的ACL的最大权限
设置默认ACL:
[root@servera test_privillege]# setfacl -d 权限 /tmp/testprivillege
移除默认ACL:
[root@servera test_privillege]# setfacl -k /tmp/testprivillege
Tips:
参考链接:https://www.cnblogs.com/ftl1012/p/setfacl.html