我可以让脚本始终以 root 身份执行吗?

Hap*_*per 28 linux root script ubuntu setuid

如何让脚本以 root 身份执行,不管是谁执行的?

我阅读了有关 setuid 的信息,但我不确定如何执行此操作。

我使用的是 Linux、Ubuntu 12.04 LTS。

spe*_*akr 30

真的要小心:脚本结合 setuid 是危险的!

首先,请查看此问题/答案,尤其是此答案和安全警告

如果您仍然想使用setuidset执行脚本,那么您可以编写一个简短的 C 程序作为包装器并setuid在编译后的二进制文件上设置位。

包装示例:

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}
Run Code Online (Sandbox Code Playgroud)

使用sudo此处提到)的另一种解决方案:

  1. 以 root 身份,防止对脚本的写(也可能是其他)访问:

    chown root /absolute/path/to/your/script.sh
    chmod 700 /absolute/path/to/your/script.sh
    
  2. 验证除了 root 之外没有人可以替换脚本,例如通过修改父文件夹的访问权限:

    chown root /absolute/path/to/your/
    chmod 755 /absolute/path/to/your/
    
  3. 在修改sudo的访问权限/etc/sudoersvisudo

    ALL ALL = (root) NOPASSWD: /absolute/path/to/your/script.sh
    

    有关设置的更多详细信息(例如,限制对特定用户或组的访问)可以在 sudoers 联机帮助页中找到。

之后,所有用户都可以在没有密码的情况下以 root 身份运行脚本:

sudo /absolute/path/to/your/script.sh
Run Code Online (Sandbox Code Playgroud)

这类似于使用上面的包装器/setuid 解决方案。

  • `sudo` 可用于授予所有用户访问特定程序(或脚本)的权限。从这个意义上说,它充当了一个花哨的 setuid 包装器。与编写自己的 setuid 包装器相比,这似乎通常是更好的选择。 (4认同)
  • 具体的危险不是很明显,但它们主要围绕环境。与大多数程序不同,shell 脚本的行为可以通过数十个环境变量进行显着改变,足以在没有广泛保护的情况下,这样的脚本很容易被诱骗执行任意代码。 (3认同)