我可以使脚本始终以root用户身份执行吗?


27

不管谁执行脚本,如何使脚本以root用户身份执行?

我读过有关setuid的文章,但不确定如何执行此操作。

我正在使用Linux,Ubuntu 12.04 LTS。


您在哪个Linux发行版上?甚至是Unix?
slhck 2012年

@slhck Linux,Ubuntu 12
HappyDeveloper 2012年

3
setuid不适用于脚本-出于安全原因,目前大多数* nix发行版已将其禁用。您可以设置它,但是它将被忽略。也许您可以详细说明您的实际问题,以便我们代替您解决此问题?这是什么剧本?为什么需要将它作为root用户执行?使用sudo替代品吗?
slhck 2012年

你试过了sudo -s吗?
Nam Phung 2012年

Answers:


29

务必小心:与setuid结合使用的脚本很危险!

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

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

包装器示例:

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

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

  1. 以root用户身份,阻止对脚本的写(或其他)访问:

    chown root /absolute/path/to/your/script.sh
    chmod 700 /绝对/路径/到/您的/script.sh
    
  2. 验证除root用户外没有其他人可以替换脚本,例如,通过修改父文件夹的访问权限:

    chown root / absolute / path / to / your /
    chmod 755 /绝对/路径/到/您的/
    
  3. 在修改sudo的访问权限/etc/sudoersvisudo

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

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

之后,所有用户都可以以root用户身份运行脚本,而无需输入密码:

sudo /absolute/path/to/your/script.sh

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


3
具体的危险不是很明显,但是它们围绕着环境大量旋转。与大多数程序不同,shell脚本的行为可以通过数十个环境变量进行显着更改,以至于在没有广泛保护措施的情况下,此类脚本很容易被诱骗执行任意代码。
Stephanie 2012年

1
您应该在该包装器中的系统调用之前添加对clearenv()的调用,以完全消除环境,从而避免恶意操作。kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Stephanie

@Stephanie我一定做错了,因为对于一个常见任务而言,所有这些看起来都太疯狂了。这就是我想要做的事:serverfault.com/questions/401405/...
HappyDeveloper

@HappyDeveloper对于setuid脚本不要太疯狂,因为安全性较差的脚本是所有设法运行该脚本的人的root路径。
Stephanie

4
sudo可用于授予所有用户访问特定程序(或脚本)的权限。从这个意义上讲,它充当了幻想的setuid包装器。似乎通常比编写自己的setuid包装器更好。
jjlin 2012年

4

最简单最安全的方法是在文件权限中使用SETUID位。这样,命令权限将提升为文件所有者权限。

为了防止脚本版本过高,请不要为所有人设置写权限。


0

我不知道这是否有用,但是,为了使脚本仅以root身份运行,您可以在脚本的第一行使用此shebang:

#!/bin/su root
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.