Подтвердить что ты не робот

Как открыть исходные приложения Rails без предоставления секретных ключей приложения и учетных данных

У меня есть ряд приложений Rails, размещенных на GitHub. Все они в настоящее время закрыты, и я часто разворачиваю их из своего репозитория GitHub. Я бы хотел, чтобы некоторые из них были с открытым исходным кодом, так же как те, которые вы можете найти на http://opensourcerails.com.

Мой вопрос: как я могу сделать эти репозитории общедоступными, не выдавая сверхсекретные учетные данные?

Например, я могу посмотреть в /config/initializers/cookie _verification_secret.rb и посмотреть секретный файл cookie почти для каждого из них. Я не понимаю, как это приемлемо. Являются ли эти пользователи каким-то образом меняют эти значения в своих средах развертывания?

Некоторые пользователи даже раскрывают секрет и ключ AWS! Другие вместо этого установят свой секрет AWS в нечто вроде:

ENV['aws-secret']

хотя я не уверен, в какой момент они устанавливают это значение.

Итак, каковы наилучшие методы открытого поиска вашего приложения Rails без ущерба для безопасности вашего приложения.

4b9b3361

Ответ 1

Недавно я прошел через это с помощью одного из моих собственных приложений. Мое решение состояло в том, чтобы хранить что-либо секретное в файле конфигурации git -ignored YAML, а затем для доступа к этому файлу с использованием простого класса в каталоге инициализаторов. Конфигурационный файл хранится в папке "shared" для развертывания Capistrano и скопирован в конфигурацию при каждом развертывании.

Конфигурация: http://github.com/tsigo/jugglf/blob/master/config/initializers/juggernaut.rb

Пример использования: https://github.com/tsigo/jugglf/blob/6b91baae72fbe4b1f7efa2759bb472541546f7cf/config/initializers/session_store.rb

Вы также можете удалить из исходного управления всю историю файла, использующего эти секретные значения. Вот руководство для этого в Git, которое я использовал: http://help.github.com/removing-sensitive-data/

Ответ 2

Если вы используете мастера, поместите файл .env в корень вашего приложения. (docs docs)

.env будет

AWS_SECRET=xxx
AWS_ACCESS=yyy

Затем, когда вам нужно использовать клавиши, вставьте:

ENV['AWS_SECRET']
ENV['AWS_ACCESS']

Хотя важно, чтобы вы не использовали этот .env для своего контроля версий. Поэтому, если вы используете git, добавьте .env к вашему .gitignore.


Бонусный раунд! - Heroku

При развертывании в Heroku эти переменные среды также должны быть настроены в среде Heroku. Существует два варианта:

  • Вручную добавьте ключи с помощью команды heroku config:add
  • Используйте heroku-config gem для синхронизации ваших переменных локальной среды в обоих направлениях.

Ответ 3

Не хранить какое-либо секретное значение вообще. В любой момент истории репо Git.
Эти значения должны храниться в другом месте, оставляя только файлы конфигурации шаблонов, а также script способными:

  • для чтения правильных значений из внешнего репо
  • и завершите окончательный файл конфигурации (с секретными значениями в нем)

Сохраняя набор данных буксировки отдельно (источники с одной стороны, секретные значения на другом), вы можете затем открыть исходный источник репо без каких-либо секретов.

Ответ 4

На самом деле я понял из вашего вопроса, используя ENV.

У меня было три разных секретных значения, которые я не хотел делать доступными. Конечно, это секретный токен приложения, а также ключ и секретный ключ Twitter. В моем секретном инициализаторе токена:

KinTwit::Application.config.secret_token = ENV['SECRET_TOKEN']

Twitter.consumer_key                     = ENV['CONSUMER_KEY']
Twitter.consumer_secret                  = ENV['CONSUMER_SECRET']

Я размещаю свой проект на Heroku, поэтому я добавил их как конфигурационные переменные в Heroku.

[03:07:48] [[email protected] ~/dev/rwc/kintwit]$ heroku config:add CONSUMER_KEY=ub3rs3cr3tk3y
Adding config vars and restarting app... done, v7
  CONSUMER_KEY => ub3rs3cr3tk3y
[03:08:40] [[email protected] ~/dev/rwc/kintwit]$ heroku config:add CONSUMER_SECRET=ub3rs3cr3tk3y
Adding config vars and restarting app... done, v8
  CONSUMER_SECRET => ub3rs3cr3tk3y
[03:08:57] [[email protected] ~/dev/rwc/kintwit]$ heroku config:add SECRET_TOKEN=ub3rs3cr3tk3y
Adding config vars and restarting app... done, v9
  SECRET_TOKEN => ub3rs3cr3tk3y

Теперь значения готовы к следующему нажатию. Но что, если вы не используете Heroku? Я, очевидно, не специалист по каждому развертыванию рельсов (jeesh, даже не Heroku pro), но пример этого будет делать db: migrate для тестирования.

$ RAILS_ENV=test rake db:migrate

Параметр KEY = value перед командой устанавливает переменную среды, поэтому при запуске этой команды echo ENV['RAILS_ENV'] будет печатать test. Таким образом, однако, это настроено в вашей среде, как вы это сделаете. Но переменные среды не находятся в вашем коде, поэтому трюк.

Ответ 5

[РЕДАКТИРОВАТЬ. В следующем методе есть раздражение, связанное с необходимостью перехода на производственную ветвь для запуска "сервера рельсов" для включения необходимых файлов cookie. Таким образом, редактирование, пока сервер затруднен... и я все еще ищу хорошее решение]

После дальнейшего изучения, я думаю, что решение, которое я искал, было исключить все, что хранило секретное значение из моей главной ветки Git репо (как @VonC). Но вместо того, чтобы читать эти файлы в отдельном репо, я просто создаю новую "производственную" ветвь и добавляю к ней.

Таким образом, они исключены из Мастера, и я могу подтолкнуть его к Github или к каким-либо другим публичным репо. Когда я буду готов к развертыванию, я могу проверить производственный филиал и объединить Master в него и развернуть Production.

Мне нужно это сделать, потому что Heroku и другие хосты требуют, чтобы один репозиторий Git был перенаправлен на их серверы.

Дополнительная информация здесь:

http://groups.google.com/group/heroku/browse_thread/thread/d7b1aecb42696568/26d5249204c70574