サーバー環境変数に格納することは、 Twelve-Factor App の方法論に従って、資格情報を DB、サードパーティの資格情報などに格納するためのベスト プラクティスです。それらの保管方法は、使用しているものとセットアップ方法によって異なります。これにより、信用情報をソース管理、データベース、およびサーバー環境のローカルに保持することが促進されます。環境変数にアクセスするには、次のように使用できますENV
。
ENV['something']
制限とセキュリティに関する懸念:
環境変数に数千以上のパスワード/資格情報を保存している場合、実現可能性とセキュリティの観点から、それらを使用するかどうかを決定するのに役立ついくつかのことがあります。
Web アプリケーションまたはサービスを実行している OS ユーザーが、Rails アプリケーションのルート ディレクトリとサブディレクトリのみへの読み取り専用アクセス権を持っているため、資格情報/シークレット ファイルの既知の (相対または絶対) パスへの読み取りアクセス権を持っている場合、および開発者が、クライアントに返される変数に読み取られるファイルへのパス名の一部としてリクエスト パラメータを使用するサービスを誤って作成すると、アプリケーションのユーザーがすべてのクレデンシャルをリモートでダンプする可能性があります。アプリケーションを実行している OS ユーザーが簡単に推測できないパス名でこれらの資格情報をアクセスしにくい場所に置くと、そのエクスプロイトがそれらの資格情報をダンプするために成功裏に使用されるリスクが軽減されます。
また、サーバー環境外でこれらの資格情報を使用するのを難しくするために、できることを行う必要があります。このように、アプリ/サービスのエクスプロイトを介してすべての資格情報をダンプしたが、その環境外でそれらの資格情報を使用できない場合、それらの価値ははるかに低くなります。
env 変数に格納できる量の制限は、おそらくあなたが思っているよりも高いでしょう。たとえば、RVM がロードされた macOS では、bash 関数などで大量の環境スペースを浪費しますが、4278 53 文字の長さの資格情報 (例: bcrypt-ed) を取得できました。
test.sh
#!/bin/bash
set -ev
for i in `seq 1 4278`;
do
export CRED$i='...........................................'
done
ruby -e 'puts "#{ENV.size} env vars in Ruby. First cred=#{ENV["CRED1"]}"'
出力:
$ time ./test.sh
for i in `seq 1 4278`;
do
export CRED$i='...........................................'
done
seq 1 4278
ruby -e 'puts "#{ENV.size} env vars in Ruby. First cred=#{ENV["CRED1"]}"'
4319 env vars in Ruby. First cred=...........................................
real 0m0.342s
user 0m0.297s
sys 0m0.019s
それを超えると、 になりましruby: Argument list too long
た。
アプリに環境変数の値を吐き出す可能性のあるサービスがある場合、安全性が低下するため、環境変数に資格情報を保存したくないことは明らかですが、私の経験では、開発に遭遇したことはありませんすべてのシステム プロパティと環境変数を吐き出す可能性のある Java 管理コンソールのようなものを除いて、ENV が意図的に公開された状況。
クレドを DB に保存すると、通常は SQL インジェクションの悪用がはるかに一般的であるため、リスクが高くなります。これが、通常、パスワードのハッシュのみが DB に格納され、他のサービスへの暗号化された資格情報が格納されない理由の 1 つです。
攻撃者がサーバー自体にログインし、Web アプリ/サービスを実行しているユーザーの環境にアクセスできる場合、または資格情報を含むファイルを見つけて読み取ることができる場合は、運が悪いです。