查看原文
其他

Linux文件与目录管理(11)

Cloud研习社 Cloud研习社 2023-06-06

前面讲到的9位权限是Linux的基础权限,除此之外,Linux还有特殊权限。




SUID(Set UID)


通过S字符表示。查看文件属性时,如果有SUID权限,这个S会出现在基础权限的文件所有者x权限的位置,显示规则如下:

  • 如果用户对某个文件有可执行的权限,在添加suid权限以后,本来应该显示文件所有者权限x的位置会显示成小写的s。

  • 如果用户对某个文件没有可执行的权限,在添加suid权限以后,本来应该显示文件所有者权限x的位置会显示成大写的S。

suid,无论是用大S表示还是用小s表示,对应的数字表示法都是4。

好了,知道了suid的表示法,我们再来看看suid到底有什么作用。

在Linux系统中,所有的用户密码都记录在/etc/shadow中,我们来看这个文件的权限:

[root@studyclub attribute]# ll /etc/shadow
---------- 1 root root 1059 May 5 16:41 /etc/shadow

这个意思是任何用户都没有权限读、写、执行,这种情况下只有root用户才能操作(root用户有最高权限)。那么普通用户的密码也存放在里面,难道普通用户都不能修改密码了吗?当然不是,我们用passwd命令可以非常方便的修改密码。

咦~,好像有点颠覆认知,明明用户权限里设置都不能修改/etc/shadow文件,为什么还可以修改密码呢?这就是SUID的功能了。由于任何普通用户都可以使用passwd命令,那么任何人都对passwd拥有可执行的权限,我们再来看:

[root@studyclub attribute]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

从上面我们可以看到,passwd的拥有者和用户组都是root,普通用户运行passwd时,会暂时获得root的权限,这个时候,普通用户就可以修改/etc/shadow。

上面passwd的权限中有一个是s权限,这就是suid。如果普通用户使用cat查看/etc/shadow那肯定是不允许的,因为cat并不具有suid的权限。

我们总结一下suid的功能:

  • SUID权限只对二进制程序有效(对目录无效、对shell脚本也无效)
  • 用户对该二进制程序需要有可执行权限
  • 这个SUID的权限仅仅在运行程序的时候有效(run time)
  • 用户运行二进制程序的时候,会切换成二进制程序拥有者的身份(即获得二进制程序拥有者的权限)





SGID:(了解即可)


Set GID也是用s表示。查看文件属性时,如果有SGID权限,这个S会出现在基础权限的文件用户组x权限的位置,显示规则如下:

  • 如果用户组对某个文件有可执行的权限,在添加SGID权限以后,本来应该显示文件用户组权限x的位置会显示成小写的s。

  • 如果用户组对某个文件没有可执行的权限,在添加SGID权限以后,本来应该显示文件用户组权限x的位置会显示成大写的S。

SGID,无论是用大S表示还是用小s表示,对应的数字表示法都是2。

SGID不同于SUID,SGID既可以对文件起作用,也可以对目录起作用。

我们来看看效果(对于文件):

[root@studyclub attribute]# ll /usr/bin/locate
-rwx--s--x 1 root slocate 40520 Apr 11  2018 /usr/bin/locate

locate 这个程序就是通过查找 /var/lib/mlocate/mlocate.db 这个文件来查找用户需要的内容的,我们看看mlocate.db文件的权限:

[root@studyclub attribute]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 714787 May 14 10:18 /var/lib/mlocate/mlocate.db

用户使用locate去查询mlocate.db的时候,或临时获取到slocate用户组的权限,因此能够读取到mlocate.db文件的内容。例如:

# 以james用户登录系统
[james@studyclub attribute]$ locate where# 查找含有where的文件
/usr/bin/whereis
/usr/lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/media/rc/keymaps/rc-msi-tvanywhere-plus.ko.xz
/usr/lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/media/rc/keymaps/rc-msi-tvanywhere.ko.xz
/usr/share/bash-completion/completions/whereis
/usr/share/man/man1/whereis.1.gz
/usr/share/vim/vim74/indent/sqlanywhere.vim
/usr/share/vim/vim74/syntax/sqlanywhere.vim


