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


49

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

Si usa Heroku para alojar su aplicación, debe tener su código verificado en un repositorio de Git. Si trabaja en un proyecto de código abierto, es más probable que comparta este repositorio en Github u otros hosts 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 usa para enviar su código a Heroku.

¿Cómo trabajar con este caso de uso?

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


3
Comenzaría con el uso de un repositorio privado. Luego, dependiendo de cuánto confío en él, puedo .gitignore mis archivos de configuración que contienen los datos confidenciales y solo los versiono localmente. (Local es una ubicación central no externa que puede ser un servidor interno o quién sabe)
Rig

Respuestas:


30

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

(El siguiente ejemplo, y toda mi respuesta se refieren a aplicaciones de rieles)

$ 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 utilizando 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, establezca estos valores en su .bashrcarchivo

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. Para que pueda evitar guardar esas credenciales en git

Además, también, si está ejecutando su propia aplicación y desea que permanezca privada, una gran alternativa a github es Bitbucket, que ofrece repositorios privados gratuitos.


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 ponerlas en un proyecto diferente, compilarlas y registrar solo el código compilado, no la fuente? Esto no es cifrado y no es adecuado para cifrar contraseñas o claves. La gente aún puede aplicar ingeniería inversa a su código compilado, pero no obtienen la fuente.

Repositorio privado de GIT

¿Tiene que ser un repositorio público de git?

Almacenamiento del servidor

¿Puede almacenar esta información en un archivo protegido en el directorio de inicio de la cuenta de usuario con 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. De lo contrario, podría usarse una variable de entorno. Necesita algún 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 vuelve complicado.

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

Si otros desarrolladores necesitan verificar 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 controle en el control de origen!) Y genere una clave pública a partir de ella. Cifre sus datos secretos con la clave pública del servidor. Solo el servidor puede descifrar esos datos utilizando su clave privada. Incluso puede verificar la clave pública en el control de origen para que otras personas puedan cifrar datos utilizando la misma clave pública y solo el servidor pueda descifrarla.

Herramienta

Openssl es probablemente la única herramienta de criptografía que necesitará. 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 seguro de algún tipo en el servidor para almacenar la clave privada. Es una especie de alucinante que una empresa de hosting no tenga en cuenta esta. ¿Tal vez tienen algunas pistas sobre cómo otros resuelven el desafío que enfrenta?


Para agregar, WRT al almacenamiento del lado del servidor: no sé si puede hacer esto con Heroku, pero he visto configuraciones donde se dispara un script desde el gancho posterior a la recepción y / o algo como Capistrano en el servidor de implementación para copie el archivo de la base de datos de implementación en la ubicación correcta. Esto le permite mantener el archivo de la base de datos fuera del repositorio por completo y tener un mecanismo automático para garantizar que dicha información aún esté en su lugar.
Shauna

Incluso los repositorios privados de GIT deberían proteger los datos confidenciales. Por si acaso se hace público por accidente por un tiempo. Además, creo que siempre debe usarse criptografía asimétrica, en lugar de simétrica. No veo ninguna desventaja, solo esta ventaja: incluso puede dejar API en algún lugar para facilitar el cifrado de datos confidenciales nuevos que deben codificarse.
Tiberiu-Ionuț Stan

7

Si desea ejecutar su código en Heroku, debe dárselos; no puede mantenerlo "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 detalles de alojamiento, necesitaría mantener una bifurcación privada de su proyecto para fines de implementación.


1
Gracias, pero ¿cuál es el flujo de trabajo para esto?
Jonas

6

No deberías estar ocultando partes del código. La seguridad de su sistema no debe depender del 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 criptográficas, 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! Esa es una muy mala práctica.

Ver también:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.