24

私はウェブを検索してきましたが、新しいパブリック レール アプリから何を除外すべきかについて、適切な/最近の例を見つけることができません。GitHub で自分のアプリをオープン ソース化しようとしていますが、ソース管理からどのような種類のデータを削除する必要があるのか​​疑問に思っています。

私の知る限り、config/config.yml個人情報を含むファイルがあるはずです。私は他のファイルを調べてきましたが、次のように見えますが、config/database.yml除外する必要がありますか config/intializers/secret_token.rb?config/initializers/session_store.rb

これらのファイルをすべて個別に除外するのがベスト プラクティスですか? または、情報をすべて定義してconfig/config.yml、それらの各ファイルで呼び出す方法はありますか? さらに、どのファイルとデータを非公開にして非表示にする必要がありますか? それがすべてですか?

どのようなアプローチをとるべきか、ベストプラクティスは何かを考えています。助けてくれてありがとう!

4

2 に答える 2

27

私も最近これを調べています。オープン ソース コードを Github にプッシュし、テストのためにTravis CIに自動的にプッシュし、Travis からHerokuに自動的にデプロイするプロセス全体で、機密情報を隠しておきたいと考えていました。これまでにさまざまな StackOverflow の Q&A やブログなどを調べて見つけたすべての詳細を以下に示します。Rails アプリ内の構成のみであっても、参照として役立つことを願っています (表示されているものはすべて省略し{{ ... }}てください)。

免責事項: 私は決してここの専門家ではないので、私が試している方法よりも良い方法がある可能性が高いことを覚えておいてください。この Q&A スレッドでいくつかの新しいトリックを学ぶことができれば幸いです。


Rails アプリの内部

現在、環境変数に機密情報を隠すためにFigaro gemを使用しています。ENV私の ( .gitignored) config/application.ymlでは、次の情報を保持しています。

# App keys
SECRET_TOKEN: # your rake secret generated token

development:
  DB_NAME: # your dev db name here
  DB_USER: # your dev db username here
  DB_PASSWORD: # your dev db password here

test:
  DB_NAME: # your test db name here
  DB_USER: # your test db username here
  DB_PASSWORD: # your test db password here

production:
  DB_NAME: # your prod db name here
  DB_USER: # your prod db username here
  DB_PASSWORD: # your prod db password here

# Third Party keys that you will reference in their relevant files
THIRD_PARTY_API_OR_LICENSE_KEY: # list of whatever api/license keys you use

( DB_NAMEDB_USER、およびDB_PASSWORDは、アプリが実行されている環境に応じて動的に使用されます)。

上記のファイルの空のバージョン ( config/application.example.yml ) が Github にプッシュされ、入力方法に関するいくつかの指示が表示されます。

Github にプッシュされ、これらの変数を参照するファイルは次のようになります。

config/database.yml
(ここでは Postgresql が使用されていますが、使用するデータベースの設定を変更できるはずです)

postgresql: &postgresql
  adapter: postgresql
  database: <%= ENV['DB_NAME'] %>
  username: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  min_messages: ERROR

defaults: &defaults
  pool: 5
  timeout: 5000
  host: localhost
  <<: *<%= ENV['DB'] || "postgresql" %>

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults

config/initializers/secret_token.rb

if Rails.env.production? && ENV['SECRET_TOKEN'].blank?
  raise 'SECRET_TOKEN environment variable must be set!'
end

YourApp::Application.config.secret_token = 
  ENV['SECRET_TOKEN'] || {{WHATEVER_SECRET_TOKEN_RAILS_GENERATED_BY_DEFAULT}}

THIRD_PARTY_API_OR_LICENSE_KEY(さらに、 -type キーを参照するすべてのファイル。)

Travis CI でのテスト

Travis gemを使用して、暗号化された travis 変数を作成します。Travis ワーカーから Heroku に直接デプロイする場合は、Heroku API キーと Heroku Git URL が必要です (詳細については、この StackOverflow Q&Aを参照してください)。

