Liunx学习笔记 - 04 - 文件与目录的隐藏权限、特殊权限和ACL权限

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用户组也可执行所有命令,当然,你可以修改这个配置,添加一些行,单独设定某个用户或某个用户组只能执行某些命令,以限定其操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值