在没有可执行位的情况下启用 setuid 的目的是什么?

在没有可执行位的情况下启用 setuid 的目的是什么?

我正在尝试详细了解权限。我正在读关于设置用户标识以及它的用途。然而,这个特殊的案例让我感到困惑。

我制作了一个小脚本,现在我已经设置了苏伊德脚本位如下。

chmod u+s ramesh

我看到权限设置如下。

-rwsrw-r--  1 ramesh ramesh   29 Sep 30 10:09 ramesh

现在,我相信使用 setuid 任何用户都可以执行该脚本。现在,我执行了命令

chmod u-x ramesh

它给了我许可,

-rwSrw-r--  1 ramesh ramesh   29 Sep 30 10:09 ramesh

现在,我明白了S表示没有可执行位的 setuid。也就是说,没有人可以执行这个文件。

所以我的问题是,设置的实际目的是什么?S有点有吗?我试图从示例的角度来理解设置这一点。

答案1

现在,我相信使用 setuid 任何用户都可以执行该脚本。

不完全的。要使每个用户都可执行该脚本,您只需设置a+rx权限:

chmod a+rx script

setuid 表示脚本始终以所有者的权限,也就是说,如果您有以下二进制文件:

martin@dogmeat ~ % touch dangerous
martin@dogmeat ~ % sudo chown root:root dangerous 
martin@dogmeat ~ % sudo chmod a+rx,u+s dangerous 
martin@dogmeat ~ % ll dangerous 
-rwsrwxr-x 1 root root 0 Sep 30 17:23 dangerous*

该二进制文件将始终以 root 身份运行,无论执行它的用户是谁。显然,这是危险的,您必须非常小心地使用 setuid,尤其是在编写 setuid 应用程序时。另外,您根本不应该在脚本上使用 setuid,因为它在 Linux 上本质上是不安全的。

现在,我明白 S 表示 setuid 没有可执行位。也就是说,没有人可以执行这个文件。

那么我的问题是,S位的设置有什么实际用途呢?我试图从示例的角度来理解设置这一点。

我认为没有实际目的,IMO 它只是权限位的可能组合。

答案2

让文件不可执行但 setuid 和/或 setgid 的目的之一是使用访问控制列表 (ACL) 只允许某些用户执行该文件。例如,如果您想使用 setuid root 运行命令,但您不希望每个人都能够运行该命令。如果您只希望某些用户或某些组能够运行它,您可以一般禁止执行,然后使用 ACL 允许有限执行。

以下示例采用一个虚构的命令,并使其通常不可执行但设置了 setuid,然后使用 ACL 允许 adm 组的成员运行它:

$ chown root.root privileged_command
$ chmod 4000 privileged_command
$ ls -l privileged_command
---S------ 1 root root 152104 Nov 17 21:15 privileged_command
$ setfacl -m g:adm:rx privileged_command

因此,根据文件权限,该文件是 setuid 但不可执行(甚至不可读取)。但是,访问控制列表向 adm 组的所有成员授予读取和执行权限。

如果 adm 组的成员执行该文件,它将在 ACL 授予的可执行权限下使用该文件具有的 setuid 权限执行。如果其他人尝试执行它,他们将收到权限被拒绝的错误。

在上述 setfacl 命令之后执行文件的目录列表将显示:

$ ls -l privileged_command
---Sr-x---+ 1 root     root     152104 Nov 17 21:15 privileged_command

这似乎表明 root 组对该文件具有读取/执行权限,但实际上只是表明存在一个提供读取/执行权限的 acl。

这是您可能希望将程序设置为 setuid 但(通常)不可执行的一个示例。

答案3

所有权限位都可以独立设置或清除。有些组合很常见,有些则没有实际用途。ls使用大写字母S表示“s没有x”,以强调这是一个奇怪的、可能是错误的设置。

如果文件不可被任何人执行,则其 setuid 和 setgid 位不相关。请记住,即使文件的传统 unix 权限没有x设置位,也可能存在允许某些用户或组执行该文件的 ACL。

在许多 Unix 变体(包括 Linux 和 Solaris)上,目录上的 setgid 位控制在该目录中创建的文件是否继承目录的组 ID(BSD 语义,在设置 setgid 位时使用)或进程的有效组 ID(System V 语义) ,当 setgid 位清零时使用)。

在 Solaris 上,不可执行的常规文件上的 setgid 位会激活强制锁定。强制锁定允许由fcntl锁机制是强制性的,即如果一个进程拥有锁而另一个进程没有使用任何锁,那么第二个进程将无法访问该文件。

相关内容