文件的特殊权限
在复杂多变的生产环境中,单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求,因此便有了SUID,SGID,SBIT的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。
SUID
SUID是一种对二进制程序进行设置的特殊权限。可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
例如:
所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它默认权限是000,也就是说除了root管理员外,所有用户都没有查看或编辑这个文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。
SGID
SGID主要实现如下两种功能:
①让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
②在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。举例来说,在早期的Linux系统中,/dev/kmem是一个字符设备文件,用于存储内核程序要访问的数据,权限为:
cr--r----- 1 root system 2, 1 Feb 11 2017 kmem
除了root管理员或属于system组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用于查看系统进程状态的ps命令文件上增加SGID特殊权限位,这样一来,由于ps命令被增加了SGID特殊权限位,所以当用户执行该命令时,也就临时获取到了system用户组的权限,从而可以顺利地读取设备文件了。
前面我们提到,每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者),如果现在需要一个部门内设置共享目录,让部门内所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置SGID特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,我们用到的就是SGID第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)
在使用上述命令设置好目录的777权限(确保普通用户可以向其中写入文件),并为该目录设置了SGID特殊权限位后,就可以切换一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称:
除了上面提到的SGID的这两个功能,我们再简单学习两个权限的命令:chmod和chown
chmod命令是一个非常有用的命令,能够用来设置文件或者目录的权限。
格式为:chomd 【参数】权限 文件或目录名称
如果要把一个文件的权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法表示为760.
通过前面的学习,可以体会到数字法的简捷度
除了设置文件或目录的权限外,还可以设置文件或目录的所有者和所属组,这里使用的命令为chown。
其格式为: chown 【参数】所有者:所属组 文件或目录名称
chmod和chown命令是用于修改文件和权限的最常用的命令
它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数 -R 来表示递归操作,即对目录内所有的文件进行整体操作。
SBIT
SBIT特殊权限位(也可以称之为特殊权限位之粘滞位)
SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。
与前面所讲的SUID和SGID权限显示方法不同,当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T
其实,文件是否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限。我们切换到另外一个普通用户,然后尝试删除这个其他人创建的文件就会发现,即便读、写、执行权限全开,但是由于SBIT特殊权限位的缘故,依然无法删除这个文件:
当然,要是也想对其他目录来设置SBIT特殊权限位,用chomd命令就可以了。对应的参数o+t代表设置SBIT粘滞位权限:
文件的隐藏属性
chattr命令
chattr命令用于设置文件的隐藏权限
格式位 chattr 【参数】文件
如果想要把某个隐藏功能添加到文件上,则需要再命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则要追加“-参数”。
chattr命令可供选择的隐藏权限参数非常丰富
参数 | 作用 |
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建删除文件 |
a | 仅允许补充内容,无法覆盖/删除内容 |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(0填充原文件所在的硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间 |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump目录备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
x | 可以直接访问压缩文件中的内容 |
我们来简单实验一下
我们先删除一个普通文件,在删除一个加权的普通文件,作为对比
lsattr命令
lsattr命令用于显示文件的隐藏权限
格式为 lsattr 【参数】 文件
在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看,平时使用的ls之类的命令则看不出细节
文件访问控制列表
权限一般是针对某一类用户设置的。
如果希望对某个指定的用户进行单独的权限控制,那么就需要用到文件中的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录文件设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外。如果针对某个目录设置ACL,则目录中的文件就会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
我们来简单实验一下,看看效果
setfacl命令
setfacl命令用于管理文件的ACL规则
格式为 setfacl 【参数】文件名称
文件的ACL提供的是在所有者、所属组、其他人的读/写/执行的权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或者用户组,单一文件或者目录来进行读/写执行权限的控制。其中,针对目录文件需要用到-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL则可以使用-b参数
我们来简单演示一下设置root目录上的权限
常用的ls命令是看不到ACL表的信息的,但却可以看到文件的权限最后一个点(.)变成加号(+),这就意味着该文件已经设置了ACL了
getfacl命令
getfacl命令用于显示文件上设置的ACL信息
格式为:getfacl 文件名称
Linux系统中的命令有一定的规律
设置ACL setfacl
查看ACL getfacl
su命令和sudo命令
su命令可以解决切换用户身份的需求
su - 用户名 之间的减号(-)代表完全切换到新的用户
即把环境变量信息也变更为新用户的相应信息,而不是保留原有的信息。
root管理员切换到普通用户是不需要密码的,而普通用户切换到root管理员则需要密码
sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务
格式: sudo 【参数】命令名称
参数 | 作用 |
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u 用户名或UID值 | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
sudo命令有以下几个功能:
①限制用户执行指定命令
②记录用户执行的每一条命令
③配置文件(/etc/sudoers)提供集中的用户管理、权限和主机等参数
④验证密码的后5分钟内(默认值)无须再让用户再次验证密码
如果担心直接修改配置文件会出现问题,我们可以使用sudo命令提供的visudo命令来配置用户权限。
这条命令在配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可对配置文件内的参数进行语法检查,并发现参数错误时进行报错。
只有root管理员才可以使用visudo命令编辑sudo服务的配置文件
[root@DongFang ~]# visudo
我们切换到普通用户,执行sudo -l 查看所有可执行命令(下面验证的是该普通用户的密码,而不是root管理员的密码)
作为一个普通用户,是肯定看不到root用户的家目录的,但是,经过修改配置文件后,我们只需要在想执行的命令前面加上sudo命令就可以了
ALL参数不太合适,因此只能赋予普通用户具体的命令以满足工作的需求,这也受到了必要的约束
如果需要让某个用户只能使用root管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径
否则系统识别不出来,我们可以先使用whereis命令找出命令所对应的保存路径,然后把配置文件的用户权限参数修改成相应的路径即可
每次我们使用sudo前缀使用命令时。总是要验证普通用户的密码,接下来我们也可以解决这个繁琐的步骤
验证密码这个问题在Linux8上并未成功,上图解决频繁验证密码的方法是7版本,或许有不同把,另外,有大神发现了错误,请在评论区留言。学习学习!