RHEL6 学习:文件特殊权限位学习( SUID、SGID、STICKY )

关于Linux 系统上文件的特殊权限( SUID、SGID、STICKY ) 之前也知道些,可是过段时间又忘了,今天再次学习了这方面的知识,好记心不如烂笔头,还是写下来比较好。

SUID 简介

当一个可执行文件被设置了 SUID 属性时,其它用户执行此文件时,将以此文件的属主身份运行,设置方式为 “ chmod u+s file_name “,一个典型的例子就是 passwd 命令修改密码。我们知道 Linux 的用户可以执行 passwd 命令修改自己的密码,而用户的密码信息保存在文件 “etc/shadow”文件里,此文件的权限为 000,那为什么普通用户执行 passwd 命令修改密码时,也有权限写这个文件呢?

1.1 查看 /etc/shadow 文件权限

1
2
[root@redhat6 test]# ll /etc/shadow  
----------. 1 root root 1621 Jul 21 18:10 /etc/shadow

1.2 查看 passwd 脚本权限

1
2
3
4
[root@redhat6 test]# which passwd  
/usr/bin/passwd
[root@redhat6 test]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 26980 Jan 29 2010 /usr/bin/passwd

备注:原来脚本 /usr/bin/passwd 的权限已设置 SUID 属性 ,所以当普通用户执行 /usr/bin/passwd 命令修改密码时,实际上是以 root 的身份执行这个脚本。

1.3 SUID 和 SHELL 脚本

这里做个简单的测试,来体验一下给可执行文件标记GUID的效果,先用 root 用户创建一个脚本 1.sh,这个脚本的任务是查看属于 root 的一个日志文件,然后给 1.sh 加上 GUID, 目标给普通用户执行这个脚本1.sh 并查看本身没有读权限的文件。

1.3.1 查看 /test 目录权限

1
2
3
[root@redhat6 test]# cd /  
[root@redhat6 /]# ll -d test
drwxrwxrwx. 4 root root 4096 Jul 22 22:05 test

备注: /test 目录权限为 777。

1.3.2 编写测试脚本 1.sh

1
2
3
[root@redhat6 test]# cat 1.sh  
#!/bin/bash
cat /test/log.txt

1.3.3 测试脚本 1.sh 权限和 log.txt 权限

1
2
3
4
5
[root@redhat6 test]# chmod 4755 1.sh  
[root@redhat6 test]# ll 1.sh
-rwsr-xr-x. 1 root root 31 Jul 22 22:05 1.sh
[root@redhat6 test]# ll log.txt
-rwx------. 1 root root 53 Jul 22 21:56 log.txt

备注:脚本 1.sh 的属主为 root,脚本内容是查看 log.txt 的内容, log.txt 的权限为 700,只有 root 用户才能查看。

1.3.4 以 usera 用户登陆测试

1
2
3
4
5
6
[root@redhat6 ~]# su - usera  
[usera@redhat6 ~]$ cd /test
[usera@redhat6 test]$ ll 1.sh
-rwsr-xr-x. 1 root root 31 Jul 22 22:05 1.sh
[usera@redhat6 test]$ ./1.sh
cat: /test/log.txt: Permission denied

备注:虽然脚本 1.sh 已经标记 GUID,但当脚本执行到 cat 命令时,仍然报权限问题。

1.3.5 查看 cat 命令权限

1
2
3
4
[root@redhat6 test]# which cat  
/bin/cat
[root@redhat6 test]# ll /bin/cat
-rwxr-xr-x. 1 root root 47976 Oct 5 2011 /bin/cat

1.3.6 给 /bin/cat 脚本加上 SUID

1
2
3
[root@redhat6 test]# chmod u+s /bin/cat  
[root@redhat6 test]# ll /bin/cat
-rwsr-xr-x. 1 root root 47976 Oct 5 2011 /bin/cat

1.3.7 切换到 usera 再次测试

1
2
3
4
5
6
[usera@redhat6 test]$ ./1.sh  
2012-07-22 21:33:22
2012-07-22 21:33:28
test
000
000

备注:给 /bin/cat 脚本加上 GUID 后,普通用户能够调用脚本 1.sh 查看 log.txt(700)的内容了。

SGID 简介

SGID 一般在目录上设置,在设置 SGID 属性的目录里创建的文件的 GID 会被默认设置成上组目录的GID,设置方式为 “chmod g+s directory”,下面演示下。

2.1 创建用户

