我正在尝试通过执行以下操作使程序成为特权程序:
- sudo chown root
- sudo chmod u+s
因此,现在每当有人运行 时,该用户都将以 root 权限运行该程序。这在 Debian 中按预期工作。但是,当我在 Google 计算引擎上尝试使用 Ubuntu 20.0.4 LTS 时,它无法以 root 权限运行。
该程序的权限如下: -rwsr-xr-x 1 root 但出于某些原因,每当我在 Ubuntu 上运行它时,它都会以当前用户权限运行。在 debian 上,它以 root 身份运行(如 ps -elf 输出)。有人知道这是为什么吗?
答案1
这是 Ubuntu 的安全措施,内核会忽略苏伊德所有未编译的可执行文件(解释文件)上的位。
这可能是一个严重的安全漏洞,因为任何人都可以更改脚本并填充他想要的任何内容。
要做到这一点,了解风险;你必须用非解释性语言包装你的脚本,例如C。
您可以这样做;创建 C 文件 <path_to_to_your_prog>.c:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
setuid( 0 );
system("<path_to_your_script>.sh" );
return 0;
}
然后编译它:
gcc <path_to_to_your_prog>.c -o
<path_to_the compiled_prog>
然后设置正确的权限:
chmod 4755 <path_to_the compiled_prog> # note the suid set here
chown root:root <path_to_the compiled_prog> <path_to_your_script>.sh
chmod 700 <path_to_your_script>.sh
然后运行它:
<path_to_the_compiled_prog>
解决方案2: 首选
您可以添加一个新组并将其作为所有相关用户的次要组,然后将其添加到您的 sudoers 以便他们可以运行:sudo <script_path>.sh
然后设置正确的权限:750
和所有权root:<gid>
,这样他们就无法编辑它。