在Linux系统中,有3种特殊权限,它们分别是Setuid(SUID)、Setgid(SGID) 和 Sticky Bit。
# 将该程序的所有者设置为root用户,并将该程序的权限设置为可执行,但不允许其他用户执行该程序
chown root /usr/bin/passctl
chmod 700 /usr/bin/passctl
# 设置Setuid权限,以便普通用户执行该程序时可以获得与root用户相同的权限
chmod u+s /usr/bin/passctl这时候,该程序将以root用户的身份运行,并获得与root用户相同的权限了。比如有一个普通用户tantianran,那么该用户就可以像下面这样运行该程序啦!
/usr/bin/passctl注意,在实际工作中设置Setuid权限时,需要确保所设置的程序是安全的,避免潜安全风险。
# 创建演示的目录和用户、组
[root@workhost ~]# mkdir -p /data/tmpdir/webapp
[root@workhost ~]# chmod 775 /data/tmpdir/webapp/
[root@workhost ~]# groupadd webappgroup
[root@workhost ~]# useradd webappdev
# 将 "webapp" 目录的所有者设置为 Web 应用程序的主要开发者,并将其所属组设置为 "webappgroup"。
[root@workhost ~]# chown webappdev:webappgroup /data/tmpdir/webapp
# 设置 "webapp" 目录的 Setgid 权限,这将导致任何新创建的文件或目录都将继承 "webapp" 目录的组权限。
[root@workhost ~]# chmod g+s /data/tmpdir/webapp
# 查看
[root@workhost ~]# ls -ld /data/tmpdir/webapp/
drwxrwsr-x 2 webappdev webappgroup 21 Apr 10 20:58 /data/tmpdir/webapp/
[root@workhost ~]# 如果权限中有小写字母s,则表示 Setgid 权限已经被设置
现在,团队成员可以在 "webapp" 目录中创建新文件和目录,并确保这些文件和目录都具有与 "webapp" 目录相同的组权限。例如,如果开发者tantianran在 "webapp" 目录中创建了一个名为 "main.go" 的文件。
[root@workhost ~]# usermod -g webappgroup tantianran
[root@workhost ~]# id tantianran
uid=1000(tantianran) gid=1001(webappgroup) groups=1001(webappgroup),1000(tantianran)
[root@workhost ~]#
[root@workhost ~]# su - tantianran
Last login: Mon Apr 10 20:55:24 CST 2023 on pts/0
[tantianran@workhost ~]$ cd /data/tmpdir/webapp/
[tantianran@workhost webapp]$ touch main.go
# 该文件的权限将如下所示:
[tantianran@workhost webapp]$ ls -l
total 0
-rw-r--r-- 1 tantianran webappgroup 0 Apr 10 20:58 main.go
[tantianran@workhost webapp]$ 注意到该文件的所属组为 "webappgroup",这是因为 "webapp" 目录设置了 Setgid 权限,导致该文件继承了组权限。此外,团队内其他成员也可以访问该文件,因为 "webapp" 目录的组权限允许组中的任何成员访问它。
# 创建一个共享目录“shared_directory”
[root@workhost ~]# mkdir /data/tmpdir/shared_directory
# 设置Sticky Bit权限
[root@workhost ~]# chmod +t /data/tmpdir/shared_directory
[root@workhost ~]# ls -ld /data/tmpdir/shared_directory/
drwxr-xr-t 2 root root 6 Apr 10 21:09 /data/tmpdir/shared_directory/
[root@workhost ~]#
# 创建两个测试用户账号“user1”和“user2”,并将它们添加到同一用户组
[root@workhost ~]# useradd user1
[root@workhost ~]# useradd user2
[root@workhost ~]# groupadd shared_group
[root@workhost ~]# usermod -aG shared_group user1
[root@workhost ~]# usermod -aG shared_group user2
[root@workhost ~]#
# 将共享目录“shared_directory”的所有权更改为“root”用户和“shared_group”用户组
[root@workhost ~]# chown root:shared_group /data/tmpdir/shared_directory/
# 将目录权限更改为“rwxrwxrwt”,这将允许所有团队成员上传文件到目录中,但只有文件所有者和超级用户可以删除文件:
[root@workhost ~]# chmod 1777 /data/tmpdir/shared_directory/
[root@workhost ~]# ls -ld /data/tmpdir/shared_directory/
drwxrwxrwt 2 root shared_group 6 Apr 10 21:17 /data/tmpdir/shared_directory/
[root@workhost ~]#
# 测试
[root@workhost shared_directory]# sudo -u user2 touch test.go
[root@workhost shared_directory]# ls -l
total 0
-rw-r--r-- 1 user2 user2 0 Apr 10 21:21 test.go
[root@workhost shared_directory]# sudo -u user1 rm -f test.go
rm: cannot remove ‘test.go’: Operation not permitted # 会收到一个错误消息,提示没有权限删除该文件:
[root@workhost shared_directory]# touch main.go
[root@workhost shared_directory]# sudo -u user1 rm -f main.go
rm: cannot remove ‘main.go’: Operation not permitted
[root@workhost shared_directory]# sudo -u user1 touch conf.json
[root@workhost shared_directory]# sudo -u user2 rm -f conf.json
rm: cannot remove ‘conf.json’: Operation not permitted
[root@workhost shared_directory]# 这个场景实战演示了如何使用Sticky Bit权限来控制公共目录的删除操作,以确保只有目录所有者和超级用户可以删除其他用户的文件。
总而言之,言而总之,这些特殊权限可以帮助管理员更好地控制对文件和目录的访问,并确保系统的安全性和稳定性。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。