文件夹拥有suid权限意味着什么?

文件夹拥有suid权限意味着什么?

我知道文件拥有 suid 权限意味着什么。这意味着当其他用户拥有该文件的执行权限时,他们将以该文件的所有者的身份执行。但是当文件夹拥有suid权限时意味着什么呢?我做了一些测试,该文件夹似乎没什么特别的。有人可以帮忙解释一下吗?谢谢。

我使用的是 Oracle Linux 7.6。

root:[~]# cat /etc/*release*
Oracle Linux Server release 7.6
NAME="Oracle Linux Server"
VERSION="7.6"
ID="ol"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="7.6"
PRETTY_NAME="Oracle Linux Server 7.6"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:7:6:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://bugzilla.oracle.com/"

ORACLE_BUGZILLA_PRODUCT="Oracle Linux 7"
ORACLE_BUGZILLA_PRODUCT_VERSION=7.6
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=7.6
Red Hat Enterprise Linux Server release 7.6 (Maipo)
Oracle Linux Server release 7.6
cpe:/o:oracle:linux:7:6:server
root:[~]#

以下是我在新安装的服务器上进行的测试。

root:[~]# pwd
/root
root:[~]# ls -lad /root
dr-xr-x---. 9 root root 4096 Aug 16 22:07 /root
root:[~]# mkdir test
root:[~]# ls -lad test
drwxr-xr-x. 2 root root 4096 Aug 16 22:07 test
root:[~]#
root:[~]# useradd a
root:[~]# passwd a
Changing password for user a.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
root:[~]# chmod u+s test
root:[~]#
root:[~]# su - a
[a@localhost ~]$ cd /root/test
-bash: cd: /root/test: Permission denied
[a@localhost ~]$ cd /root
-bash: cd: /root: Permission denied
[a@localhost ~]$ logout
root:[~]#
root:[~]# ls -lad /root
dr-xr-x---. 10 root root 4096 Aug 16 22:07 /root
root:[~]# chmod o+x /root
root:[~]#
root:[~]# su - a
Last login: Fri Aug 16 22:08:54 CST 2019 on pts/0
[a@localhost ~]$ cd /root/test
[a@localhost test]$
[a@localhost test]$ pwd
/root/test
[a@localhost test]$ ls -la .
total 8
drwsr-xr-x.  2 root root 4096 Aug 16 22:07 .
dr-xr-x--x. 10 root root 4096 Aug 16 22:07 ..
[a@localhost test]$ touch file1
touch: cannot touch ‘file1’: Permission denied
[a@localhost test]$ logout
root:[~]#
root:[~]# chmod o+w test/
root:[~]#
root:[~]# su - a
Last login: Fri Aug 16 22:09:31 CST 2019 on pts/0
[a@localhost ~]$
[a@localhost ~]$ cd /root/test
[a@localhost test]$ touch file1
[a@localhost test]$ ls -la
total 8
drwsr-xrwx.  2 root root 4096 Aug 16 22:11 .
dr-xr-x--x. 10 root root 4096 Aug 16 22:07 ..
-rw-rw-r--.  1 a    a       0 Aug 16 22:11 file1
[a@localhost test]$ mkdir folder1
[a@localhost test]$ ls -la
total 12
drwsr-xrwx.  3 root root 4096 Aug 16 22:11 .
dr-xr-x--x. 10 root root 4096 Aug 16 22:07 ..
-rw-rw-r--.  1 a    a       0 Aug 16 22:11 file1
drwxrwxr-x.  2 a    a    4096 Aug 16 22:11 folder1
[a@localhost test]$

正如您所看到的,用户a创建的文件和文件夹似乎/root/test没有继承其所有者和组。所有者和组是a而不是root。我的测试有问题吗?我是 Linux 新手。

答案1

根据 GNU 手册,这意味着在该目录中创建的文件(包括子文件夹)将继承其组和用户:

在某些系统上,目录的 set-user-ID 位对新子文件的所有权和新子目录的 set-user-ID 位具有类似的影响。这些机制减少了使用 chmod 或 chown 共享新文件的需要,使用户可以更轻松地共享文件。

答案2

这对您的 Oracle Linux 或任何 Linux 系统没有任何意义。

然而它可能在 FreeBSD 上有意义。引用自chmod(2)联机帮助页:

ISUID如果在目录上设置了模式(set UID),并且MNT_SUIDDIR 在文件系统的挂载中使用了该选项,则在此目录中创建的任何新文件和子目录的所有者都设置为与该目录的所有者相同。如果启用此功能,新目录将从其父目录继承该位。执行位将从文件中删除,并且不会将其提供给 root。此行为不会更改允许用户写入文件的要求,而只会更改文件创建后的最终所有者。组继承不受影响。

此功能设计用于通过 ftp、SAMBA 或 netatalk 为 PC 用户提供服务的文件服务器。它为 shell 用户提供了安全漏洞,因此不应在 shell 计算机上使用,尤其是在主目录上。 该选项需要SUIDDIR内核中的选项才能工作。仅 UFS 文件系统支持此选项。 有关 suid-dir 挂载选项的更多详细信息,请参阅 mount(8)。

这是不是在 NetBSD 或 OpenBSD 等其他 *BSD 系统上受支持。

相关内容