$ gem install travis
$ travis encrypt your_username/your_repo HEROKU_API_KEY={{YOUR_HEROKU_API_KEY}}
$ travis encrypt HEROKU_GIT_URL={{YOUR_HEROKU_GIT_URL}} # eg git@heroku.com:your_app.git
$ travis encrypt DB_NAME={{YOUR_DB_NAME_UNDER_TEST}} # eg your_app_test
$ travis encrypt DB_USER={{YOUR_DB_USER_UNDER_TEST}}
$ travis encrypt DB_PASSWORD={{YOUR_DB_PASSWORD_UNDER_TEST}}

(さらに、テスト中に必要になる可能性のある他のキーがあれば暗号化します...)

次に、それらを.travis.yml
に追加します (ここでも Postgresql に焦点を当てていますが、使用するデータベースの設定を変更できるはずです)。

env:
  global:
    - secure: {{YOUR_ENCRYPTED_HEROKU_API_KEY}}
    - secure: {{YOUR_ENCRYPTED_HEROKU_GIT_URL}}
    - secure: {{YOUR_ENCRYPTED_DB_NAME}}
    - secure: {{YOUR_ENCRYPTED_DB_USER}}
    - secure: {{YOUR_ENCRYPTED_DB_PASSWORD}}
  matrix:
    - DB: postgresql
before_script:
  - psql -c "create database $DB_NAME;" -U $DB_USER
  - RAILS_ENV=test bundle exec rake db:migrate
script:
  - bundle exec rspec spec/
after_success:
  - gem install heroku
  - git remote add heroku $HEROKU_GIT_URL
  # ... see link above for the rest of the config content

同じ名前でマークされた複数の変数secureは問題ありません。HEROKU_API_KEY=[secure] HEROKU_GIT_URL=[secure]などのように設定に表示されます。

Heroku へのデプロイ

Figaro の Heroku rake タスクを使用して、Heroku が本番環境で確認する必要がある環境変数を自動的に設定します。

$ rake figaro:heroku

または、手動で設定します。

$ heroku config:set SECRET_TOKEN={{YOUR_SECRET_TOKEN}}
$ heroku config:set DB_NAME={{YOUR_DB_NAME_UNDER_PRODUCTION}} # eg your_app_production
$ heroku config:set DB_USER={{YOUR_DB_USER_UNDER_PRODUCTION}}
$ heroku config:set DB_PASSWORD={{YOUR_DB_PASSWORD_UNDER_PRODUCTION}}
$ heroku config:set THIRD_PARTY_API_OR_LICENSE_KEY={{YOUR_THIRD_PARTY_API_OR_LICENSE_KEY}}

次に、展開を試みます。


それが今のところ私が持っているすべてです。もっと情報を隠す必要があるのか​​、それとも十分に隠していないのかは現時点ではわかりませんが、それは進行中の作業です.

于 2013-02-09T12:44:25.450 に答える
4

あなたは異なる意見を得るでしょう。IMHO、これらのファイルを含めるのがベストプラクティスですが、秘密のコンテンツは省略してください。プロジェクトに不慣れな開発者が何を記入する必要があるかがわかるように、何をしているかを文書化します。

Phusionには、Railsセッションシークレットの処理方法と、情報を含めるまたは除外するために行うことができるトレードオフについての優れたブログ投稿があります。

http://blog.phusion.nl/2013/01/04/securing-the-rails-session-secret/#.URYPXekTMak

これらを文書化する私のお気に入りの方法は、「レーキ設定」タスクを使用することです。開発者が行う必要のあることをタスクに印刷させることができます。つまり、すべてを自動化する必要はありません(ただし、それができれば便利です)。

凝ったものにしたい場合は、ファイルに共有/ディレクトリからシークレット設定を読み取らせます。これにより、デプロイメントのシンボリックリンクも有効になります。これはPhusionブログでも説明されています。これが、頻繁にデプロイする必要のあるアプリを作成する方法です。

于 2013-02-09T09:05:06.757 に答える