关于Linux 系统上文件的特殊权限( SUID、SGID、STICKY ) 之前也知道些,可是过段时间又忘了,今天再次学习了这方面的知识,好记心不如烂笔头,还是写下来比较好。
SUID 简介
当一个可执行文件被设置了 SUID 属性时,其它用户执行此文件时,将以此文件的属主身份运行,设置方式为 “ chmod u+s file_name “,一个典型的例子就是 passwd
命令修改密码。我们知道 Linux 的用户可以执行 passwd 命令修改自己的密码,而用户的密码信息保存在文件 “etc/shadow”文件里,此文件的权限为 000,那为什么普通用户执行 passwd
命令修改密码时,也有权限写这个文件呢?
1.1 查看 /etc/shadow 文件权限
1 |
[root@redhat6 test]# ll /etc/shadow |
1.2 查看 passwd 脚本权限
1 |
[root@redhat6 test]# which 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 |
[root@redhat6 test]# cd / |
备注: /test 目录权限为 777。
1.3.2 编写测试脚本 1.sh
1 |
[root@redhat6 test]# cat 1.sh |
1.3.3 测试脚本 1.sh 权限和 log.txt 权限
1 |
[root@redhat6 test]# chmod 4755 1.sh |
备注:脚本 1.sh 的属主为 root,脚本内容是查看 log.txt 的内容, log.txt 的权限为 700,只有 root 用户才能查看。
1.3.4 以 usera 用户登陆测试
1 |
[root@redhat6 ~]# su - usera |
备注:虽然脚本 1.sh 已经标记 GUID,但当脚本执行到 cat 命令时,仍然报权限问题。
1.3.5 查看 cat 命令权限
1 |
[root@redhat6 test]# which cat |
1.3.6 给 /bin/cat 脚本加上 SUID
1 |
[root@redhat6 test]# chmod u+s /bin/cat |
1.3.7 切换到 usera 再次测试
1 |
[usera@redhat6 test]$ ./1.sh |
备注:给 /bin/cat 脚本加上 GUID 后,普通用户能够调用脚本 1.sh 查看 log.txt(700)的内容了。
SGID 简介
SGID 一般在目录上设置,在设置 SGID 属性的目录里创建的文件的 GID 会被默认设置成上组目录的GID,设置方式为 “chmod g+s directory”,下面演示下。
2.1 创建用户
1 |
[root@redhat6 /] |
2.2 创建目录
1 |
[root@redhat6 /]# mkdir -p /test/share_dir |
备注:也可以一步到位,使用 “chmod 2777 share_dir” 命令修改目录权限。
2.3 usera 登陆并创建文件
1 |
[root@redhat6 test]# su - usera |
备注:usera 创建的文件的 GID 默认被改为了 root。
2.4 userb 登陆并创建文件
1 |
[root@redhat6 test]# su - userb |
备注:userb 创建的文件的 GID 默认被改为了 root。
STICKY 位
STICKY 位主要是用来控制在共享目录下文件的删除权限的,假如在一个权限为 777 的共享目录下, usera 创建的文件可能被其它用户删除,显示这是不合理的,那么可以在这个目录下设置 STICKY 位,从而避免这种情况发生,典型的例子就是 /tmp 目录。
3.1 /tmp 目录权限
1 |
[userb@redhat6 share_dir]$ cd / |
备注:在 /tmp 目录下,用户只能删除自己的文件,而不能删除其它用户的文件,接下来再做个测试。
3.2 创建目录
1 |
[root@redhat6 test] |
备注:也可以使用命令 “chmod 1777 work_dir” 一步完成权限设置。
3.3 usera 创建文件
1 |
[root@redhat6 ~]# su - usera |
3.4 userb 创建文件
1 |
[root@redhat6 ~]# su - userb |
3.5 userb 尝试删除 usera 的文件
1 |
[userb@redhat6 work_dir]$ rm a.txt |
备注:当 userb 尝试删除目录 /test/work_dir 下 usera 的文件 a.txt 时,报权限问题。
参考
- http://molinux.blog.51cto.com/2536040/469523
- http://blog.chinaunix.net/space.php?uid=23370286&do=blog&id=2427160
原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/237885.html