作者:Cynthia番茄际_382 | 来源:互联网 | 2023-06-22 06:08
Linux文件特殊权限SetUID、SetGID和StickyBIT学习总结一、前言:前面用了三篇文章总结Linux基本权限、umask默认权限、ACL权限和sud
Linux 文件特殊权限SetUID、SetGID和Sticky BIT 学习总结
一、前言:
前面用了三篇文章总结Linux基本权限、umask默认权限、ACL权限和sudo授权,由于自身认知的关系,虽不尽全部,但也足够详细,记录下来所学到的一点一点,希望对看到本文的朋友有所帮助。
本篇总结Linux权限管理中的文件特殊权限 SUID、SGID和Sticky BIT。
二、文件特殊权限 SetUID、SetGID和Sticky BIT
2.1 SetUID(SUID)
2.1.1 SetUID是什么
- SetUID功能理解:
- 必须是可执行的二进制程序,通俗来讲就是命令;
- 命令执行者对该程序具有执行权限(x);
- 命令执行者在执行命令期间,身份变成所属者身份;
- SetUID只在程序执行过程中有效,程序执行结束即失效。
2.1.2 举例:普通用户 test 修改自身密码
- 查看用户文件 /etc/passwd 和 /etc/shadow 权限
[root@localhost ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1496 5月 1 12:52 /etc/passwd
[root@localhost ~]# ll /etc/shadow
----------. 1 root root 1190 5月 1 12:53 /etc/shadow默认情况,普通用户对两个文件只有读权限,不能修改文件
- 分别查看root用户和test用户 /usr/sbin/passwd 命令权限
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd
[root@localhost ~]# su - test
[test@localhost ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd普通用户test对于passwd命令是有执行权限(x)的,所以可以修改密码
[test@localhost ~]$ passwd
更改用户 test 的密码 。
为 test 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd: 所有的身份验证令牌已经成功更新。我们看到,密码修改成功。
- 我们来看看这个修改密码的过程都经历了什么
- test用户对 /usr/bin/passwd 命令拥有执行权限(x);
- /usr/bin/passwd 命令所属者执行权限为 “s”,说明具有SetUID权限。
- test 用户化身为 /usr/bin/passwd 命令的拥有者 root;
- root 是管理员,拥有最大权限,所以能够更改 /etc/shadow 文件;
- 修改完之后,所有者收回权限。
2.1.3 赋予SetUID
- 赋予格式:chmod u[+-]s 命令绝对路径
- 参数
- + :增加SetUID权限
- - :删除SetUID权限
- 举例:给 /usr/bin/vim 设置SetUID权限,并删除相应权限
[root@localhost ~]# ll /usr/bin/vim
-rwxr-xr-x. 1 root root 2324712 7月 24 2015 /usr/bin/vim
[root@localhost ~]# chmod u+s /usr/bin/vim
[root@localhost ~]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 2324712 7月 24 2015 /usr/bin/vim
[root@localhost ~]# chmod u-s /usr/bin/vim
[root@localhost ~]# ll /usr/bin/vim
-rwxr-xr-x. 1 root root 2324712 7月 24 2015 /usr/bin/vim
2.1.4 建议
- 当命令被设置 SetUID 权限后,命令执行者化身为root用户,就能使用该命令为所欲为,所以慎重赋予。
- 具体建议
- 控制关键目录的权限授予,比如“/”,“/usr/”等;
- 最好不要人为添加 SetUID权限;
- 按密码三原则设置密码,定期修改密码,比如三个月、六个月等;
- 定时检查非系统自带的 SUID权限 的文件。
2.1.5 检测 SUID 和 SGID 的脚本
- 建立系统自带 SUID 和 SGID权限的文件 suid.list
[root@localhost ~]# find / -perm -4000 -o -perm -2000 > suid.list
[root@localhost ~]# ls
anaconda-ks.cfg install.log install.log.syslog suidcheck.sh suid.list test
[root@localhost ~]# cat suid.list
/lib64/dbus-1/dbus-daemon-launch-helper
/sbin/netreport
/sbin/mount.nfs
/sbin/pam_timestamp_check
/sbin/unix_chkpwd
/bin/mount
/bin/umount
/bin/cgexec
/bin/su
/bin/cgclassify
/bin/ping6
/bin/ping
/usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
/usr/libexec/polkit-1/polkit-agent-helper-1
/usr/libexec/openssh/ssh-keysign
/usr/libexec/utempter/utempter
/usr/libexec/pt_chown
/usr/sbin/userhelper
/usr/sbin/usernetctl
/usr/sbin/postdrop
/usr/sbin/suexec
/usr/sbin/postqueue
/usr/bin/ssh-agent
/usr/bin/staprun
/usr/bin/gpasswd
/usr/bin/chage
/usr/bin/chsh
/usr/bin/passwd
/usr/bin/locate
/usr/bin/write
/usr/bin/wall
/usr/bin/at
/usr/bin/chfn
/usr/bin/ksu
/usr/bin/newgrp
/usr/bin/pkexec
/usr/bin/crontab
/usr/bin/sudo
- 写检测脚本,命名为 suidcheck.sh
[root@localhost ~]# vi suidcheck.sh 1 #!/bin/bash2 # Author:gaobailing (Email:375196239@qq.com)3 4 #搜索系统中的所有拥有SUID和SGID的文件,并保存在临时文件中5 find / -perm -4000 -o -perm -2000 > /tmp/setsuid.check6 7 #做循环,每次循环取出文件中的文件名8 for i in $(cat /tmp/setsuid.check)9 do10 #比对这个文件名是否在模版文件中11 grep $i /root/suid.list > /dev/null12 #如果在,不报错13 if [ "$?" != "0" ]14 #如果不在,则报错,将报错文件输出到日志文件,并在控制台打印出来15 then16 echo "$i isn't in suid.listfile" | tee -a /root/suid_log_$(date +%F)17 fi18 done19 # 删除临时文件20 rm -rf /tmp/setsuid.check
#手动给 /usr/bin/vim 赋予 SetUID权限
[root@localhost ~]# whereis vim
vim: /usr/bin/vim /usr/share/vim /usr/share/man/man1/vim.1.gz
[root@localhost ~]# ll /usr/bin/vim
-rwxr-xr-x. 1 root root 2324712 7月 24 2015 /usr/bin/vim
[root@localhost ~]# chmod u+s /usr/bin/vim
[root@localhost ~]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 2324712 7月 24 2015 /usr/bin/vim#运行脚本检测
[root@localhost ~]# ./suidcheck.sh
/usr/bin/vim isn't in suid.listfile。[root@localhost ~]# cat suid_log_2022-05-02
/usr/bin/vim isn't in suid.listfile#报错,系统中自带 SetUID权限的文件,不含/usr/bin/vim,所以输出到控制台,并写入了日志里面#收回 /usr/bin/vim 的 SetUID权限
[root@localhost ~]# chmod u-s /usr/bin/vim
[root@localhost ~]# ll /usr/bin/vim
-rwxr-xr-x. 1 root root 2324712 7月 24 2015 /usr/bin/vim
说明:SUID是比较重要的特殊权限,不要轻易给其他命令赋予,否则会出现无法预料的问题,请慎重。
2.2 SetGID(SGID)
- 针对文件
- 必须是可执行的二进制程序,通俗来讲就是命令;
- 命令执行者对该程序具有执行权限(x);
- 命令执行者在执行命令期间,组身份变成所属组身份;
- SetUID只在程序执行过程中有效,程序执行结束即失效。
- 设置粘着位命令格式
举例:
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 1668362 5月 2 03:26 /var/lib/mlocate/mlocate.db
[root@localhost ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 38464 3月 12 2015 /usr/bin/locate
- 我们来看看执行 locate命令 之后,都经历了那些:
- root用户对 /usr/bin/locate 命令拥有执行权限(x);
- /usr/bin/locate 命令所属组有执行权限为 “s”,说明具有SetGID权限。
- root 组化身为 /usr/bin/locate 命令的所属组 slocate;
- 所属组 slocate,对 /var/lib/mlocate/mlocate.db 有读权限;
- 所以root用户能够查看 /var/lib/mlocate/mlocate.db;
- 执行结束之后,所属组收回权限。
- 针对目录
- 普通用户对此目录必须有 r 和 x 权限,才能进入此目录;
- 普通用户有效组化身为此目录所属组;
- 普通用户对此目录有 w 权限,新建文件默认属组就是就是这个目录的属组
- 设置粘着位命令格式
举例:略(后期补充),如有需要,可以留言。
2.3 Sticky BIT (SBIT)
- 中文翻译:粘着位
- 有效范围:只针对目录有效
- 普通用户对此目录有 w 和 x 权限,即普通用户拥有写入权限
- 一旦设置粘着位,用户只能删除自己的文件,不能删除其他用户的文件
- 一旦没有设置粘着位,用户能删除自己的文件,其他用户也能删除。
- 设置粘着位命令格式
2.4 设定文件特殊权限
- 表示方法:
- 4 : 代表SUID
- 2 : 代表SGID
- 1 : 代表SBIT
[root@localhost tmp]# chmod 4755 test
[root@localhost tmp]# chmod 2755 test
[root@localhost tmp]# chmod 1755 test
[root@localhost tmp]# ll -d test
drwsr-sr-t. 2 root root 4096 5月 2 06:11 test
三、小结
- 知识点总结
- SUID、SGID、SBIT不要认为赋予;
- 命令执行者执行二进制程序过程
- 设置 SUID、SGID 和 SBIT
推荐阅读
Linux 权限管理_sudo授权 学习总结(三)
Linux 权限管理_ACL权限 学习总结(二)
Linux 权限管理_基本权限和umask默认权限 学习总结(一)
如果对你有所帮助,请点赞+评论+收藏,三连支持一下博主,感激不尽@