Linux系统文件的特殊权限—细讲 SUID

本文为Ubuntu Linux操作系统- 第十七期~~
上期回顾:“Ubuntu Linux—图形界面的应用详解
更多Linux 相关内容请点击👉“Linux专栏”~

在这里插入图片描述

在这里插入图片描述

前言

之前我们已经讲过基础的文件权限内容,感兴趣的可以点击👉博客 【Ubuntu Linux 文件、目录权限问题】查看,今天主要对里面的文件特殊权限SUID进行详细分析!!

SUID外观特征

  • 执行命令 ll /usr/bin/ps

输出结果:

-rwsr-xr-x. 1 root root 100208 Dec 24  2024 /usr/bin/ps

观察上面文件所有者的基本权限的特点,可以看出文件ps在原权限的基本权限x标志位被s标志所代替。

设置SUID的文件类型限制和功能

  • SUID 权限只对二进位程序(binary program)有效,也就是说任何非二进制文件设置SUID权限都是没有意义的!
  • 执行者对设置SUID的文件必须具有x 的可执行权限。
  • 时效性:

SUID权限仅在执行该程序的过程中有效。

  • 权限有效范围:

所有执行者在执行该程序时都具有和文件拥有者(owner)一样的权限。

SUID含义

文件仅有root用户可读且仅有root可以强制写入

  • 如下命令可知:
[root@localhost ~]# ll /etc/shadow
----------. 1 root root 1180 Dec 24 20:49 /etc/shadow

可以了解到,/etc/shadow文件是Linux系统中记录所有用户密码的文件,这个文件的权限是以这种形式出现的:“———. 1 root root”,不要认为对所有用户包括root都没有任何权限,表示的意思是指这个文件仅有root用户可读且仅有root可以强制写入

SUID的目的

让本来没有相应权限的用户运行这个程序时,可以利用这个程序访问该用户没有权限访问的资源。

一般用户(例如用户myuser)如何通过 passwd指令修改自己的密码

