web-dev-qa-db-ja.com

Rails 4.1?でAPI_KEYSにsecrets.ymlを使用する方法

最近のプロジェクトの1つで、.gitignoringから始めました。秘密と環境変数を含むファイルです。したがって、プロジェクト全体がリポジトリにコミットされます。ただし、Stripe、Twitter API、Facebook Graph、内部api_keysなどのサードパーティシークレットを含むファイルは./config/initializers/secret_token.rbファイルです。

今、私はプロジェクトがライブになりそうです(興奮しています!)そして、Capistranoを使用してすべての環境変数を運用サーバーに移植する必要があります。つまり、cap production deploy.

[編集4:Yr、2018] initializers/secret_token.rbの場合、Rails 4.1には新しい処理方法があります secrets.ymlファイル 本番サーバーへの:secret_key_base値では、 capistrano-secrets-yml gemを使用することをお勧めします。

残っているのは、API_KEYS、APP_IDなどのような他のシークレットをレポにチェックインせずに本番サーバーに運ぶ方法です。これを行う方法、最も推奨/安全な方法またはベストプラクティスは何ですか?

注:進行中の質問を編集します/より明確になります。

EDIT1:サーバーはDigitalOcean上のUbuntu/Linux VPSです[以下のDeniseへの回答]。

EDIT2:env_variables/secretsをsecrets.yml経由でサーバーに引き継ぐことができますか?結局のところ、セッションのSecret_tokenは唯一の秘密ではありません! [Edit3で回答]

EDIT3:はい!この blog に従って、secrets.yml経由でAPI_keysを送信することが可能です。いつか私の調査結果を共有します。 :-)

25
marvindanig

最初のルール:secrets.ymlをリポジトリにチェックインしないでください。

secret.ymlの外観は次のとおりです。

development:
  secret_key_base: 6a1ada9d8e377c8fad5e530d6e0a1daa3d17e43ee... 
  # Paste output of $ rake secret here for your dev machine.

test:
  secret_key_base: _your_secret_ as above

production:
  secret_key_base: <%= secure_token %>


  STRIPE_PUBLISHABLE_KEY: 'Put your stripe keys for production'
  STRIPE_SECRET_KEY: 'Put actual keys for production here'
  FB_APP_SECRET: 'same as above'
  FB_CALLBACK_URL: 'FB url here'
  FB_CALLBACK_UPDATE_URL: 'FB url here'
  GOOGLE_KEY: 'Put your keys for production'
  GOOGLE_SECRET: 'same as above'
  Twitter_KEY: 'same as above'
  Twitter_SECRET: 'same as above'
  Twitter_USERNAME: 'same as above'
  LINKEDIN_KEY: 'same as above'
  LINKEDIN_SECRET: 'same as above'

secure_tokenブロック内のproduction:に注意してください。実稼働サーバーでは、イニシャライザーを使用して 動的にsecret_tokensを生成 オンザフライで実行しています。

サイドノート:.ymlファイル内のスペースとタブに注意してください。適切にフォーマットされ、間隔が空いている必要があります(「:」記号の後にスペースがあるなど)。

本番環境でセットアップするには、ローカルから直接ファイルをscpするか、 capistrano-secrets-yml gemを使用します。

これは機能しません。以下の@OddityOverseerの回答に従って、更新されたメソッドを参照してください。

アプリの環境変数environments/production.rbにアクセスするには、次を使用します。

FB_APP_SECRET            = ENV['FB_APP_SECRET']
FB_CALLBACK_URL          = ENV['FB_CALLBACK_URL']
FB_CALLBACK_UPDATE_URL   = ENV['FB_CALLBACK_UPDATE_URL']
GOOGLE_KEY               = ENV['GOOGLE_KEY']
GOOGLE_SECRET            = ENV['GOOGLE_SECRET']
Twitter_KEY              = ENV['Twitter_KEY']
Twitter_SECRET           = ENV['Twitter_SECRET']
Twitter_USERNAME         = ENV['Twitter_USERNAME']
LINKEDIN_KEY             = ENV['LINKEDIN_KEY']
LINKEDIN_SECRET          = ENV['LINKEDIN_SECRET']

2016年8月に更新:

アプリの環境変数environments/production.rbにアクセスするには、次を使用します。

FB_APP_SECRET            = Rails.application.secrets.FB_APP_SECRET
FB_CALLBACK_URL          = Rails.application.secrets.FB_CALLBACK_URL
FB_CALLBACK_UPDATE_URL   = Rails.application.secrets.FB_CALLBACK_UPDATE_URL
GOOGLE_KEY               = Rails.application.secrets.GOOGLE_KEY
GOOGLE_SECRET            = Rails.application.secrets.GOOGLE_SECRET
Twitter_KEY              = Rails.application.secrets.Twitter_KEY
Twitter_SECRET           = Rails.application.secrets.Twitter_SECRET
Twitter_USERNAME         = Rails.application.secrets.Twitter_USERNAME
LINKEDIN_KEY             = Rails.application.secrets.LINKEDIN_KEY
LINKEDIN_SECRET          = Rails.application.secrets.LINKEDIN_SECRET

それについてです。

43
marvindanig

Rails.application.secrets.key_name

30
dkniffin

そのための1つの方法は、これらの秘密鍵を環境変数に保存することです。環境変数の設定方法は、使用しているオペレーティングシステムによって異なります。 Linuxマシンの場合、通常はホームディレクトリの.bashrcまたは.bash_profileファイルを編集し、次のような行を追加します。

export API_KEYS=apikeygoeshere

Railsを実行するユーザーに合わせてファイルを編集する必要があります。

次に、production.rbで、これらの環境変数を次のように参照できます。

ENV["API_KEYS"]

もう1つのオプションは、Ruby gemを使用することです。これは、figaroのように、基本的にそれを処理します。これらを環境変数として設定すると、上記のENV["API_KEYS"]を使用してdevelopment.rb/production.rbスクリプトで参照できます。すべての環境変数を含むファイルをチェックインしないため、コードを実行しているマシンにそのファイルを取得する方法を見つける必要があります。

8
Denise

この質問はRails 4.1に固有のものですが、Rails 5.1にアップグレードする人には組み込みのシークレット世代が含まれています。 Railsアプリで機密データを処理します。

参照: http://edgeguides.rubyonrails.org/5_1_release_notes.html#encrypted-secrets

4
Michael Irey