¿Cómo se manejan los datos confidenciales cuando se usan Github y Heroku?

48

Todavía no estoy acostumbrado a la forma en que funciona Git (y me pregunto si alguien además de Linus lo está)).

Si utilizas Heroku para alojar tu aplicación, debes verificar tu código en un repositorio de Git. Si trabajas en un proyecto de código abierto, es más probable que compartas este repositorio en Github u otros hosts de Git.

Algunas cosas no deben verificarse en el repositorio público; Contraseñas de bases de datos, claves API, certificados, etc ... Pero estas cosas aún deben ser parte del repositorio de Git ya que lo usas para enviar tu código a Heroku.

¿Cómo trabajar con este caso de uso?

Nota: Sé que Heroku o PHPFog pueden usar variables de servidor para evitar este problema. Mi pregunta es más acerca de cómo "ocultar" partes del código.

    
pregunta Jonas 03.09.2012 - 19:07

4 respuestas

29

El método preferido para mantener en secreto las contraseñas / api en heroku es establecer los valores de configuración a través de la aplicación de la línea de comandos de heroku. El siguiente ejemplo tomado de un artículo del centro de desarrollo de heroku

(El siguiente ejemplo, y mi respuesta completa se relacionan con las aplicaciones de Rails)

$ cd myapp
$ heroku config:add S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190
Adding config vars and restarting myapp... done, v14
S3_KEY:     8N029N81
S3_SECRET:  9s83109d3+583493190

Luego haga referencia a estos valores de configuración en su código usando la variable ENV []

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

De esta manera, sus contraseñas confidenciales no se almacenan en el repositorio de git. (Nota: cuando ejecute la aplicación localmente, configure estos valores en su archivo .bashrc

Además, no estoy seguro de qué tipo de aplicación está ejecutando, pero en Rails, heroku no usa su archivo database.yml, simplemente establece su nombre de usuario / contraseña de la base de datos de acuerdo con la configuración de su aplicación. Así que puedes evitar guardar esas credenciales en git

Además, también, si está ejecutando su propia aplicación y desea que se mantenga privada, una excelente alternativa a github es bitbucket , que ofrece servicios privados gratuitos. repositorios.

    
respondido por el Mike V 09.01.2013 - 19:09
17

Varias ideas ... La criptografía de clave pública es la respuesta más flexible.

Ofuscación (solo para código)

Para las partes del código que desea ocultar, ¿podría colocarlas en un proyecto diferente, compilarlas y registrar solo el código compilado, no la fuente? Esto es no encriptado y no es adecuado para encriptar contraseñas o claves. Las personas aún pueden aplicar ingeniería inversa a su código compilado, pero no obtienen la fuente.

Repositorio GIT privado

¿Tiene que ser un público git repositorio?

Almacenamiento del servidor

¿Puede almacenar esta información en un archivo protegido en el directorio de inicio de la cuenta de usuario en la que se ejecuta la aplicación? Copiaría la forma en que ssh hace esto con ~ / .ssh / id_rsa y un chmod de 600. En su defecto, podría usarse una variable de entorno. Necesita un lugar en el servidor para almacenar algún tipo de clave, o no hay forma de proteger nada.

Criptografía simétrica (solo para ti)

Si usted es el único desarrollador, puede poner una clave en el servidor y tener esa misma clave en su máquina y usar un esquema de cifrado simétrico para proteger algunos datos como una contraseña o un certificado. Compartir una clave simétrica con amigos se complica.

Criptografía asimétrica (para múltiples desarrolladores)

Si otros desarrolladores necesitan registrar cosas secretas en un repositorio público de git, se realizó una criptografía de clave pública / clave privada (asimétrica) para este tipo de cosas. Instale una clave privada en su servidor (¡no la ingrese en el control de código fuente) y genere una clave pública a partir de ella! Cifre sus datos secretos utilizando la clave pública del servidor. Solo el servidor puede descifrar esos datos usando su clave privada. Incluso puede ingresar la clave pública en el control de origen para que otras personas puedan cifrar los datos usando la misma clave pública y solo el servidor pueda descifrarlos.

Herramienta

Openssl es probablemente la única herramienta de criptografía que necesitarás. No escriba su propio algoritmo de criptografía o su propia implementación de un algoritmo publicado.

Pensamientos finales

Si el "servidor" es un servidor web que usa https, entonces ya debería tener un almacén de claves de algún tipo en el servidor para almacenar la clave privada. Es como si una empresa de hospedaje no lo hiciera. hacer concesiones para esto. Tal vez tengan algunos consejos sobre cómo otros resuelven el desafío al que te enfrentas.

    
respondido por el GlenPeterson 05.09.2012 - 16:09
7

Si desea ejecutar su código en Heroku, debe dárselo, no puede mantenerlo "en secreto" de su proveedor de alojamiento.

En lo que respecta a los repositorios públicos de git, si su proyecto es de código abierto pero no desea compartir los datos de alojamiento, deberá mantener una bifurcación privada de su proyecto para los fines de implementación.

    
respondido por el Richard Nichols 04.09.2012 - 04:42
6

No debes ocultar partes del código. La seguridad de su sistema no debe confiar en el secreto del código; eso se conoce como "seguridad a través de la oscuridad", que es mal visto por los expertos en seguridad porque funciona muy mal.

En cambio, las contraseñas, las claves de cifrado, etc. deben mantenerse separadas del código. Almacénelos en un archivo de configuración o valor de configuración separado que lea el código. No es necesario almacenarlos en git.

Importante: ¡Nunca codifique claves criptográficas, contraseñas u otros secretos en su código fuente! Eso es una muy mala práctica.

Ver también:

Enchufe: IT Security.SE es un excelente lugar para hacer preguntas sobre seguridad.

    
respondido por el D.W. 09.01.2013 - 23:29

Lea otras preguntas en las etiquetas