0
点赞
收藏
分享

微信扫一扫

Linux 文件特殊权限


SUID:

当 s 出现在文件拥有者的 x 权限上时,就被称为 SETUID BITS 或 SETUID ,其特点如下:

  • 1.SUID 权限仅对二进制可执行文件有效
  • 2.如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
  • 3.本权限仅在执行该二进制可执行文件的过程中有效
  • 4.如果文件所有者没有执行权限, 则在此处使用大写的 S

实例:

[root@node01 ~]# ll /etc/shadow
---------- 1 root root 799 Nov 27 13:47 /etc/shadow
[root@node01 ~]#
[root@node01 ~]# cat /etc/shadow | head -1
root:$6$.Kpje8ue$HbRr7y12HEhEHN1Ma4p1y7VMbHz627ApYRNGF7qav.7VbQTgLr9/4rZYV.1KsjVFFO4hoyGCkI9hMLU6tztV70:18875:0:99999:7:::
[root@node01 ~]#
[root@node01 ~]# useradd test1
[root@node01 ~]# su - test1
[test1@node01 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[test1@node01 ~]$ exit
logout
[root@node01 ~]# chmod u+s /bin/cat
[root@node01 ~]# su - test1
Last login: Sat Nov 27 13:47:55 CST 2021 on pts/0
[test1@node01 ~]$ cat /etc/shadow | head -1
root:$6$.Kpje8ue$HbRr7y12HEhEHN1Ma4p1y7VMbHz627ApYRNGF7qav.7VbQTgLr9/4rZYV.1KsjVFFO4hoyGCkI9hMLU6tztV70:18875:0:99999:7:::
[test1@node01 ~]$ exit
logout
[root@node01 ~]# chmod u-s /bin/cat
[root@node01 ~]#

原本 普通用户 test1 是无法读取 /etc/shadow 内容的,但是当 root
给 cat 命令添加 SUID 权限之后,普通用户 test1 就可以通过 cat 命令来读取原来如法读的文件 /etc/shadow 中的内容了

SGID

当 s 标志出现在用户组的 x 权限时称为 SGID。SGID 的特点与 SUID 相同,我们通过 /usr/bin/mlocate 程序来演示其用法。mlocate 程序通过查询数据库文件 /var/lib/mlocate/mlocate.db 实现快速的文件查找。 mlocate 程序的权限如下:

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

很明显,它被设置了 SGID 权限。下面是数据库文件 /var/lib/mlocate/mlocate.db 的权限信息:

[root@node01 ~]# ll  /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 13064707 Nov 27 15:01 /var/lib/mlocate/mlocate.db

普通用户 tester 执行 locate 命令时,tester 就会获得用户组 slocate 的执行权限,又由于用户组 slocate 对 mlocate.db 具有读权限,所以 tester 就可以读取 mlocate.db 了。程序的执行过程如下图所示:

Linux 文件特殊权限_普通用户

除二进制程序外,SGID 也可以用在目录上。当一个目录设置了 SGID 权限后,它具有如下功能:

  • 用户若对此目录具有 r 和 x 权限,该用户能够进入该目录
  • 用户在此目录下的有效用户组将变成该目录的用户组
  • 若用户在此目录下拥有 w 权限,则用户所创建的新文件的用户组与该目录的用户组相同

实例

ll -d /mnt/sgid
chmod o+w /mnt/sgid
ll -d /mnt/sgid
userdel -r test1
useradd test1
su - test1
touch /mnt/sgid/test1
ll /mnt/sgid/test1
chmod g+s /mnt/sgid
userdel -r test2
useradd test2
su - test2
touch /mnt/sgid/test2
ll /mnt/sgid/test2

  • 实际操作演示

[root@node01 ~]# ll -d /mnt/sgid
drwxr-xr-x 2 root root 4096 Nov 27 13:39 /mnt/sgid
[root@node01 ~]# chmod o+w /mnt/sgid
[root@node01 ~]# ll -d /mnt/sgid
drwxr-xrwx 2 root root 4096 Nov 27 13:39 /mnt/sgid
[root@node01 ~]# userdel -r test1
useradd test1
su - test1
touch /mnt/sgid/test1[root@node01 ~]# useradd test1
[root@node01 ~]# su - test1
[test1@node01 ~]$ touch /mnt/sgid/test1
[test1@node01 ~]$ ll /mnt/sgid/test1
-rw-rw-r-- 1 test1 test1 0 Nov 27 22:35 /mnt/sgid/test1
[test1@node01 ~]$ chmod g+s /mnt/sgid
chmod: changing permissions of ‘/mnt/sgid’: Operation not permitted
[test1@node01 ~]$ exit
logout
[root@node01 ~]# chmod g+s /mnt/sgid
[root@node01 ~]# ll /mnt/sgid -d
drwxr-srwx 2 root root 4096 Nov 27 22:35 /mnt/sgid
[root@node01 ~]# userdel -r test2
userdel: user 'test2' does not exist
[root@node01 ~]# useradd test2
[root@node01 ~]# su - test2
touch /mnt/sgid/test2
ll /mnt/sgid/test2Last failed login: Fri Nov 26 07:15:17 CST 2021 from 47.110.150.3 on ssh:notty
There were 8 failed login attempts since the last successful login.
[test2@node01 ~]$ touch /mnt/sgid/test2
[test2@node01 ~]$ ll /mnt/sgid/test2
-rw-rw-r-- 1 test2 root 0 Nov 27 22:35 /mnt/sgid/test2
[test2@node01 ~]$

  • 总结

当 SGID 作用于普通文件时, 与 SUID 类似, 在执行该文件时,用户将获得该文件所属组的权限。当 SGID 作用于目录时,意义就非常重大了。当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用 SGID 修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。

SBIT

SBIT 目前只对目录有效,用来阻止非文件的所有者删除文件。比较常见的例子就是 /tmp 目录

  • 实例

userdel -r test1
userdel -r test2
userdel -r test3
rm -rf /mnt/sbit
mkdir -p /mnt/sbit
ll -d /mnt/sbit
chmod o+w /mnt/sbit
ll -d /mnt/sbit

useradd test1
useradd test2
useradd test3
su - test1
touch /mnt/sbit/test1
ll /mnt/sbit/test1
exit
su - test2
touch /mnt/sbit/test2
ll /mnt/sbit/test2
ll /mnt/sbit
rm -f /mnt/sbit/test1
ll /mnt/sbit

exit
chmod o+t /mnt/sbit
su - test3
touch /mnt/sbit/test3
ll /mnt/sbit
rm -f /mnt/sbit/test2

  • 实操演示

[root@node01 ~]# userdel -r test1
userdel: user 'test1' does not exist
[root@node01 ~]# userdel -r test2
userdel: user 'test2' does not exist
[root@node01 ~]# userdel -r test3
userdel: user 'test3' does not exist
[root@node01 ~]# rm -rf /mnt/sbit
[root@node01 ~]# mkdir -p /mnt/sbit
ll -d /mnt/sbit[root@node01 ~]# ll -d /mnt/sbit
drwxr-xr-x 2 root root 4096 Nov 27 22:44 /mnt/sbit
[root@node01 ~]# chmod o+w /mnt/sbit
[root@node01 ~]# ll -d /mnt/sbit
drwxr-xrwx 2 root root 4096 Nov 27 22:44 /mnt/sbit
[root@node01 ~]# useradd test1
[root@node01 ~]# useradd test2

[root@node01 ~]# useradd test3
[root@node01 ~]# su - test1
ll /mnt/sbit/test1[test1@node01 ~]$ touch /mnt/sbit/test1
[test1@node01 ~]$ ll /mnt/sbit/test1
-rw-rw-r-- 1 test1 test1 0 Nov 27 22:44 /mnt/sbit/test1
[test1@node01 ~]$ exit
logout
su - test2
touch /mnt/sbit/test2[root@node01 ~]# su - test2
Last failed login: Sat Nov 27 22:43:38 CST 2021 on pts/0
There were 10 failed login attempts since the last successful login.
[test2@node01 ~]$ touch /mnt/sbit/test2
[test2@node01 ~]$ ll /mnt/sbit/test2
-rw-rw-r-- 1 test2 test2 0 Nov 27 22:44 /mnt/sbit/test2
[test2@node01 ~]$ ll /mnt/sbit
total 0
-rw-rw-r-- 1 test1 test1 0 Nov 27 22:44 test1
-rw-rw-r-- 1 test2 test2 0 Nov 27 22:44 test2
[test2@node01 ~]$ rm -f /mnt/sbit/test1
[test2@node01 ~]$ ll /mnt/sbit
total 0
-rw-rw-r-- 1 test2 test2 0 Nov 27 22:44 test2
[test2@node01 ~]$ exit
logout
chmod o+t /mnt/sbit[root@node01 ~]# chmod o+t /mnt/sbit
[root@node01 ~]# su - test3
touch /mnt/sbit/test3
ll /mnt/sbit[test3@node01 ~]$ touch /mnt/sbit/test3
[test3@node01 ~]$ ll /mnt/sbit
total 0
-rw-rw-r-- 1 test2 test2 0 Nov 27 22:44 test2
-rw-rw-r-- 1 test3 test3 0 Nov 27 22:45 test3
[test3@node01 ~]$ rm -f /mnt/sbit/test2
rm: cannot remove ‘/mnt/sbit/test2’: Operation not permitted
[test3@node01 ~]$

  • 其他注意事项

用户对于目录有执行权限才运行进入,否则即使有写权限也是无法对该目录做写操作的

  • 实例

[root@node01 ~]# mkdir  /mnt/test
[root@node01 ~]# ll /mnt/test -d
drwxr-xr-x 2 root root 4096 Nov 27 14:11 /mnt/test
[root@node01 ~]# chmod o-x,o+w /mnt/test
[root@node01 ~]# ll /mnt/test -d
drwxr-xrw- 2 root root 4096 Nov 27 14:11 /mnt/test
[root@node01 ~]# su - test1
Last login: Sat Nov 27 13:48:08 CST 2021 on pts/0
[test1@node01 ~]$ cd /mnt/test
-bash: cd: /mnt/test: Permission denied
[test1@node01 ~]$ touch /mnt/test/test1
touch: cannot touch ‘/mnt/test/test1’: Permission denied
[test1@node01 ~]$

lsattr 与 chattr

  • 直接看代码

[root@node01 ~]# touch /mnt/test_attr
[root@node01 ~]# ll /mnt/test_attr
-rw-r--r-- 1 root root 0 Nov 27 22:48 /mnt/test_attr
[root@node01 ~]# lsattr /mnt/test_attr
-------------e-- /mnt/test_attr
[root@node01 ~]#
[root@node01 ~]# echo 'hello' >> /mnt/test_attr
[root@node01 ~]#
[root@node01 ~]# chattr +i /mnt/test_attr
[root@node01 ~]# echo 'hello' >> /mnt/test_attr
-bash: /mnt/test_attr: Permission denied
[root@node01 ~]# ll /mnt/test_attr
-rw-r--r-- 1 root root 6 Nov 27 22:48 /mnt/test_attr
[root@node01 ~]# lsattr /mnt/test_attr
----i--------e-- /mnt/test_attr
[root@node01 ~]#

getfacl 与 setfacl

[root@node01 ~]# su - test1
Last login: Sat Nov 27 22:44:43 CST 2021 on pts/0
[test1@node01 ~]$ ls /root
ls: cannot open directory /root: Permission denied
[test1@node01 ~]$ exit
logout
[root@node01 ~]# setfacl -m u:test1:rwx /root
[root@node01 ~]# su - test1
Last login: Sun Nov 28 18:33:40 CST 2021 on pts/0
[test1@node01 ~]$ ls /root/
history lxm mysql psycopg3 remove_docker test
[test1@node01 ~]$ exit
logout
[root@node01 ~]# getfacl /root/
getfacl: Removing leading '/' from absolute path names
# file: root/
# owner: root
# group: root
user::r-x
user:test1:rwx
group::r-x
mask::rwx
other::---

可以看到原来普通用户 test1 无法查看/root 目录下的文件,但是经过设置之后, 普通用户 test1 可以查看 /root 目录了



举报

相关推荐

0 条评论