[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832  Dec  24  2024 /usr/bin/passwd
  • /usr/bin/passwd 文件具有SUID的功能,并且 /usr/bin/passwd是一个二进制程序。
  • 一般用户对该文件具有x权限。
  • /usr/bin/passwd中的 passwd具有SUID权限

由于SUID权限在一般用户(如myuser)执行passwd的过程中是有效的,即一般用户(如myuser)在使用passwd命令修改自己的密码时,可以暂时取得passwd拥有者(root)的权限。
这样,一般用户(如myuser)就可以修改/etc/shadow中自己的密码信息了!!!

SUID设置方法

  • 字符设置SUID方式:chmod u+s filename
  • 字符取消SUID方式:chmod u-s filename
  • 数字设置SUID方式: chmod 4xxx filename

就是在原来的基本权限的最高位前增加一位4
例如,若/usr/bin/cat原来的基本权限用数字表示是755chmod 4755 /usr/bin/cat 代表添加的SUID位。
数字设置法的前提是必须知道文件的原有权限才能设置,而字符设置法则不需要知道文件的原有权限。

实例1

利用vim文件编辑器,对root用户编辑文件是没有问题的,接下来利用该实例测试root用户外的其它用户能不能正常使用。

第一步:查询vim所在的位置

[root@localhost user1]# which vim
/usr/bin/vim

第二步:查询vim的基本权限

[root@localhost user1]# ls -l /usr/bin/vim
-rwxr-xr-x. 1 root root 2294208  Dec  24  2024 /usr/bin/vim

第三步:切换至myuser1用户,观察能否使用vim

[root@localhost user1]# su myuser1
[myuser1@localhost user1]$ vim filetest
E45: 'readonly' option is set (add ! to override)

通过以上操作可知:用户myuser1可以开启一个vim进程但是没有权限操作!

⚠️注意:

一个用户能否启动可执行文件或者一个程序启动相应的进程,是由该用户是否拥有x权限决定的。当用户myuser1对vim拥有x权限,才可以执行第三步启动进程vim filetest

第四步:查看进程vim的所有者

不要关闭正在使用vim的终端,另外打开一个新的终端,然后,按下面的命令进行操作,你在输出结果中就可以找到vim filetest,最后对照前面的步骤观察区别!!

[root@localhost ~]# ps -au | grep vim
myuser1  41478  0.0  0.4 151272  4920 pts/0  S+  22:27   0:00 vim filetest 

可以看到,使用进程vim filetest的所有者是用户myuser1,这个进程是存在的。

⚠️注意

上面操作所示,用户myuser1通过vim filetest命令启动一个进程号为41478的vim进程,那么该进程的所有者是用户myuser1
也就是说明:在Linux中启动一个程序或者进程,那么该进程的所有者就是进程的发起者!!

第五步:设置/usr/bin/vim的SUID权限

[root@localhost user1]# chmod  u+s  /usr/bin/vim
[root@localhost user1]# ls  -l  /usr/bin/vim
-rwsr-xr-x. 1 root root 2294208 Dec  24  2024 /usr/bin/vim

通过上面的命令可以看到:输出结果中root原有权限x位变成了s位
这时,再以普通用户myuser1的身份使用vim filetest就可以创建filetest文件了

[root@localhost user1]# su myuser1
[myuser1@localhost user1]$ vim filetest 

小结

Linux系统中,像passwd这类型的二进制文件一旦设置为SUID权限,普通用户只要运行这类文件,生成的进程所有者并不是启动这个进程的普通用户,而是该二进制文件的所有者

例如:

[root@localhost ~]#  ps -au | grep vim
root   5130  0.1  0.3 150088  6172 pts/0    S+   19:05   0:00 vim filetest
  • 可以看到,Vim设置了SUID后,进程的所有者不再是myuser1,而是root
  • 这就是为什么其他用户使用设置了SUID的二进制程序文件时,会拥有该文件所有者完全相同的权限的原因。

实例2

利用经常用的查询命令 cat

第一步:查看命令cat是否具有SUID权限

[root@openstack01 user1]# which cat
/usr/bin/cat
[root@localhost user1]# ls -l  /usr/bin/cat
-rwxr-xr-x. 1 root root 54080 Dec 24  2024 /usr/bin/cat

可以看到,/usr/bin/cat没有SUID权限

第二步:去掉文件filetest除root用户外其它用户的r权限

[root@openstack01 user1]# chmod 600 filetest | ls -l
-rw-------. 1 root root 17 Dec 24  20:50 filetest

可以看到,只有root用户对文件filetest具有r权限

第三步:切换到myuser1用户,使用cat命令测试是否可以查看filetest文件。

[myuser1@openstack01 user1]$ cat filetest
cat: filetest: Permission denied

可以看出,此时的myuser1用户是无法查看filetest文件的!

第四步:设置cat的SUID权限

注意我们没有修改 filetestd 的权限,也就是说,此时的文件filetest对root用户外的用户是没有r权限的。

[root@openstack01 user1]# chmod 4600  /usr/bin/cat | ll /usr/bin/cat
-rwsr-xr-x. 1 root root 54080 Dec 24  2024 /usr/bin/cat

这时,设置了cat的SUID权限,现在具有SUID权限了

第五步: 切换到myuser1用户,测试使用cat命令是否可以查看filetest文件

[myuser1@openstack01 user1]$ cat filetest
This is a test!

由于设置了/usr/bin/cat的 SUID权限,虽然myuser1用户对filetest文件没有r权限,但也可以查看filetest文件的内容了!!!
只要root用户可以用cat查看的文件,其它用户即使对这个文件没有r权限,当他使用cat命令查看这个文件时,系统会默认把权限临时识别成root用户,这样,myuser1用户当然就可以看filetest文件了。
⚠️注意:这样的设置会给系统带来安全隐患!!!

实操练习

检测并修改cp命令,跟上面步骤类似

[root@openstack01 user1]# ll /usr/bin/cp
-rwxr-xr-x. 1 root root 155176 Dec 24  2024 /usr/bin/cp  
#没有设置SUID

[root@openstack01 user1]#su myuser1
[myuser1@openstack01 user1]$ cp -p filetest filetest1
cp: cannot open ‘filetest’ for reading: Permission denied
#cp命令对普通用户没有权限


[myuser1@openstack01 user1]$ su root
which cp
alias cp='cp -i'
	/usr/bin/cp
[root@openstack01 user1]# chmod u+s /usr/bin/cp | ll  /usr/bin/cp
-rwsr-xr-x. 1 root root 155176 Dec 24  2024 /usr/bin/cp
# 切换root用户, 设置SUID权限

[root@openstack01 user1]# su myuser1   

[myuser1@openstack01 user1]$ cp -p filetest filetest1 

复制 filetestfiletest1成功!

SUID总结

  • SUID只对可执行的二进制文件起作用,设置shell脚本的SUID是没有作用的。这是因为shell script只是通过调用多个Linux二进制文件执行所形成的脚本而已!
  • SUID的权限部分取决于shell script所调用的二进制文件是否具有SUID权限,而不是shell script本身。
  • 当可执行的二进制文件设置了suid后,其属主位的可以执行权限x会变成s(小写),如果是大写S ,那么说设置的文件没有可执行权限,设置的SUID无效,这一点请读者自行通过设置filetest文件的SUID权限去测试就可知。
  • SUID的目的是能以所有者的身份运行这个二进制文件,因此,文件的SUID位也可能成一个安全漏洞,因此不要轻易设置。
  • SUID作用于文件属主,对目录设置SUID权限没有任何意义,因此不要对目录文件设置SUID权限。

Linux系统的文件特殊权限之SUID权限讲完了,明天再继续啦~~~
想要了解更多内容点击【练小杰的CSDN】!!!
今天星期三,明天星期四了,继续努力搬砖吧,各位!!😄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

练小杰

感谢支持!祝各位月入过万!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值