如何让用户以root权限运行脚本?

7

鉴于SUID shell脚本的危险性,在Linux中是否有更安全的方法给予具备root权限的脚本(bash、PHP)无需密码访问?

(Ubuntu 8.10)

9个回答

14

alt text


13
您可以考虑使用sudo
尽管不是“无密码”,但它不需要用户提供根密码。它还可以提供脚本使用的审计日志。
编辑:根据Chris的评论,有一个选项不需要为某些命令输入密码,请参见此处获取详细信息。也可以设置不会过于频繁地提示密码,即密码的一次输入可以用于在使用期间的多个命令。
顺便说一下,sudo已内置于Ubuntu中,并与Gnome很好地集成。当Ubuntu提示您输入密码以执行特权操作时,这就是隐藏在幕后的sudo。

sudo可以配置为不要求输入密码。我认为这被称为NOPASSWD,但请阅读sudoers手册以确保。 - C. K. Young
这很危险!不要这样做!请阅读有关suid root脚本安全问题的文章;sudo并不能解决其中任何一个。 - Kim Stebel
没错,一个有漏洞的脚本仍然是有漏洞的脚本。然而,sudo确实允许你以细粒度的方式限制谁可以运行它,并提供审计跟踪。 - frankodwyer
我强烈不同意Kim的观点:“sudo无法解决这些问题” - 请看下面我的评论。 - Daniel Papasian

7

5
我建议使用sudo。一定要适当加强sudoers文件; 是的,您可以允许执行某些命令而不需要请求密码。

4

将sudo配置为允许普通用户以提升的权限运行shell脚本,从安全角度来看并不比使脚本suid root更好。所有的陷阱仍然存在。 相反,您应该编写一个进行广泛安全检查的合适程序。一些需要考虑的要点:

  • 不要用C语言编写,否则您会同时伤到自己的两只脚。
  • 检查所有输入。
  • 尽早放弃权限。
  • 保持代码简短。

  • 好的观点,但它并不完全是没有优势。它以细粒度的方式限制了能够运行脚本的用户,并提供了审计跟踪(当然,也有其他方法可以实现这一点)。 - frankodwyer
    这并不是真的“没有任何改进”——除非有人建议尝试使用 #!/bin/sudo 或其他一些疯狂的想法来启动 shell 脚本。允许 suid-root shell 脚本(以 #! 开头的程序)执行存在竞争条件,这就是为什么现代系统上的 exec() 忽略那些文件的 suid-root 位。具体来说,如果计算机上存在 suid-root shell 脚本,则我可以在我拥有/可以写入的目录中创建一个链接到它的链接,运行它,在 /bin/sh 启动但在打开文件之前,移动链接并放置我的自己的文件。 - Daniel Papasian
    实际上,如果使用 #!/bin/sudo 启动 shell 脚本确实有效,那么它可能更安全,因为 sudoers 配置文件可以强制用户运行 /bin/sudo /path/to/a/specific/link -- sudoers 允许您限制参数,因此可以避免这种竞争条件(/bin/sudo /path/to/malicious/link 将被 sudoers 禁止)。 - Daniel Papasian

    2

    既然已经提到了sudo,您可能需要考虑根据自己的需求选择各种沙盒环境,例如jail或类似环境。


    1

    为了提高安全性,请考虑是否可以将操作作为特殊用户或组来执行,该用户或组具有所需的访问权限。然后,您可以使脚本对该用户或组设置setuid / setgid。


    请看我在Kim的帖子上方的评论 - 允许对以魔法#!开头的文件进行setuid存在竞争条件。 - Daniel Papasian

    1

    对于一个真正重量级的解决方案,考虑使用MAC(强制访问控制)系统,例如SELinux、AppArmor、TrustedBSD等。


    0
    如果使用情况是在VirtualBox下运行的机器,并且安全性并不是真正的问题,您只需要一个轻量级的屏障来防止自己犯错,那么怎么办呢?(那么安全性的论点就没有意义了,因为由于VirtualBox通过NAT隔离它,即使机器被外部人员入侵也无所谓,因为他们看不到它。)

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接