Ruby on Rails-如何以root身份运行bash脚本?

时间:2009-10-24 03:11:28

标签: ruby-on-rails

我想要做的是使用'button_to'&朋友们在linux服务器上启动不同的脚本。并非所有脚本都需要是root用户,但有些脚本将会运行“apt-get dist-upgrade”等等。

PassengerDefaultUser在apache2.conf中设置为www-data

我已经尝试从控制器运行脚本,这些脚本可以执行诸如写入文本文件等操作,只是为了让我知道我正在让Rails正确执行脚本。 (换句话说,我知道如何从控制器运行脚本)但我无法弄清楚如何运行需要root访问权限的脚本。有人能给我带头吗?

关于安全性的说明:感谢所有针对黑客攻击的警告。但是,您不需要放松任何睡眠,因为A)无法从公共互联网访问webapp,它只能在私有内部网上访问,B)应用程序受密码保护,而C)因为用户不会能够提供自定义输入,只从表单中进行选择,该表单将作为变量传递给脚本。但是,因为我说这并不意味着我无视您的安全建议 - 我会在设计中非常仔细地考虑它们。

1 个答案:

答案 0 :(得分:6)

你应该使用setuid位来实现没有sudo的相同功能。但是你不应该运行Bash脚本。 Setuid比sudo更安全。使用sudo或setuid,您正在以root身份运行程序。但只有setuid(在某些语言的帮助下)提供了一些额外的安全措施。

基本上,您将使用暂时允许作为所有者运行的脚本,而不是使用调用它们的用户。 Ruby和Perl可以检测脚本作为与调用者不同的用户运行的时间,并强制执行安全措施以防止不安全的调用。这称为污点模式。 Bash根本不会以污点模式运行。

污点模式基本上是通过声明来自外部源的所有输入不安全以便在传递给系统调用时使用。

设置

使用chmod将要运行的脚本的权限设置为4755,并将其所有者设置为root:

$ chmod 4755 script.rb
$ chown root script.rb

然后像往常一样运行脚本。 setuid位启动并运行脚本,就好像它是由root运行一样。这是临时提升权限的最安全方式。

请参阅关于safe levels and taint的Ruby文档,了解Ruby的卫生要求,以防止受污染的输入造成伤害。或者perlsec faq来了解在Perl中完成同样的事情。

再次。如果您在自动系统中以root用户身份运行脚本时已经死定。 不要使用Bash!使用Ruby或Perl代替Bash。污点模式迫使您认真对待安全问题,并可以避免许多不必要的问题。