SUID, SGID and sticky bit on linux
SUID
SUID 位是 Linux 系统中一个非常重要的安全特性。SUID 位允许用户在执行一个可执行文件时,以文件的拥有者的身份来运行。这意味着,即使文件的拥有者没有执行权限,也可以通过设置 SUID 位来让用户以文件的拥有者的身份来运行文件。
SUID 位通常用于系统管理任务,例如在 Linux 系统中设置密码时,需要以 root 用户的身份来运行 passwd 命令。如果没有 SUID 位,普通用户就无法以 root 用户的身份来运行 passwd 命令。
SUID 位的设置非常简单,只需要使用 chmod 命令即可。chmod 命令的语法为:chmod u+s filename。其中,u 表示文件的拥有者,s 表示 SUID 位。
chmod u+s /usr/bin/passwd
SUID 位的设置后,用户就可以以文件的拥有者的身份来运行该文件了。
passwd
SUID 的设置有几个前提:
- 该用户又对被执行的文件有可执行权限
- 该文件应该是二进制文件,shell 脚本是不能设置 SUID 的
SGID
Linux 系统中共享文件的方法是创建组。但对一个完整的文件共享环境而言,事情会复杂得多。
创建新文件时,Linux 会用默认的 UID 和 GID 来给文件分配权限。要想让其他用户也能访问文件,要么修改所有用户的安全权限,要么给文件分配一个包含其他用户的新默认属组。
如果想在大范围内创建并共享文件,这会很烦琐。幸好有一种简单的解决方法。
SGID 位对文件共享非常重要。启用 SGID 位后,可以强制在共享目录中创建的新文件都属于该目录的属组,这个组也就成了每个用户的属组。
因此,要创建一个共享目录,使目录中的所有新文件都沿用目录的属组,只需设置该目录的 SGID 位。
首先,使用 mkdir 命令创建希望共享的目录。然后,通过 chgrp 命令修改目录的默认属组,使其包含所有需要共享文件的用户。最后,设置目录的 SGID 位,保证目录中的新建文件都以 shared 作为默认属组。
为了让这个环境正常工作,所有组成员都要设置他们的 umask 值,使文件对属组成员可写。在这个例子中,umask 被改成了 002,所以文件对属组是可写的。完成这些步骤之后,组成员就能在共享目录下创建新文件了。跟期望的一样,新文件会沿用目录的默认属组,而不是用户账户的默认属组。现在 shared 组的所有用户都能访问这个文件了。
groupadd shared
mkdir testdir
chgrp shared testdir
chmod g+s testdir
umask 002
cd testdir
touch testfile