2011-05-24 5 views
38

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

ответ

48

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

Я думаю, что @ Bryce's comment предлагает ответ, который я просто сброшу. Кажется, один подход Heroku recommends - использовать переменные среды для хранения конфиденциальной информации (строки ключей 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. Работает для любого приложения, так как все они могут получить переменные окружения.

+1

Это, безусловно, лучшее решение, представленное здесь. Безопасная, простая, эффективная кросс-платформенная и эффективная. Не мог просить больше. – piersadrian

+2

@yuvilio У меня есть следующий вопрос: как сделать указанные переменные среды доступными для Ruby on Rails, запущенных на Ubuntu с Apache2/Phusion Passenger? –

+1

@YoLudke Для приложения, направленного через Apache, я бы использовал директиву [SetEnv] (http://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv) в моем файле хоста Apache для приложение. Например: '' 'SetEnv S3_KEY THESECRETKEY'''. Переменная среды будет доступна через глобальную переменную ENV как ENV ['S3_KEY']. – yuvilio

1

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

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

+0

Да, я слышу тебя, но, как сказал, что я пытаюсь найти решение, которое не включает удаление этих файлов из репозитория. – tybro0103

+0

Из интереса, почему? Развертываете ли вы герою или где-то подобное, что не позволяет вам скопировать файлы прямо на сервер? –

+0

Да. Это, и я хочу, чтобы это было как можно проще для других, чтобы мой код работал. – tybro0103

3

Как об этом ...

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

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

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

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

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

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

+0

Не совсем так, потому что тогда, когда происходит добавление чего-то к тем файлам, которые необходимы проложить путь к другим хранилищам? – tybro0103

+0

Если этого не произойдет часто, просто восстановите значения placeholder, удалите строку из .gitignore, передайте GitHub с изменениями, отредактируйте файлы, чтобы восстановить свои секреты и отредактируйте .gitignore, чтобы снова скрыть свои секреты. Могут быть решения, которые более умны, но этот подход прост. –

1

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

В Ruby, они доступны как так:

ENV['S3_SECRET'] 

Две причины:

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

Является ли это лучшей практикой?
Да: http://12factor.net/config

Как использовать их на месте?
foreman и dotenv оба легко. Или отредактируйте ваш shell.

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

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

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

1

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

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

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

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

Rails.application.secrets.s3_secret 

Ее подробно обсудили в начале this Эпизод

+0

Да, это лучший подход .... и, следовательно, лучший ответ. :) –

Смежные вопросы