本文为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原来的基本权限用数字表示是755,chmod 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
复制
filetest为filetest1成功!
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】!!!
今天星期三,明天星期四了,继续努力搬砖吧,各位!!😄


1603

被折叠的 条评论
为什么被折叠?



