Liunx学习笔记 - 04 - 文件与目录的隐藏属性、特殊权限和ACL权限
1 文件隐藏属性chattr、lsattr
除了用户rwx、用户组rwx、其他人的rwx共9种权限设定外,其实文件和目录还可以设置其他类型的权限,先来看隐藏权限。
chattr用于设置文件的隐藏属性
命令格式:chattr [+ - =] [选项] 文件或目录名
+、-、=分别表示增加属性,去掉属性和赋予属性
选项:
a a属性,如果给文件设置了a属性,则这个文件只能增加数据,不能删除也不能修改数据;如果给目录设置了a属性,则只能在目录中建立和修改文件,而不允许删除,即只能增加目录架构,但不能删除目录架构。一言以蔽之,只增不删。只有root才能设置该属性。有点像历史或者档案只能往后面续着写,但不能改动前面已有的数据。
i i属性,如果给文件设置了i属性,则不能对文件进行删除、改名、修改数据的操作,就是只能读不能改;如果给目录设置了i属性,则只能修改目录下文件的数据,但不允许建立和删除文件,即必须保持原有目录架构。相当于把文件和目录锁起来不让人乱动了,只有root才能设置该属性。这个对于系统安全性有很大帮助,可以非常好地防止误操作。因为一旦设置了a或者i属性,这些属性对于root也是生效的!
其他属性参考帮助文档。这的a和i是用的最多的。
示例:
touch testfile # 创建空测试文件testfile
chattr +i testfile # 给testfile文件赋予属性i,谁也没法动了
sudo rm testfile # 尝试用管理员删除该文件,发现根本删除不了!
chattr -i testfile # 取消testfile的i属性
sudo rm testfile # 再次用管理员删除该文件,发现成功删除了
lsattr用于显示文件或目录的隐藏属性
命令格式:lsattr [选项] 文件或目录名
选项:
-a 显示所有文件(含以.开头的隐藏文件)
-d 若目标是目录,仅列出目录本身的属性,而不是文件的
-R 连同子目录的属性也一并列出来
示例:
touch testfile
chattr +ai testfile
lsattr testfile # 查看
显示testfile的隐藏属性i和a
----ia------- testfile
2 文件的特殊权限SUID、SGID、SBIT
SUID
SUID为SetUID的简称,用ll /usr/bin/passwd查看passwd命令文件时,显示:
-rwsr-r-x 1 root root 59640 3月 23 2019 usr/bin/passwd*
不难发现,其文件属性为-rwsr-xr-x,即原本用户的x位置不是x,也不是-,而是s,这个s就代表SetUID,即设置了用户的特殊权限。SUID有啥用呢?
- SUID权限仅对二进制程序(binary program)有效;(对目录无效)
- 执行者对于该程序需要有x的可执行权限;
- 本权限仅在执行该程序的过程中有效;
- 执行者在执行该程序时自动获得了该程序的属主身份。
看得一头雾水,完全不知道在说什么,其实举个例子就很简单了,这个passwd命令是来修改用户密码的,那么当root拿来修改自己或其他用户密码时没有问题,因为root是该命令文件的所有者,当然可以有x权限来执行,并修改了/etc/shadow中存储的密码(/etc/shadow这个用户密码存储文件的权限是000,但root依旧可以访问和修改,因为他是超人)。然而一般用户拿这个passwd来修改自己密码的时候,他其实没有权限来修改/etc/shadow中的密码的!可是他确实能修改自己的密码,这就是依靠着SUID来完成的,即那个所有者x位置上替换成的s权限。
当一般用户执行passwd命令的时候,由于他具有SUID权限,所以他临时变身成了root(灵魂附体,打了鸡血瞬间变身奥特曼),暂时可以去修改/etc/shadow文件中存储的密码,所以修改好了自己的密码。
那么一般用户如果想去看下/etc/shadow中存储的密码,比如用cat /etc/shadow来看的时候,就会跟他说,你权限不够,不能看!因为/bin/cat这个命令文件并不具有s权限,即SUID权限。
设置SUID权限
之前的777数字设置权限中,每一位由r4+w2+x1组合而成,而在777的最前面还可添加一位数字表示特殊权限,其中,4代表SUID,2代表SGID,1代表SBIT。所以:
chmod 4755 文件名,即设置了文件有SUID权限;
或
chmod u+s 文件名,同样设置文件拥有了SUID权限。
删除SUID权限
chmod 755 文件名
或
chmod u-s 文件名
注意:
- SUID只对二进制文件生效,对于目录是没有效果的;
- SUID这玩意知道就行了,没事别乱折腾就是了。
SGID
如果在文件或目录权限的所属组x位置发现被是标识s,那么就是设置了它的SetGID属性,用ll /usr/bin/locate查看locate命令文件的属性,可见
-rwxr-sr-x 后面省略
与SUID不同,SGID即可针对文件也可针对目录来设置。
SGID权限对于文件而言
- SGID权限仅对二进制程序(binary program)有效;
- 执行者对于该程序需要有x的可执行权限;
- 本权限仅在执行该程序的过程中有效;
- 执行者在执行该程序时自动获得了该程序的属组身份。(一字之差,执行者相当于临时加入到了该文件的所属组当中)
同样举个例子,该usr/bin/locate程序执行的时候,会去查询var/lib/mlocate/mlocate.db这个文件的内容,而molcate.db这个文件的权限为
ll /usr/bin/locate /var/lib/mlocate/mlocate.db #查询locate命令文件 和 mlocate.db文件的权限
-rwxr-sr-x 1 root slocate ……大小和修改日期省略…… /usr/bin/locate
-rw-r----- 1 root slocate ……大小和修改日期省略…… /var/lib/mlocate/mlocate.db
可见该mlocate.db文件权限为640,其他人没有任何权限,所属组有读权限。如此一来,当一般用户去执行locate命令的时候,由于SGID权限的存在,其临时加入到了locate命令的所属组slocate中,因此有了对文件mlocate.db的读权限,可以对其进行查询操作了!
SGID权限对于目录而言
- 普通用户对此目录有r和x权限,即可以ll和cd时,才能进入到该目录;
- 普通用户在此目录下的有效组(effective group)将会变成该目录的所属组;
- 若普通用户在此目录下有w权限,则其在该目录中新建文件的所属组就是这个目录的所属组。
设定SGID权限
chmod 2755 文件或目录
或
chmod g+s 文件或目录
取消SGID权限
chmod 755 文件或目录
或
chmod g-s 文件或目录
SBIT
SBIT为StickyBit,称为粘着位权限,若在目录的权限中其他人的x属性被替换成了s,则该目录具有SBIT权限,其作用如下:
- SBIT只针对目录有效,针对文件无效;
- 普通用户对该目录具有w和x的权限,即具有写入权限;
- 当普通用户在该目录创建文件或目录后,仅自己和root有权限来删除该文件。
举例,如果用户甲对于目录A是其他人或者所属组的身份,且有该目录的w权限,即用户甲可以在目录A中对他人所建立的目录和文件进行删除、移动、重命名、修改等操作。然而,一旦给A目录加上了SBIT权限,则用户甲只能对自己创建的文件或目录进行删除、重命名、移动、修改等操作,而无法改动他人的文件或目录。当然,超级管理员root不受此限制。
比如/tmp目录,这里面放的是临时文件,且这里面用户只能删除修改自己创建的文件,用ll -d \tmp查看该目录权限,可见
drwxrwxrwt 15 root root 4096 修改时间省略 /tmp/
其他人的x权限替换成了t,表明其有SBIT权限。
设定SBIT权限
chmod 1755 文件或目录
或
chmod o+t 文件或目录
取消SBIT权限
chmod 755 文件或目录
或
chmod o-t 文件或目录
注意:
如果一个文件没有x权限,而强行赋予SUID,SGID和SBIT的话,那么也是无法生效的,其会显示为大写的S和大写的T,表示空的权限,无法奏效。比如用touch testfile,然后chmod 7666 testfile,然后ll test的话,会发现其权限显示为-rwSrwSrwT,表明SUID、SGID和SBIT全部没有生效!!
3 ACL权限
ACL是Access Control List的缩写,其目的是提供传统的owner、group、others的read、write、execute权限之外的具体权限设置,即针对单一用户、单一文件或单一目录来设置其r、w和x权限,对于需要特殊权限的状况非常好使。
一个最简单的例子莫过于,一个教学班级组假设有个存放资料文件的目录,老师自然是所有者,有rwx权限,可以放入课程资料和布置作业,学生自然是所属组,有rwx权限,可以看课件和提交作业,其他人则什么权限也没有—,因为你不想让随便什么人都能看到该文件,毕竟他没交学费不是,看起来很不错。可是,某天突然来了个视察的领导,或者旁听的学生他交了十分之一的学费,他要能看到该资料,但是不能修改,应该具有r-x权限,那要如何单独赋予这个用户r-x权限呢?这就要用到ACL权限设置了。
3.1 启动ACL
默认ACL都是开启的,但是查看一下以保万一。
mount # 查看挂载参数
显示如下
…省略…
/dev/sda5 on / type ext4 (rw,realtime,errors=remount-ro) # 这个挂载的根分区/的硬盘分区,这里是sda5分区
…省略…
/dev/sda7 on /home type ext4 (rw,realtime) # 这个挂载的是家目录/home的硬盘分区,这里是sda7分区
…省略…
接下来再
dumpe2fs -h /dev/sda5 # 查询根分区/对应分区hda2的详细信息
显示
……
Default mount options: user_xattr acl # 这里可以看到该分区是支持ACL的
……
同样用dumpe2fs -h /dev/sda7发现家目录所挂载的分区也是支持ACL的。
若要临时开启分区的ACL权限,可以
mount -o remount,acl / # 重新挂载根分区,并加入acl权限
若要永久开启分区的ACL权限,可以
vi /etc/fstab # 编辑开机自动挂载文件
在每个分区对应的options选项“defaults”改为“defaults,acl”即可。
3.2 查看acl权限的命令getfacl
用getfacl来查看文件或目录的ACL权限
语法:getfacl 文件或目录名
3.3 设置acl权限的命令setfacl
用setfacl来设置文件或目录的ACL权限
语法:setfacl [-bkRd] [{-mx} acl参数] 文件或目录
选项
-b 删除所有的ACL权限
-k 删除默认的ACL权限
-R 递归设定ACL权限,即该目录下的所有子目录也会具有ACL权限
-d 设置默认的ACL权限,只对目录有效,目录中新建的数据也会有此默认值
-m 设置后续的ACL权限给文件使用,不可与x合用
-x 删除后续的ACL权限,不可与m合用
示例:
先建个文件project作为英语教学班classEnglish的公共文件,其所有者为老师Wang,班里俩学生为李雷和韩梅梅,不管老师还是学生都能rwx该文件,但是外面其他人对该文件没有任何权限—。
touch project # 新建文件project,用mkdir project新建目录也是一样的,这里只是用文件来做示例
ll project # 查询该新建文件的权限,发现其为rw-r--r--,即755权限,显示如下
-rw-r--r-- 1 meiguanhua meiguanhua 0 12月 23 10:33 project
useradd WangLS # 添加新用户WangLS,王老师
useradd LiLei # 添加新用户LiLei,学生李雷
useradd HanMeiMei # 添加新用户HanMeiMei,学生韩梅梅
groupadd classEnglish # 添加用户组classEnglish,英语课程
gpasswd -a LiLei classEnglish # 将LiLei拉到classEnglish组
gpasswd -a HanMeiMei classEnglish # 将HanMeiMei拉到English组
chown WangLS:classEnglish project # 将project文件的所有者变为WangLS,所属组变为classEnglish
ll project # 查询该新建文件的权限,发现其所有者变为了WangLS,所属组变为了classEnglish
-rw-r--r-- 1 WangLS classEnglish 0 12月 23 10:33 project
chmod 770 project # 修改文件的权限,让老师和学生都能rwx读写改,其他人什么都没有
ll project # 查看下权限设置好了没有
-rwxrwx--- 1 WangLS classEnglish 0 12月 23 10:33 project*
现在来了个旁听生露西,她要用ACL来单独设定只有r和x的权限,但是没有w的权限,用“u:用户:权限”的格式来设置。
useradd Lucy # 再添加个旁听的学生露西,给她额外设置ACL权限
setfacl -m u:Lucy:rx project # 设置Lucy用户对project文件拥有r和x的ACL权限
ll project # 查询该文件的属性,发现权限后面多了个加号“+”,表明其有额外的ACL权限
-rwxrwx---+ 1 WangLS classEnglish 0 12月 23 10:33 project*
getfacle project # 查看该文件的ACL权限,显示如下,其中“user:Lucy:r-x”单独标明了Lucy的ACL权限
# file: project
# owner: WangLS
# group: classEnglish
user::rwx
user:Lucy:r-x
group::rwx
mask::rwx
other::---
如果要给用户组来设置ACL权限,那么直接用“g:用户组:权限”的格式就好了,比如来了个教学督导组,给他们添加ACL权限,开放所有权限
groupadd supervisers # 添加督导组
setfacl -m g:supervisers:rwx project # 设置督导组拥有至高无上的权限
getfacl project # 查看下有没设好,显示的“group:supervisers:rwx”表明了督导组的ACL权限
# file: project
# owner: WangLS
# group: classEnglish
user::rwx
user:Lucy:r-x
group::rwx
group:supervisers:rwx
mask::rwx
other::---
getfacl显示的信息非常好理解,文件名、所有者、所属组、所有者权限、ACL用户权限、所属组权限、ACL用户组权限、其他人权限,实际上,如果给很多用户和很多组设置了ACL权限,那么这里所看到的就跟个表格一样逐行列出了他们的权限。
但是“mask:rwx”这个是啥玩意儿?这个“mask:rwx”其实表示的是最大有效权限。
3.4 最大有效权限与删除ACL权限
mask表示的最大有效权限的意思是,我们赋给用户或者组的ACL权限,只有跟最大有效权限做逻辑与操作后,才是用户或组的真正有效ACL权限。
如果mask是rwx,那么给了用户或者组不管什么ACL权限,他们都是有效的。
如果mask是—,那么不管给了用户或者组什么ACL权限,他们都是无效的。
如果mask是r-x,那么即便给了用户ACL权限为rwx,那么rwx和r-x相与后为r-x,实际上该用户也只有r-x的权限。
可用“m:权限”格式来设置最大有效权限,如:
setfacl -m m:rx project # 将mask最大有效权限设置为rx
getfacl project # 查看ACL权限,显示如下:
# file: project
# owner: WangLS
# group: classEnglish
user::rwx
user:Lucy:r-x
group::rwx #effective:r-x
group:supervisers:rwx #effective:r-x
mask::r-x
other::---
可见,该文件的最大有效权限由rwx变成了r-x,同时在其所属组权限,和ACL组权限后面出现了#effective:r-x表明此时有效权限并非设定的rwx,而是r-x了!
若要删除ACL权限,那么直接用
setfacl -x u:用户名 文件或目录名 # 删除用户对文件的ACL权限
setfacl -x g:组名 文件或目录名 # 删除用户组对文件的ACL权限
若要删除文件所有的ACL权限,即一股脑清除,那么用
setfacl -b 文件或目录名
对于目录而言,若想要其所有子文件和子目录都拥有该ACL权限,则加上-R递归设置选项,若想要其新建的子文件都有该ACL权限,则加上-d默认选项,即可,比如:
setfacl -m d:u:用户名:权限 -R 目录名 # 递归且默认
4 sudo权限
4.1 sudo权限
- root把本来只能由root执行的命令赋予普通用户执行
- sudo的操作对象是系统命令
临时用root权限做一些事情,比如设置root的密码,查看修改一些配置文件,开启关闭ssh服务等,可以用sudo命令来做。
示例:
sudo vim /etc/shadow # 查看用户密码文件shadow
sudo /etc/init.d/ssh start # 开启ssh服务
sudo passwd root # 修改root密码
4.2 sudo使用
在root登陆状态下,用
visudo
实际上就是打开并修改配置文件/etc/sudoers
vim /etc/sudoers
来给普通用户赋予执行某命令的权限。
这个文件里大部分都是注释,看到有这么一行
root ALL=(ALL:ALL) ALL
即表明root可以执行所有命令。
看到有这么一行
%sudo ALL=(ALL:ALL) ALL
表明sudo用户组也可执行所有命令,当然,你可以修改这个配置,添加一些行,单独设定某个用户或某个用户组只能执行某些命令,以限定其操作。