Mi proyecto de rieles personales utiliza algunas API para las cuales almaceno las claves/secretos de API en config/environments/production.yml y development.yml como variables globales. Ahora quiero enviar este proyecto a Github para que otros lo utilicen, pero no quiero que tengan esos bits de datos confidenciales. Tampoco quiero este archivo en .gitignore porque es necesario para ejecutar la aplicación. He considerado ponerlos en el DB en alguna parte, pero espero encontrar una mejor solución.¿Dónde almacenar datos confidenciales en la aplicación de rieles públicos?
Respuesta
TLDR: Uso de variables de entorno!
creo @ Bryce de comment ofrece una respuesta, que sólo voy a enjuagar. Parece que un enfoque Heroku recommends es usar variables de entorno para almacenar información sensible (cadenas de claves API, contraseñas de bases de datos). Así que revise su código y vea en qué datos confidenciales. A continuación, cree variables de entorno (en su archivo .bashrc, por ejemplo) que almacenan los valores de datos sensivite. Por ejemplo, para su base de datos:
export MYAPP_DEV_DB_DATABASE=myapp_dev
export MYAPP_DEV_DB_USER=username
export MYAPP_DEV_DB_PW=secret
Ahora, en su local de la caja, que sólo se refieren a las variables de entorno cada vez que necesita los datos sensibles. Por ejemplo, en 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
Creo database.yml consigue Analizada solo en la inicialización de la aplicación o arranque de nuevo por lo que esto no debería afectar al rendimiento. Entonces esto lo resolvería para su desarrollo local y para hacer público su repositorio. Sin datos confidenciales, ahora puede usar el mismo repositorio para el público que lo hace en privado. También resuelve el problema si estás en un VPS. Solo sáquelo y configure las variables de entorno en su host de producción como lo hizo en su cuadro de desarrollo.
Mientras tanto, si su configuración de producción implica un despliegue de manos libres en el que no puede enviar ssh al servidor de producción, como hace Heroku, debe ver cómo configurar de forma remota variables de entorno. Para Heroku esto se hace con heroku config:add
. Por lo tanto, por el mismo artículo, si tuviera S3 integrado en su aplicación y que tenía los datos sensibles que vienen de las variables de entorno:
AWS::S3::Base.establish_connection!(
:access_key_id => ENV['S3_KEY'],
:secret_access_key => ENV['S3_SECRET']
)
Sólo tiene Heroku crear variables de entorno para ello:
heroku config:add S3_KEY=8N022N81 S3_SECRET=9s83159d3+583493190
Otro profesional de esta solución es que es un lenguaje neutral, no solo Rails. Funciona para cualquier aplicación ya que todas pueden adquirir las variables de entorno.
Son probablemente el mejor poner en inicializadores (config/inicializadores/api.yaml) aunque creo que lo que tienes cocinado está bien. Agregue las claves reales a su archivo .gitignore y ejecute git rm config/environments/production.yml
para eliminar esos datos confidenciales de su repositorio. Advertencia justa, eliminará ese archivo también, así que hazlo primero.
A continuación, basta con crear un archivo de configuración/ambientes/production.yml.example junto a su archivo actual con los detalles pertinentes, pero con los datos sensibles dejado fuera. Cuando lo saque a producción, solo copie el archivo sin el .example y sustituya los datos apropiados.
Sí, te escucho, pero como se ha dicho, que estoy tratando de encontrar una solución que no implica eliminar esos archivos del repositorio. – tybro0103
Fuera de interés, ¿por qué? ¿Se está implementando en heroku o en algún lugar similar que no le permite copiar archivos directamente en un servidor? –
Sí. Eso, y quiero que sea lo más simple posible para que otros puedan ejecutar mi código. – tybro0103
¿Qué tal esto ...
Crear un nuevo proyecto y comprobar en GitHub con los valores de marcador de posición en el production.yml y archivos development.yml.
actualización .gitignore incluir production.yml y development.yml.
Reemplace los valores de marcador de posición con sus secretos.
Ahora puede verificar su código en GitHub sin comprometer sus secretos.
Y cualquiera puede clonar tu repositorio sin ningún paso adicional para crear archivos que faltan (que sólo va a sustituir los valores de marcador de posición como lo hizo).
¿Cumple con eso?
No realmente, porque entonces, ¿qué sucede cuando agrego algo a esos archivos que necesita hacer su camino a otros repositorios? – tybro0103
Si eso no sucede a menudo, simplemente restaure los valores del marcador de posición, elimine la línea de .gitignore, comprométase con GitHub con los cambios, edite los archivos para restaurar sus secretos y edite .gitignore para ocultar nuevamente sus secretos. Puede haber soluciones que son más inteligentes, pero este enfoque es simple. –
Usar variables de entorno.
En Rubí, son accesibles de este modo:
ENV['S3_SECRET']
dos razones:
- Los valores no lo hará en control de código fuente.
- "datos confidenciales" también conocido como contraseñas tienden a cambiar de una manera por el medio ambiente. p.ej. deberías usar diferentes credenciales S3 para desarrollo vs producción.
¿Es esta una práctica recomendada?
Sí: http://12factor.net/config
¿Cómo ellos utilizan a nivel local?
foreman y dotenv son ambos fáciles. O edite su shell.
¿Cómo los uso en la producción?
En gran medida, depende. Pero para Rails, dotenv es una victoria fácil.
¿Qué pasa con la plataforma como servicio?
Cualquier PaaS debería darle una forma de configurarlos. Heroku, por ejemplo: https://devcenter.heroku.com/articles/config-vars
¿No dificulta esto la tarea de configurar un nuevo desarrollador para el proyecto?
Quizás, pero vale la pena. Siempre puede verificar un archivo .env.sample en el control de código fuente con algunos datos de ejemplo en él. Agregue una nota sobre el archivo léame de su proyecto.
Rails 4.1 tiene ahora una convención para él. Guardas estas cosas en secret.yml. Así que no terminas con algunas llamadas ENV globales repartidas por tu aplicación.
Este archivo yaml es como database.yml erb analizado, por lo que todavía puede utilizar las llamadas ENV aquí. En ese caso puede ponerlo bajo control de versión, entonces serviría como una documentación que ENV vars tiene que ser utilizada.Pero también puede exlcuirlo del control de versión y almacenar los secretos reales allí. En ese caso, pondría algunos secretos.yml.default o similares en el repositorio público para fines de documentación.
development:
s3_secret: 'foo'
production:
s3_secret: <%= ENV['S3_SECRET']%>
de lo que puede acceder a este material bajo
Rails.application.secrets.s3_secret
Su discutidos en detalle al principio del episodio this
Sí, este es el mejor enfoque ... y por lo tanto, la mejor respuesta. :) –
- 1. ¿Dónde almacenar datos en iphone?
- 2. Datos confidenciales en la memoria
- 3. ¿Dónde debo almacenar los datos de mi aplicación?
- 4. ¿Dónde deberíamos almacenar mensajes de confirmación/error en la aplicación?
- 5. Estrategia de codificación para proteger datos confidenciales
- 6. ¿Dónde almacenar grandes datos de aplicaciones en dispositivos Android?
- 7. ¿Dónde debería una aplicación web Java almacenar sus datos?
- 8. Rieles: almacenar traducciones en la base de datos
- 9. Almacenamiento de datos confidenciales con Drupal
- 10. ¿Dónde/cómo almacenar datos persistentes con tomcat?
- 11. ¿Dónde tenemos que almacenar los datos de descarga en la aplicación de iPhone?
- 12. ¿Dónde almacenar las credenciales de la base de datos en una aplicación web?
- 13. Filtrar datos confidenciales con la videograbadora
- 14. ¿Dónde debe almacenar la aplicación sus registros en Mac OS?
- 15. Rieles: ¿dónde colocar los archivos de datos?
- 16. ¿Dónde almacenar la configuración para una aplicación .NET simple?
- 17. ¿Cuál es la mejor manera de almacenar datos de configuración no públicos en una aplicación .NET 4.0?
- 18. Dónde almacenar datos de la aplicación en Windows 7 y Vista
- 19. Dónde almacenar los datos de configuración (estructurados) en Rails
- 20. Rieles: almacenamiento de datos cifrados en la base de datos
- 21. ¿Es seguro mantener datos confidenciales en SQLite
- 22. ¿Dónde debo almacenar la base de datos SQLite para mi aplicación de iPhone?
- 23. ¿Dónde está el lugar correcto para almacenar mis datos específicos de la aplicación?
- 24. Dónde almacenar Ninject IKernel en una aplicación web?
- 25. Dónde almacenar la configuración/estado de la aplicación en una aplicación MVVM
- 26. ¿Cuándo y dónde necesito archivos en una aplicación de rieles?
- 27. ¿Dónde debo almacenar la configuración de configuración de todo el sitio para una aplicación de Rails?
- 28. Almacenar datos de una aplicación de C#
- 29. Dónde almacenar la clave de cifrado
- 30. ¿Cuál es la mejor manera de almacenar la configuración específica de la aplicación en los rieles?
Esta es, de lejos, la mejor solución presentada aquí. Seguro, simple, efectivo multiplataforma y rendimiento. No podría pedir más. – piersadrian
@yuvilio Tengo una pregunta de seguimiento: ¿Cómo podría uno hacer que dichas variables de entorno sean accesibles a Ruby on Rails que se ejecuta en Ubuntu con Apache2/Phusion Passenger? –
@YoLudke Para una aplicación que se dirige a través de Apache, utilizaría la directiva [SetEnv] (http://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv) en mi archivo de host Apache para el aplicación Por ejemplo: '' 'SetEnv S3_KEY THESECRETKEY'''. La variable de entorno estaría disponible a través de la variable global ENV como ENV ['S3_KEY'] también. – yuvilio