Где хранить конфиденциальные данные в приложении public rails? - PullRequest
39 голосов
/ 24 мая 2011

Мой личный проект rails использует несколько API, для которых я храню ключи / секреты API в config / средах / production.yml и development.yml как глобальные переменные. Теперь я хочу перенести этот проект на github, чтобы другие могли его использовать, но я не хочу, чтобы они имели эти биты конфиденциальных данных. Я также не хочу этот файл в .gitignore, потому что он необходим для запуска приложения. Я подумал о том, чтобы положить их где-нибудь в БД, но надеюсь найти лучшее решение.

Ответы [ 5 ]

49 голосов
/ 03 июля 2012

TLDR : использовать переменные окружения!

Я думаю, что комментарий @ Брайса предлагает ответ, который я просто вычеркну. Кажется, один из подходов Heroku рекомендует - использовать переменные среды для хранения конфиденциальной информации (строки ключей API, пароли базы данных). Так что изучите ваш код и посмотрите, в чём у вас есть конфиденциальные данные. Затем создайте переменные среды (например, в вашем файле .bashrc), в которых хранятся значения чувствительных данных. Например для вашей базы данных:

export MYAPP_DEV_DB_DATABASE=myapp_dev
export MYAPP_DEV_DB_USER=username
export MYAPP_DEV_DB_PW=secret

Теперь в своем локальном окне вы просто обращаетесь к переменным среды всякий раз, когда вам нужны конфиденциальные данные. Например, в database.yml:

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: <%= ENV["MYAPP_DEV_DB_DATABASE"] %>
  pool: 5
  username: <%= ENV["MYAPP_DEV_DB_USER"] %>
  password: <%= ENV["MYAPP_DEV_DB_PW"] %>
  socket: /var/run/mysqld/mysqld.sock

Я думаю, что database.yml анализируется только при инициализации или перезапуске приложения, поэтому это не должно влиять на производительность. Так что это решит проблему для вашего локального развития и для публикации вашего хранилища. Лишенные конфиденциальных данных, теперь вы можете использовать тот же репозиторий для общего доступа, что и для частного использования. Это также решает проблему, если вы используете VPS. Просто подключитесь к нему по ssh и настройте переменные окружения на вашем производственном хосте, как вы делали это в своей разработке.

Между тем, если ваша производственная установка требует развертывания в режиме реального времени, когда вы не можете подключиться к производственному серверу ssh, как это делает Heroku, вам нужно посмотреть, как удаленно настроить переменные среды. Для Heroku это делается с помощью heroku config:add. Итак, по той же статье, если у вас есть S3, интегрированный в ваше приложение, и у вас были конфиденциальные данные, поступающие из переменных среды:

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

Просто попросите Heroku создать для нее переменные окружения:

heroku config:add S3_KEY=8N022N81 S3_SECRET=9s83159d3+583493190

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

3 голосов
/ 24 мая 2011

Как насчет этого ...

Создайте новый проект и зарегистрируйте его в GitHub со значениями-заполнителями в файлах production.yml и development.yml.

Обновление .gitignoreдля включения production.yml и development.yml.

Замените значения заполнителей вашими секретами.

Теперь вы можете проверять свой код в GitHub без ущерба для ваших секретов.

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

Соответствует ли это вашим целям?

1 голос
/ 04 июня 2014

В Rails 4.1 теперь есть соглашение.Вы храните этот материал в секретах.Таким образом, вы не получите глобальных вызовов ENV, разбросанных по всему вашему приложению.

Этот файл yaml похож на файл database.yml, проанализированный с помощью erb, поэтому вы все еще можете использовать вызовы ENV здесь.В этом случае вы можете поставить его под контроль версий, тогда он будет служить просто документацией, которую нужно использовать ENV.Но вы также можете исключить его из системы контроля версий и хранить там реальные секреты.В этом случае вы должны поместить в секретный репозиторий secretts.yml.default и т. П. Для целей документирования.

development: 
   s3_secret: 'foo'
production: 
   s3_secret: <%= ENV['S3_SECRET']%>

Чем вы можете получить доступ к этому материалу в

Rails.application.secrets.s3_secret

Это обсуждалосьподробно в начале этот эпизод

1 голос
/ 03 июня 2014

Использовать переменные среды.

В Ruby они доступны примерно так:

ENV['S3_SECRET']

Две причины:

  1. Значения не войдут в систему контроля версий.
  2. «конфиденциальные данные», то есть пароли, как правило, меняются в зависимости от среды. например вы должны использовать разные учетные данные S3 для разработки и производства.

Это лучшая практика?
Да: http://12factor.net/config

Как использовать их локально?
Форман и Дотен оба легки. Или отредактируйте оболочку .

Как использовать их в производстве?
Во многом это зависит. Но для Rails dotenv - это легкая победа.

А как насчет платформы как услуги?
Любой PaaS должен дать вам возможность их установить. Героку например: https://devcenter.heroku.com/articles/config-vars

Разве это не усложняет настройку нового разработчика для проекта?
Возможно, но оно того стоит. Вы всегда можете проверить файл .env.sample в системе контроля версий с некоторыми примерами данных. Добавьте примечание об этом в readme вашего проекта.

1 голос
/ 24 мая 2011

Их, вероятно, лучше всего помещать в инициализаторы (config / initializers / api.yaml), хотя я думаю, что то, что вы приготовили, хорошо.Добавьте фактические ключи в ваш файл .gitignore и запустите git rm config/environments/production.yml, чтобы удалить эти конфиденциальные данные из вашего репозитория.Честное предупреждение, этот файл тоже будет удален, поэтому сначала создайте его резервную копию.

Затем просто создайте файл config / environment / production.yml.example рядом с вашим действительным файлом с соответствующими данными, но с конфиденциальными данными.опущены.Когда вы извлекаете его в производство, просто скопируйте файл без .example и подставьте соответствующие данные.

...