Linux 中的 Sticky Bit、SUID 和 SGID 示例
在本文中,我们解释了适用于名为 Sticky bit、SUID 和 SGID 的文件和目录的特殊权限。
粘性位仅适用于目录。如果用户想在某个目录中创建或删除文件/目录,他需要对该目录的写权限。对目录的写权限赋予用户创建文件的权限以及删除文件的权限。
/tmp 目录是临时文件/目录的目录。该目录具有所有三个级别的所有权限,因为所有用户都需要创建/删除他们的临时文件。但是由于用户对该目录有写权限,他们可以删除该目录中的任何文件。该文件的权限对删除没有任何影响。
但是在目录上设置了粘性位,任何人都可以在其中创建文件/目录,但只能删除自己的文件。不能删除其他用户拥有的文件。
粘性位 - 如何查看和设置
您可能会注意到t添加到 /tmp 目录的标记,这意味着为该目录设置了位。
$ ls -ld /tmp/
drwxrwxrwt 4 root root 4096 Aug 19 02:29 /tmp/
在 Linux 中,可以使用 chmod 命令设置粘性位。您可以使用 +t 标签添加和-t标签删除粘滞位。
$ chmod o-t dir1
$ ls -l
total 8
drwxr-xr-x 2 root root 4096 Aug 19 03:08 dir1
$ chmod o+t dir1
$ ls -l
total 8
drwxr-xr-t 2 root root 4096 Aug 19 03:08 dir1
或者,
$ chmod 1777 dir1/
$ ls -l
total 8
drwxrwxrwt 2 root root 4096 Aug 19 03:08 dir1
注意:在 Unix 风格的操作系统中,sticky bit 有不同的用途,但我们在这里不讨论它。
什么是 SUID 位以及如何设置它
当一个可执行文件运行时,它在执行它的用户的所有权下运行。这意味着当学生用户运行ls 命令时,相应的进程将在学生的所有权下运行。SUID 位(也称为设置用户 ID 位)会覆盖此行为。如果在某个程序上设置了 SUID 位,那么该程序将作为该文件的所有者运行,而不管是谁在执行它。
Linux 中的 passwd 命令设置了 SUID 位。
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 23420 Aug 3 2010 /usr/bin/passwd
这可以在权限的第三个字段中看到。代替“x”的“s”表示设置了 SUID 位。设置 SUID 位后,当普通用户(例如学生)运行 passwd 命令时,该命令以“root”的所有权运行,而不是以学生身份运行,因为 root 是该文件的所有者。此行为是必需的,因为密码存储在 /etc/shadow 文件中,该文件没有组或其他级别的权限。
$ ls -l /etc/shadow
-r-------- 1 root root 1027 Jul 13 21:56 /etc/shadow
您需要了解,出于安全原因,不能授予所有用户对该文件的读取或写入权限;否则,他们将读取/更改其他用户的密码。所以这会导致一个问题,如果用户没有对该文件的权限,那么他们将如何更改自己的密码?所以SUID位解决了这个问题。passwd 命令设置了SUID 位,所以普通用户执行该命令时,以root 的所有权运行,即passwd 命令的所有者。
如何设置和取消设置 SUID 位
请注意,SUID 位仅适用于文件。要在文件上设置 SUID 位,请使用chmod 命令,如下所示
$ ls -l
total 8
-rwxr--r-- 1 root root 104 Aug 19 01:26 hello.sh
$ chmod u+s hello.sh
$ ls -l
total 8
-rwsr--r-- 1 root root 104 Aug 19 01:26 hello.sh
也可以使用数值方法更改权限。假设如果一个文件的正常权限是 744,那么设置了 SUID 位,这些将变为 4744。SUID 位的值为 4。
$ ls -l
total 8
-rwxr--r-- 1 root root 104 Aug 19 01:26 hello.sh
$ chmod 4744 hello.sh
$ ls -l
total 8
-rwsr--r-- 1 root root 104 Aug 19 01:26 hello.sh
SGID Bit 如何处理文件和目录
与 SUID 位不同,SGID 位对文件和目录都有效,但在两种情况下它的含义不同。
关于文件:
对于文件,它与SUID 位具有相似的含义,即当任何用户执行设置了SGID 位的文件时,它将始终以该文件的组所有权执行,而不管是谁在运行它。例如,文件 /sbin/netreport 设置了 SGID 位,可以在组权限中的“s”而不是“x”中看到。
$ ls -l /sbin/netreport
-rwxr-sr-x 1 root root 6020 Oct 13 2010 /sbin/netreport
此文件具有根组的组所有权。所以当一个用户(比如学生)执行它时,那么相应的进程将不会拥有学生的组所有权,而是拥有根组的所有权。
在目录上:
现在让我们谈谈目录上的SGID。目录上的 SGID 用于创建协作目录。要了解目录上的 SGID 位,请考虑以下场景:
假设三个用户 jack、jones 和 jenny 正在一起从事某个项目。它们都属于一个名为 javaproject 的组。对于项目的过程,他们需要共享与项目相关的所有文件。他们都必须能够看到彼此的文件。这可以简单地通过在组级别提供读取权限来完成。此外,假设项目使用的目录是“/javaproject”。
这里出现了一个问题,当一个文件被创建时,它属于创建该文件的用户的主组。因此,当不同的用户在此目录中创建他们的文件时,这些文件将不具有 javaproject 组的组所有权。
我们针对我们的问题所做的就是将/javaproject 目录的组设置为javaproject 组,并在其上设置SGID 位。当在目录上设置 SGID 位时,在其中创建的所有文件和目录都具有与该目录关联的组的组所有权。这意味着在 /javaproject 目录上设置 SGID 位后,在该目录中创建的所有文件和目录都将具有“javaproject”组的组所有权。此外,这种行为是递归的,即在该目录中创建的目录也将设置 SGID 位。新目录的权限也将与 /javaproject 目录的权限相同。
可以使用 chmod 命令设置 SGID 位,如下所示:
$ ls -ld /javaproject
drwxrwxr-x 2 root javaproject 4096 Aug 19 02:33 /javaproject
$ chmod g+s /javaproject
$ ls -ld /javaproject
drwxrwsr-x 2 root javaproject 4096 Aug 19 02:33 /javaproject
现在当 jones 用户在这个目录中创建一个文件时,它是在 javaproject 组的组所有权下创建的。
$ touch /javaproject/jones1.txt
$ mkdir /javaproject/jones1dir
$ ls -l /javaproject/
total 12
drwxrwsr-x 2 jones javaproject 4096 Aug 19 02:38 jones1dir
-rw-rw-r-- 1 jones javaproject 0 Aug 19 02:37 jones1.txt
SGID 位对应的数值为 2。因此,要将 SGID 位数值相加,请使用以下命令:
$ ls -ld /shared/
drwxrwxr-x 2 root adm 4096 Aug 19 02:47 /shared/
$ chmod 2775 /shared/
$ ls -ld /shared/
drwxrwsr-x 2 root adm 4096 Aug 19 02:47 /shared/
感谢您阅读本文并参考sticky bit wiki 页面。
相关文章
- 网易革新之路:从 Linux 源开始(网易linux源)
- Linux尾部到头:掌握Linux系统新技能(linux从尾部)
- Linux虚拟主机:有效利用SSH连接(linux虚拟主机ssh)
- 安卓平板:解锁Linux潜能(安卓平板linux)
- Linux编程:提升技能的有效方式(linux用语言)
- 安装Linux:从RPM软件包中下载(linuxrpm下载)
- 的制作标题:制作多系统Linux启动U盘(多系统linux启动u盘)
- 命令使用Linux aplay命令播放声音(linuxaplay)
- Linux 下配置永久路由的指南(linux永久路由)
- 连接Linux:Git的使用方法(git连接linux)
- CentOS下关闭Linux防火墙的方法(关闭linux的防火墙)
- 据安装安装Linux:正确的内存条数量(linux内存条数)
- Linux推动全球通讯的发展(linux通讯)
- Linux的发展之路:探索分支的繁荣之道(linux的分支)
- 深入了解Linux信号量的使用(linux信号量的使用)
- Linux中运行Windows应用?尝试用Wine!(linux下的wine)
- Linux 监控系统邮件安全管理(linux监控邮件)
- 新硬盘上安装Linux系统(新硬盘安装linux)
- 让Linux帮助启动PHP服务(linux启动php)
- 命令Linux下使用Head命令显示文件头部内容(linux 中head)
- Linux燃爆车载娱乐,车机新时代必备!(linux车机)
- 如何下载和安装 Linux 安装镜像文件:简单教程(linux安装镜像文件)
- Linux 系统下C语言程序设计实践(linux下的c程序设计)
- mLinux 虚拟机磁盘扩容:LVM 助力优化存储(linux扩容lv)