2009-12-29 21 views
29

Supongamos que tenemos un archivo de configuración con contraseñas confidenciales. Me gustaría controlar la versión de todo el proyecto, incluido el archivo de configuración también, pero no quiero compartir mis contraseñas.
Eso podría ser bueno, si este archivo de configuración:Cómo versionar los archivos de configuración de control pragmáticamente?

database_password=secret 
foo=bar 

convierte

database_password=* 
foo=bar 

y los demás usuarios de las VCS también podría configurar la contraseña en su propiedad. Ignorar el archivo no es un buen enfoque, los desarrolladores deben tener en cuenta si el archivo de configuración cambia.

Ejemplo:

versión local:

database_password=own_secret 
foo=bar 

archivo de configuración en VCS:

database_password=* 
foo=bar 

Entonces, de repente, el archivo de configuración cambios:

database_password=* 
foo=bar 
baz=foo 

y lo local versión w debería ser para cada desarrollador:

database_password=own_secret 
foo=bar 
baz=foo 

Esta es mi solución. ¿Cómo podría lograr este comportamiento? ¿Cómo almacena sus archivos de configuración? ¿Hay alguna manera de hacerlo, o debería piratear algo?

+6

archivos de configuración no deben contener contraseñas en texto claro .... –

+1

, de hecho, es preferible no tener nunca cualquier tipo de contraseña en un archivo de configuración ... a menos que sea una configuración mantenida por el servidor, e incluso entonces ... –

+0

@Mitch: mi aplicación web PHP (basada en ZF) lee las credenciales de la base de datos desde texto plano. ¿Dónde debería almacenarlos? – erenon

Respuesta

25

En lugar de controlar la versión del archivo de configuración real, puede poner una plantilla o archivo predeterminado en control de versión y un script que solicite información de DB y credencial para generar el archivo de configuración real, que se excluirá de (es decir, ignorado por) control de versiones. Al finalizar la compra, los desarrolladores podrían ejecutar este script para obtener un entorno de trabajo. Este script también se puede invocar como parte de cualquier proceso de instalación que use su aplicación.

También see my answer a una pregunta similar.

+0

Bien explicado, gracias. – erenon

0

En mis proyectos utilizo un directorio que contiene este tipo de archivos pero no se carga en el servidor, por lo que mi archivo de configuración db está en ese directorio y está configurado para el servidor donde se ubica el proyecto. Si alguien cambia el archivo de configuración, cambiará el archivo de configuración del servidor y cualquiera que actualice la revisión verá los cambios en ese archivo y necesitará cambiar manualmente su configuración local.

No veo la manera de hacerlo en lugar de eso. Si encuentra un enfoque diferente, por favor comparta.

+0

Creo que es mejor mantener el archivo de configuración en ignorado, y después de la modificación, cambiar la contraseña a *, confirmarlo, luego establecer ignorar indicador nuevamente, luego cambie * de nuevo a contraseña. – erenon

+0

@erenon Eso parece un montón de problemas. Esperaría que los desarrolladores terminen eludiendo esto o eviten comprometerse regularmente (cometiendo el archivo de configuración de todos modos). Aunque es posible, usted podría programar todo el procedimiento. – Matthew

1

¿Tiene un archivo separado con SÓLO los secretos, que no está bajo control de versión?

O, idealmente, elimine las contraseñas y use openssh, o similar, y realice la autenticación de clave pública/privada para cada usuario.

+0

Las contraseñas son utilizadas por un programa PHP para conectar una base de datos. – erenon

1

Estoy acostumbrado a hacer un archivo txt con la estructura del archivo de configuración. Y después de eso, haré una copia y cambiaré la extensión y dejaré que mi sistema de control de versiones ignore este (s) archivo (s).

Por lo tanto, cuando realice cambios en el archivo de configuración, simplemente actualice la versión de texto. Esa es la única opción que se me ocurre, que es la lógica, así (en mis ojos)

+0

Este enfoque viola el principio de DRY. De todos modos, podría funcionar. – erenon

9
No

seguro de cómo se implementa su configuración, pero tener overides jerárquica es cómo iba a manejar esto.

Tiene una configuración principal que contiene configuración común más nombre de usuario/contraseña ficticia (o los omite por completo). Cada desarrollador crea un override.config local (o lo que sea) con su nombre de usuario/contraseña específico. La configuración principal pasa a estar bajo control de fuente, las modificaciones locales del desarrollador (o máquina) no lo hacen.

He hecho esto en .NET pero no en PHP, así que no sé qué tan fácil sería, me temo.

+0

Esto parece muy inteligente. Para lograr esto tal vez solo tenga que subclasificar el analizador de configuración de mi framework. – erenon

+1

+1 Así manejamos exactamente los archivos de configuración en casi todos nuestros proyectos, con diferentes niveles de jerarquías. – ZoogieZork

2

¿Qué tal un gancho precompromiso para borrar los campos confidenciales? Esto supone que te sientes cómodo enviando el archivo a través de la red en primer lugar, por supuesto.

Actualización para el otro extremo del problema:
Para tratar las actualizaciones, que había ya sea quiere forzar una fusión manual de los archivos confidenciales, o modificar el proceso de construcción locales sobreescribir las líneas sensibles con el contenido de un local/privado/archivo ignorado.

+0

Acabo de mencionar los ganchos precompromisos en mi comentario, pero esta técnica funciona solo de una manera. Cada desarrollador debe actualizar sus propios campos de contraseña después de cada actualización y anulación. – erenon

0

Tuve algo similar a esto aunque no sé si funcionaría para usted. Tenía un directorio que contenía archivos que contenían contraseñas. Este directorio no estaba controlado por la versión. Los archivos fueron nombrados después de las aplicaciones que los usaron y en los archivos de configuración, obtuve el archivo de contraseña apropiado en el momento en que era necesario. Esto exigiría que su analizador de configuración pueda manejar el origen.

4

Crea un archivo de modificaciones locales que contiene la información específica del usuario como variables de PHP.

Por ejemplo crear un archivo llamado local_overrides.php que contiene lo siguiente:

$local_password = 'qUzaEAFK13uK2KHy'; 

A continuación, en el archivo que incluye su contraseña de base de hacer algo como esto

$overrides = 'local_overrides.php'; 

if (file_exists($overrides)) { 
    #include_once($overrides); 
    $db_password = $local_password; 
} else { 
    // perform appropriate action: set default? echo error message? log error?  
    $db_password = 'l1m1t3d!' 
} 

El archivo se anula locales nunca debe ser visto por control de fuente.

Cuestiones relacionadas