1
2
[root@redhat6 /]# useradd usera  
[root@redhat6 /]# useradd userb

2.2 创建目录

1
2
3
4
5
6
7
8
9
[root@redhat6 /]# mkdir -p /test/share_dir  
[root@redhat6 test]# ll -d share_dir
drwxr-xr-x. 2 root root 4096 Jul 21 21:12 share_dir
[root@redhat6 test]# chmod g+s share_dir
[root@redhat6 test]# ll -d share_dir
drwxr-sr-x. 2 root root 4096 Jul 21 21:12 share_dir
[root@redhat6 test]# chmod 2777 share_dir
[[root@redhat6 test]# ll -d share_dir
drwxrwsrwx. 2 root root 4096 Jul 21 21:16 share_dir

备注:也可以一步到位,使用 “chmod 2777 share_dir” 命令修改目录权限。

2.3 usera 登陆并创建文件

1
2
3
4
5
6
[root@redhat6 test]# su - usera  
[usera@redhat6 ~]$ cd /test/share_dir
[usera@redhat6 share_dir]$ touch a.txt
[usera@redhat6 share_dir]$ ll
total 0
-rw-rw-r--. 1 usera root 0 Jul 21 21:15 a.txt

备注:usera 创建的文件的 GID 默认被改为了 root。

2.4 userb 登陆并创建文件

1
2
3
4
5
6
7
[root@redhat6 test]# su - userb  
[userb@redhat6 ~]$ cd /test/share_dir
[userb@redhat6 share_dir]$ touch b.txt
[userb@redhat6 share_dir]$ ll
total 0
-rw-rw-r--. 1 usera root 0 Jul 21 21:15 a.txt
-rw-rw-r--. 1 userb root 0 Jul 21 21:16 b.txt

备注:userb 创建的文件的 GID 默认被改为了 root。

STICKY 位

STICKY 位主要是用来控制在共享目录下文件的删除权限的,假如在一个权限为 777 的共享目录下, usera 创建的文件可能被其它用户删除,显示这是不合理的,那么可以在这个目录下设置 STICKY 位,从而避免这种情况发生,典型的例子就是 /tmp 目录。

3.1 /tmp 目录权限

1
2
3
[userb@redhat6 share_dir]$ cd /  
[userb@redhat6 /]$ ll -d /tmp
drwxrwxrwt. 14 root root 4096 Jul 21 20:10 /tmp

备注:在 /tmp 目录下,用户只能删除自己的文件,而不能删除其它用户的文件,接下来再做个测试。

3.2 创建目录

1
2
3
4
5
6
7
8
[root@redhat6 test]# cd /test  
[root@redhat6 test]# mkdir work_dir
[root@redhat6 test]# ll -d work_dir
drwxr-xr-x. 2 root root 4096 Jul 21 21:20 work_dir
[root@redhat6 test]# chmod o+t work_dir/
[root@redhat6 test]# chmod 1777 work_dir
[root@redhat6 test]# ll -d work_dir
drwxrwxrwt. 2 root root 4096 Jul 21 21:20 work_dir

备注:也可以使用命令 “chmod 1777 work_dir” 一步完成权限设置。

3.3 usera 创建文件

1
2
3
4
5
6
7
8
[root@redhat6 ~]# su - usera  
[usera@redhat6 ~]$ pwd
/home/usera
[usera@redhat6 ~]$ cd /test/work_dir
[usera@redhat6 work_dir]$ touch a.txt
[usera@redhat6 work_dir]$ ll
total 0
-rw-rw-r--. 1 usera usera 0 Jul 21 21:23 a.txt

3.4 userb 创建文件

1
2
3
4
5
6
7
[root@redhat6 ~]# su - userb  
[userb@redhat6 ~]$ cd /test/work_dir
[userb@redhat6 work_dir]$ touch b.txt
[userb@redhat6 work_dir]$ ll
total 0
-rw-rw-r--. 1 usera usera 0 Jul 21 21:23 a.txt
-rw-rw-r--. 1 userb userb 0 Jul 21 21:23 b.txt

3.5 userb 尝试删除 usera 的文件

1
2
3
[userb@redhat6 work_dir]$ rm a.txt  
rm: remove write-protected regular empty file `a.txt'? y
rm: cannot remove `a.txt': Operation not permitted

备注:当 userb 尝试删除目录 /test/work_dir 下 usera 的文件 a.txt 时,报权限问题。

参考

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

购买链接:https://item.jd.com/12405774.html

PostgreSQL实战
感谢支持!
0%