¿Cómo abro las aplicaciones de Source my Rails sin regalar las keys secretas y las cnetworkingenciales de la aplicación?

Tengo una cantidad de aplicaciones de Rails alojadas en GitHub. Todos son actualmente privados, y a menudo los implementaré desde su repository de GitHub. Me gustaría poder hacer algunos de ellos de código abierto, como los que puedes encontrar en http://opensourcerails.com .

Mi pregunta es: ¿cómo puedo hacer que estos repositorys sean públicos sin regalar cnetworkingenciales súper secretas?

Por ejemplo, puedo search en /config/initializers/cookie_verification_secret.rb y ver el secreto de cookies para casi cada uno de ellos. No entiendo cómo esto es aceptable. ¿Están estos usuarios cambiando estos valores en sus entornos de implementación de alguna manera?

¡Algunos usuarios incluso exponen su secreto y key de AWS! Otros, en cambio, configurarán su AWS en secreto de la siguiente manera:

ENV['aws-secret'] 

aunque no estoy seguro de en qué punto están estableciendo ese valor.

Entonces, ¿cuáles son las mejores prácticas para la adquisición abierta de su aplicación Rails sin comprometer la security de su aplicación?

Recientemente revisé esto con una de mis propias aplicaciones. Mi solución fue almacenar cualquier cosa secreta en un file de configuration YAML ignorado por git, y luego acceder a ese file usando una class simple en el directory de inicializadores. El file de configuration se almacena en la carpeta 'compartida' para la implementación de Capistrano y se copy a la configuration en cada implementación.

Tienda de configuration: http://github.com/tsigo/jugglf/blob/master/config/initializers/juggernaut.rb

Ejemplo de uso: https://github.com/tsigo/jugglf/blob/6b91baae72fbe4b1f7efa2759bb472541546f7cf/config/initializers/session_store.rb

También es posible que desee eliminar del control de origen todo el historial del file que usó estos valores secretos. Aquí hay una guía para hacer esto en Git que utilicé: http://help.github.com/removing-sensitive-data/

Si está utilizando capataz, coloque un file .env en la raíz de su aplicación. (documentos del capataz)

.env tendrá

 AWS_SECRET=xxx AWS_ACCESS=yyy 

Luego, cuando necesite usar las teclas, inserte:

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

Aunque es importante que no comprometa este .env con el control de su versión. Entonces, si estás usando git, agrega el .env a tu .gitignore .


Ronda de bonificación ! – Heroku

Si se implementa en Heroku, estas variables de entorno también se deben configurar en el entorno de Heroku. Hay dos opciones:

  1. Agregue manualmente las teclas a través del heroku config:add
  2. Usa la gem heroku-config para sincronizar tus variables de entorno local, en ambos sentidos.

No almacena ningún valor secreto en absoluto. En cualquier punto de la historia de un repository de Git.
Esos valores deben almacenarse en otro lugar, dejando solo los files de configuration de plantilla versionados, junto con un script capaz:

  • para leer los valores correctos del repository externo
  • y construye el file de configuration final completo (con los valores secretos en él)

Al mantener separado el set de datos de arrastre (fonts en un lado, valores secretos en el otro), puede abrir el repository de fonts sin comprender ningún secreto.

En realidad tomé una pista de tu pregunta, usando ENV.

Tenía tres valores secretos diferentes que no quería que estuvieran disponibles. Son el token secreto de la aplicación, por supuesto, y la key y el secreto del consumidor de Twitter. En mi inicializador de tokens secreto:

 KinTwit::Application.config.secret_token = ENV['SECRET_TOKEN'] Twitter.consumer_key = ENV['CONSUMER_KEY'] Twitter.consumer_secret = ENV['CONSUMER_SECRET'] 

Estoy alojando mi proyecto en Heroku, así que los agregué como variables de configuration a Heroku.

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

Ahora, los valores están listos en mi próximo empujón. Pero, ¿y si no estás usando Heroku? Obviamente no soy un experto en el deployment de cada riel (jeesh, ni siquiera un profesional de Heroku), pero un ejemplo de esto sería hacer un DB: migrar para probar.

 $ RAILS_ENV=test rake db:migrate 

El par KEY = value antes del command establece la variable de entorno, por lo que al ejecutar este command, echo ENV['RAILS_ENV'] imprimiría la test . Entonces, sin embargo, esto está configurado en su entorno es cómo lo haría. Pero las variables de entorno no están en tu código, así que ese es el truco.

[EDITAR – El siguiente método tiene la molestia de tener que cambiar a la twig de Producción para ejecutar "server de Rails" para include las cookies necesarias. Por lo tanto, hacer modificaciones mientras el server es difícil … y todavía estoy buscando una buena solución]

Después de una investigación más profunda, creo que la solución que estaba buscando era excluir cualquier cosa que almacenara un valor secreto de la twig principal de mi repository Git (tal como dijo @VonC). Pero en lugar de leer esos files en un repository separado, simplemente creo una nueva twig de "producción" y los agrego a eso.

De esta manera están excluidos de la Maestra y puedo enviar eso a Github o a algún otro repository público sin problemas. Cuando esté listo para implementar, puedo verificar la twig Producción y fusionar el Maestro en él e implementar Producción.

Necesito poder hacer esto porque Heroku y otros hosts requieren un solo repository git para ser enviado a sus serveres.

Más información aquí:

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