上面的查找过程解析:james可以使用locate命令,但是james对于mlocate.db文件来说,james属于其他用户,从上面的mlocate.db文件的权限看,james既没有读、写权限,也没有执行权限,但是怎么就能读取这个mlocate.db文件呢?其实这就是SGID的作用,locate查询mlocate.db文件的时候,会临时获取到slocate用户组的权限,然后读取mlocate.db文件,读取完成后,自动释放获取的slocate权限。

SGID对于目录也会起作用,我们来看实例(RHCE认证考试题):

在 /home 目录下创建名为 admins 的子目录,并按以下要求设置权限:

1)/home/admins 目录的所属组为 adminuser

2)该目录对 adminuser 组的成员可读可执行可写,但对其他用户没有任何权限,但 root 不受限制

3)在 /home/admins 目录下所创建的文件的所属组自动被设置为 adminuser

# 创建/home/admins 目录
[root@studyclub attribute]# mkdir -p /home/admins

# 添加adminuser组
[root@studyclub attribute]# groupadd adminuser
[root@studyclub attribute]# ls -ld /home/admins/# 查看默认的权限
drwxr-xr-x 2 root root 6 May 15 16:46 /home/admins/

# 设置/home/admins 目录的所属组为 adminuser
[root@studyclub attribute]# chgrp adminuser /home/admins/
[root@studyclub attribute]# ls -ld /home/admins/# 验证设置结果
drwxr-xr-x 2 root adminuser 6 May 15 16:46 /home/admins/

# 设置adminuser 组的成员可读可执行可写,root用户可读可写可执行,其他用户没有任何权限
[root@studyclub attribute]# chmod 770 /home/admins/

# 设置SGID,让用户在 /home/admins 目录下所创建的文件的所属组自动被设置为 adminuser
[root@studyclub attribute]# chmod 2770 /home/admins/


总结SGID的作用:

  • 对于文件:就是让命令的执行者拥有和命令的所有者(一般为root)同样的身份和权限。

  • 对于目录:让不同的人在设置SGID的目录下创建的文件属于相同的用户组,从而可以互相共享文件的权限。




Sticky Bit:(了解即可)


Sticky Bit,SBIT目前只针对目录有效,对于文件无效。使用字母T表示。很少用。

典型案例:

[root@studyclub attribute]# ll -d /tmp
drwxrwxrwt. 9 root root 204 May 15 11:30 /tmp

如果一个目录对所有人都放开了读写执行的权限,那么这个目录下的文件任何人都可以进行删除、修改、重命名等动作。如果加上sbit,那么在这个目录下创建的文件、子目录就只有创建文件、子目录的用户才能删除文件、子目录。

SBit这个功能了解即可,生产中也就/tmp这么一个例子。


SUIDSGIDsticky bit

表示字符

S

S

T

占据位置

文件拥有者权限的x位

文件所属组权限的x位

其他用户权限的x位

基本权限位有x

s

s

t

数字表示

4

2

1

完成数字表示

4000(000代表基本权限)

2000(000代表基本权限)

1000(000代表基本权限)

生效范围

对文件用户生效

对文件用户组生效

对其他用户生效

我们来看看这3个隐藏权限怎么设置:

[root@studyclub attribute]# touch testfile1
[root@studyclub attribute]# chmod 7644 testfile1
[root@studyclub attribute]# ll testfile1
-rwSr-Sr-T 1 root root 0 May 15 11:43 testfile1

上面的实例中,7664,其中7代表三个隐藏权限的和,第一个6代表基本权限中文件拥有者的各个权限之和,第二个6代表基本权限中文件用户组的各个权限之和,4代表其他用户基本权限之和。

实战练习:

  • 使用chmod 7755 testfile1命令修改文件权限,修改后的文件权限用字母表示出来应该是什么样的?如果是chmod 7644 testfile1修改权限,最终的结果应该怎么表示?
  • 使用umask为033和044,这两种情况下创建的目录和文件默认权限应该是什么?
  • SUID的作用是什么?
  • 当我需要查询/etc/passwd这个文件的权限(普通权限和隐藏权限)可以使用什么命令查询?
  • 如果有一天你要修改一个nginx.conf文件,但怎么都是不能修改,应该怎么排查?

新手应知:    尝鲜Rocky Linux
《Linux基础及进阶》:

    009 - Linux文件与目录管理(6)

    010 - Linux文件与目录管理(7)

    011 - Linux文件与目录管理(8)

    012 - Linux文件与目录管理(9)

    013 - Linux文件与目录管理(10)


看完本文有收获?请分享给更多人


推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存