2

我有一个 setuid 程序 (getpwd),只有在 root 拥有时才能按预期运行。

-rwsr-xr-x 1 root root 7981 2011-11-17 18:28 getpwd*

换句话说,当用户“alice”在命令行上执行我的程序时,一切正常

程序在目录中打开一个文件/home/secure并将内容打印到屏幕上。

alice@devbox:/home/alice/tmp$ ./getpwd
setuid is working

但是,当我更改文件的所有权并设置 setuid 时:

chown secure:users getpwd
chmod 4755 getpwd

-rwsr-xr-x 1 secure users 7981 2011-11-17 18:28 getpwd*

以用户“alice”执行时,程序不会运行。

alice@devbox:/home/alice/tmp$ ./getpwd
cannot open file /home/secure/test ...

为什么会这样?

ls -ld /home/ /home/secure/
drwx--x--x 2 secure users 280 Nov 18 11:16 /home/secure/

ls -ld /home/secure/*
-rw------- 1 secure users 33 Nov 15 14:35 /home/secure/test
4

1 回答 1

3

如何确保只有用户“alice”可以运行secure 拥有的setuid 程序?

有两种可能的方法。一种只使用传统的 Unix 权限,另一种则使用新奇的 ACL。

传统的 Unix

创建一个新组;也许或与用户帐户ALICE明显不同的东西。alice确保aliceALICEin的成员group(5)。(vigr(8)是编辑文件的好方法。)设置程序group(5)的所有权并删除文件的全局执行权限。然后,只有和组的成员才能执行 setuid程序。getpwdsecure:ALICEsecureALICEgetpwd

如果alice只是可能更大的一群人的替身,那么也许命名该组SECURE。(大写只是方便我的描述。你不必拘泥于大写。)

新奇的 ACL

setfacl -m u:alice:x getpwd

setfacl(1)程序有点复杂,但它允许您创建比传统 Unix 权限复杂得多的权限。因为它们完全不同,所以我见过的大多数系统默认情况下都没有打开它们——这需要在挂载文件系统时acl选择。mount(8)您需要添加到需要额外权限acl的文件系统中。/etc/fstab(不过,您无需重新启动以使其可用;mount /file/system -oremount,acl只要文件系统已挂载就足够了——通常直到重新启动。)

我建议坚持使用传统的 Unix 方法。

于 2011-11-18T09:25:27.953 回答