実行時に ruby on rails プロジェクトに引数を与える方法を探しています。基本的に、私たちのプロジェクトは公開鍵暗号化を使用して一部の機密クライアント データを暗号化し、実行時に秘密鍵ファイルにパスワードを提供できるようにしたいと考えています。
3 に答える
どの Ruby スクリプトも、ENV ハッシュを介してローカル環境変数にアクセスできます。
puts ENV['PATH']
したがって、任意の posix システム (Linux、Unix、Mac OS) では、次のように、スクリプトを呼び出すときに簡単に設定できます。
MY_ARG=supersecret ruby script.rb
同じことがレールにも当てはまります。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.
私の意見では、環境変数は最も簡単な解決策です。
Web サーバーのユーザーだけが読めるように chmod されたファイルにパスワードを入れることの何が問題になっていますか?
これを行う簡単な方法は、「init.rb」で「gets」を使用して引数を取る Rails プラグインを作成することです。簡単なコード サンプルを作成させてください。
ディレクトリを作成します: '$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 プロジェクトの起動プロセス中に、コンソールからキーと値のペアを取得しようとします。これらのペアは、('StartupArgs.getArg()' を介して) 後でアクセスできるように、グローバル名前空間オブジェクト StartupArgs に格納されます。
起動時にデーモンがコンソールにアクセスできないシナリオで Rails プロジェクトがデプロイされることが予想される場合は、コンソールの標準入力の代わりに名前付きパイプから読み取ることができます。
さらに一歩進んで、「require」ステートメントを除く「init.rb」のすべての部分を削除し、この設定を実行するアクションをコントローラーに追加して、関連するパラメーターを Web 経由の投稿として受け取ることができます。アクセスやエラーを記録するログ ファイルに潜在的に機密性の高いパラメーター (パスワードなど) が入力されないように、Rails を構成してください (特に、URL にパラメーターを含む HTTP GET として使用される場合)。
( setup アクションが適切なパラメータをグローバルオブジェクトに保存するまでリクエストを無視するように他の Rails アクションを設定すると、上記のシステムと同じ効果が得られます。)
Micah へのメモ: 私はあなたの投稿に直接コメントする評判がないので、ここに私のコメントを含めます。パスワードをファイルシステムに表示する必要がないシステムを検討する理由はいくつか考えられます。たとえば、開発者は、さまざまなオペレーティング システムやさまざまな環境にデプロイできる Rails プロジェクトを計画している場合があります。開発者が、管理者または root ユーザーが危険にさらされる可能性がある、信頼できない、または機密保持とセキュリティ契約への署名を求められないシナリオが存在する可能性があると判断した場合、開発者は、パスワードをメモリに配置するという追加の難読化を追加することを決定する可能性があります。のみ (パスワードを盗むために、わずかに安全性の低いシステムまたはわずかに巧妙な攻撃を必要とするため)。