在Rails运行时提供参数

时间:2008-10-31 14:35:00

标签: ruby-on-rails ruby cryptography arguments

我正在寻找一种方法在运行时为rails项目上的ruby提供参数。本质上,我们的项目使用公钥加密来加密一些敏感的客户端数据,我们希望能够在运行时为私钥文件提供密码。

3 个答案:

答案 0 :(得分:3)

任何Ruby脚本都可以通过ENV哈希访问本地环境变量。

puts ENV['PATH']

所以对于任何posix系统(Linux,Unix,Mac OS),您只需在调用脚本时设置它,如下所示:

MY_ARG=supersecret ruby script.rb

同样对rails也有效。如果您将puts ENV['MY_ARG']放在environment.rb中并​​启动服务器:

$ MY_ARG=supersecret mongrel_rails start
** Starting Mongrel listening at 0.0.0.0:3000
** Starting Rails with development environment...
supersecret
** Rails loaded.
** Loading any Rails specific GemPlugins
** Signals ready.  TERM => stop.  USR2 => restart.  INT => stop (no restart).
** Rails signals registered.  HUP => reload (without restart).  It might not work well.
** Mongrel 1.1.5 available at 0.0.0.0:3000
** Use CTRL-C to stop.

在我看来,环境变量是迄今为止最简单的解决方案。

答案 1 :(得分:1)

将密码放入chmod的只能由Web服务器用户读取的文件中有什么问题?

答案 2 :(得分:1)

一种简单的方法是创建一个Rails插件,在其'init.rb'中使用'gets'来获取参数。请允许我编写一个快速代码示例:

创建一个目录:'$ railsRoot / vendor / plugins / startup_args / lib'

创建一个对象以在'$ railsRoot / vendor / plugins / startup_args / lib / startup_args.rb'中存储参数数据:

module StartupArgs
 @@argHash = {}

 def self.setArg(key, value)
  @@argHash[key.to_sym] = value
 end

 def self.getArg(key)
  return @@argHash[key.to_sym]
 end
end

将StartupArgs模块加载到Rails项目的命名空间中,并使用'$ railsRoot / vendor / plugins / startup_args / init.rb'中的参数填充它:

require "startup_args"

promptString = "Enter arg name (type nothing to continue):"

puts promptString
while (newArg = gets.chomp) != ""
 puts "Enter value for '#{newArg}':"
 newVal = gets.chomp
 StartupArgs.setArg(newArg, newVal)

 puts promptString
end

现在,在Rails项目的启动过程中,它将尝试从控制台获取键值对。这些对将存储在global-namespace对象StartupArgs中以供以后访问(通过'StartupArgs.getArg()')。

如果您预计您的Rails项目可能部署在守护程序在启动时无法访问控制台的情况下,您可以从命名管道而不是控制台的标准输入中读取。

更进一步,您可以删除'init.rb'的所有部分,除了'require'语句,并添加一个执行此设置的操作到控制器,该控制器将相关参数作为Web上的帖子。确保配置Rails以防止将可能敏感的参数(例如密码)输入到记录访问或错误的日志文件中(特别是如果它可能用作HTTP GET,并在URL中包含参数)。

(如果您将其他Rails操作配置为忽略请求,直到安装操作已将适当的参数存储到全局对象,您将获得与上述系统相同的效果。)

Micah的注释:我没有直接在你的帖子上发表评论的声誉,所以我会在这里加入我的评论。考虑一个从不要求在文件系统中表示密码的系统可能有几个原因。例如,开发人员可能正在计划可以部署在不同操作系统和不同环境中的Rails项目。如果开发人员确定可能存在管理员或root用户可能遭到入侵,无法信任或无法要求签署机密性和安全性协议的情况,则开发人员可能会决定添加将密码放入内存的其他模糊处理只是(为了要求稍微安全的系统或稍微更聪明的攻击来窃取密码)。也许它可以被认为是相对成本的问题:在低成本的情况下,密码可以以需要更昂贵的知识的方式隐藏以便检索。