乐趣区

关于linux:Linux的3种特殊权限场景实战SUIDSGIDSBIT

3 种非凡权限

在 Linux 零碎中,有 3 种非凡权限,它们别离是 Setuid(SUID)、Setgid(SGID)和 Sticky Bit。

  1. Setuid 权限:通过 Setuid 权限,普通用户能够在执行某些特定程序时,领有与程序所有者雷同的权限。也就是说,该程序在执行时,会主动获取其所有者的权限,而不是执行者的权限。这通常用于一些须要 root 权限能力执行的程序。
  2. Setgid 权限:通过 Setgid 权限,执行者能够在执行某个程序时,取得该程序所属组的权限,而不是执行者所在的组的权限。通常,Setgid 权限用于一些须要共享拜访权限的目录,比方一个共享的工作目录。
  3. Sticky Bit 权限:Sticky Bit 权限通常用于某些共享的目录,它能够避免普通用户删除其余用户创立的文件。也就是说,一旦一个目录被设置了 Sticky Bit 权限,只有该目录的所有者和 root 用户能力删除该目录中的文件。这样能够防止其余用户意外删除其余用户创立的文件,保障了文件的安全性和完整性。

场景实战

  1. 假如有这样一个二进制程序 /usr/bin/passctl,这个程序只能被 root 用户执行,而咱们心愿普通用户也能执行该程序,然而又不想将该程序赋予 root 用户以外的用户特权。这时,咱们能够应用 Setuid 权限来实现该目标。
# 将该程序的所有者设置为 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 权限时,须要确保所设置的程序是平安的,防止潜平安危险。

  1. 假如有一个团队正在开发一个 Web 应用程序,并且他们都是在同一个 Linux 服务器上工作。为了便于团队成员之间共享文件和目录,创立了一个名为 “webapp” 的共享目录。此外,还心愿确保任何新文件或目录在创立时都具备与父目录雷同的权限。为了实现这个场景,能够应用 Setgid 权限来配置 “webapp” 目录。
# 创立演示的目录和用户、组
[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” 目录的组权限容许组中的任何成员拜访它。

  1. 假如咱们有一个名为“shared_directory”的公共目录,用于寄存团队成员之间共享的文件。咱们心愿所有团队成员都能够向该目录上传文件,但只有文件所有者和超级用户能力删除文件。
# 创立一个共享目录“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 权限来管制公共目录的删除操作,以确保只有目录所有者和超级用户能够删除其余用户的文件。

最初的总结

  • SUID 权限(Set User ID on execution):当一个可执行文件被设置了 SUID 权限时,当任何用户执行该文件时,该文件将以文件所有者的权限来运行,而不是执行者的权限。SUID 权限通常用于那些须要执行特定操作,而这些操作只能由具备特定权限的用户或组来执行的程序,例如 passwd 命令。这能够帮忙管理员在零碎中实现更严格的访问控制。
  • SGID 权限(Set Group ID on execution):当一个可执行文件被设置了 SGID 权限时,当任何用户执行该文件时,该文件将以文件所属组的权限来运行,而不是执行者的权限。与 SUID 权限相似,SGID 权限通常用于那些须要特定组的权限能力运行的程序。例如,在一个共享文件夹中,如果一个目录设置了 SGID 权限,则新创建的文件将继承目录的组权限,而不是创建者的组权限,这能够确保在组共享文件夹中的文件访问控制。
  • sticky bit 权限:当一个目录被设置了 sticky bit 权限时,只有目录的所有者、root 用户和文件的所有者能力删除目录中的文件。这种权限通常被用于公共目录,以避免其余用户意外删除或批改其他人上传的文件。当一个用户上传一个文件到该目录时,他或她只能批改或删除本人上传的文件,而不能批改或删除其他人的文件。

总而言之,言而总之,这些非凡权限能够帮忙管理员更好地管制对文件和目录的拜访,并确保零碎的安全性和稳定性。

本文转载于 WX 公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/zSWP-fr238SqmS-mkEQzFA

退出移动版