Linux中最基本的权限是rwx,但有时候一些问题是这三个基本权限解决不了的,所以博主学习总结了下面一些特殊权限,希望对你有所帮助。
目录:
- ACL权限
- 文件特殊权限:
1.SetUID
2.SetGID
3.Sticky BIT - 文件系统属性chattr权限
一。ACL权限
注意:这里的ACL不是防火墙那里的访问控制列表。
Linux中的ACL权限是为了解决三个身份(user所有者,group所属组,other其他人)不够用的情况
看下图,试想这种情况:/project文件是一个教学文件,它的所有者,数组(相当于老师,同学)对这个文件肯定都是rwx权限,完全可以操作,对other其他人是0权限,其他人不能看,写这个文件。所以这个文件夹的权限是770。 但是这时候来了一个试听用户,我们希望给他的权限是r-x权限,但好像这时候把他放到三个身份都不合适,这时候就要用到ACL权限了。
ACL系统一般默认都是支持的,接下来看一下怎么使用设置ACL权限
设定ACL权限:
setfacl 选项 文件名
现在我们使用setfacl命令来解决上图中的问题,使用如下命令:
setfacl -m u:st:rw /project
其中:
- u代表给用户设置ACL权限,如果给组设置用g
- st是用户名
- rw是你要给这个用户的权限
然后设置完,我们使用ls命令查看project时会发现 权限后面多了一个“+”号,这就说明它有了ACL权限了。
并且我们可以使用getfacl命令查看具体的ACL权限
我们可以看出,在Linux中通过ACL权限我们可以达到类似windows中给任意用户单独添加权限的效果。
细心看上图,有一个mask:rwx,这里的mask和umask权限掩码的功能基本相同,是控制默认权限的,也就是说,其实我们上面给用户的ACL权限rw和这个mask:rwx想与得到的结果才是用户真正的权限。
修改这里的mask权限的方法:
setfacl -m:rx /project
这时候,默认mask权限就变为rx了。(可以防止不小心给用户过高权限)
删除ACL权限:
删除st用户的ACL权限
setfacl -x u:st /project
直接删除这个文件所有ACL权限
setfacl -b /project
如果想给父目录中所有子目录,文件都设置ACL权限,那么我们可以用“-R”选项递归设置ACL权限。
set -m u:用户名:权限: -R 目录名
最后,如果我们想给一个目录设置默认ACL权限,即只要这个目录里新建文件,这些文件就都直接有ACL权限,而不用每次单独重新设置:
只需要前面加一个d就好了,d代表default默认
set -m d:u:用户名:权限: -R 目录名
Linux常用ACL权限的方法就是上面这些,稍微总结一下用到的命令就是这两个:
setfacl 设置,删除ACL权限
getfacl 查看ACL权限
二。文件特殊权限
1.SetUID
当我们查看下面的文件时,我们会发现,有一个s。这是因为passwd命令有Suid权限。
SUID权限指的就是在文件所有者的执行权限的位置是一个s;
后面要说到的SGID也就是文件从属组的执行权限的位置是一个s。
而这有什么用呢?
我们知道,在我们使用passwd命令设置密码的时候,实际上是写入了/etc/shadow这个文件,我们来查看一下这个文件的权限:
我们发现是000,也就是普通用户是根本没办法对他进行操作的,但是我们确实可以更改密码对吧。
这里就是因为passwd这个命令拥有SUID权限,当其他用户使用这个命令时,会暂时获取其所有者(即root) 的权限,我们知道rwx权限是无法限制root用户的,因此所有用户都可以使用passwd命令来修改设置密码。
下面具体介绍SUID的特点与设置方法。
SUID权限的特点:
- 只有可以执行的二进制程序才能设定SUID权限
- 命令执行者要对该程序拥有x (执行)权限
- 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的所有者)
- SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
设置SUID权限的方法:
有下面两种方法:
chmod 4755 文件名
chmod u+s 文件名
(4代表SUID)
取消SUID权限:
chmod 755 文件名(不加4了)
chmod u-s 文件名
(注:去掉SUID后,再ls查看文件会发现s变成了S,说明SUID已经失效了,小写的s才有效)
SUID不要随便设置,有很高的危险性
比如我们使用 chmod 4755 /usr/bin/vim 给了vimSUID权限,那么随便一个普通用户都能随意更改系统文件了,会带来很大威胁(如某进入/etc/passwd把自己的UID改成0,把自己编程超级用户)。
2.SGID
SGID与上面的SUID很像,命令执行程序的时候,组身份暂时升级成该程序文件的属组。用的相对不是很多
看一个例子,locate命令
从属用户组执行权限的位置是一个s。
简单说一下,locate搜索的时候实际搜的是mlocate这个数据库,因此速度比较快,但当我们看这个文件权限是会发现为640,也就是其他用户本不应该能访问,但正因为locate命令有SGID权限,因此,其他用户使用locate命令时,暂时加入到了slocate这个组,也就可以访问那个文件了。
设置SGID命令:
chmod 2755 文件名
chmod g+s 文件名
同上面的SUID很类似,看懂上面的,这个应该不难理解
3.Sticky BIT(粘着位)
作用:普通用户不能删除其他用户建立的文件(即使拥有w权限)
比如/tmp目录的权限是777,此时user1在tmp目录下创建了一个文件,但是user2来了可以直接把user1创建的文件删了,或者更改。
但是设置了SBIT权限(可以看到图中tmp其他人的执行权限的位置变为了t),用户之间就不能这样任意更改创建的文件了。
接下来介绍SBIT的特点与设置:
特点:
- SBIT只对目录设置有效
- SBIT对root无效
- 目录设置了粘着位,用户不能删除其他用户创建的文件(可以看),只能删自己创建的。
- 只能在root用户下设置某个目录的粘着位权限
设置SBIT 命令:
chomod 1755 目录名
chmod o+t 目录命
取消:
chmod 755 目录名
chmod o-t 目录名
三。文件系统属性chattr权限
attr是attributes属性的缩写
前面说的基本所有权限对root都是没有限制的,而使用chattr可以对root进行一些限制。
有两个属性:i 和 a
- i;如果对文件设置i属性,那么不允许对文件进行 删除、改名,也不能添加和修改数据;如果对目录 设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。
- a:如果对文件设置a属性,那么只能在文件中增加 数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件. 但是不允许删除
可以下图的例子,我现在就是root用户,我使用chattr 给test文件设置了i属性(相当于锁柱了这个文件),注意使用ls是不能查看到的,需要使用lsattr命令查看。然后发现我不能对文件进行更改了,提示权限不够!
设置的命令
chattr +i 文件/目录名
chattr +a 文件/目录名
取消:
chattr -i 文件名
chattr -a 文件名
这个命令主要是为了防止用户误操作,不小心更改或删除重要文件或破坏目录结构
本文也是博主看了“兄弟连”的Linux视频学习总结的,讲的挺好的,有小伙伴感兴趣可以去搜一搜