Tiene toda la razón al querer cifrar su archivo de configuración confidencial mientras mantiene el archivo en control de versiones. Como mencionó, la mejor solución sería una en la que Git cifre de forma transparente ciertos archivos confidenciales cuando los presione para que localmente (es decir, en cualquier máquina que tenga su certificado) pueda usar el archivo de configuración, pero Git o Dropbox o quien sea almacenar sus archivos en VC no tiene la capacidad de leer la información en texto sin formato.
Tutorial sobre cifrado / descifrado transparente durante Push / Pull
Esta esencia https://gist.github.com/873637 muestra un tutorial sobre cómo usar el controlador de filtro de manchas / limpieza de Git con openssl para encriptar archivos empujados de forma transparente. Solo necesita hacer una configuración inicial.
Resumen de cómo funciona
Básicamente crearás una .gitencrypt
carpeta que contiene 3 scripts de bash,
clean_filter_openssl
smudge_filter_openssl
diff_filter_openssl
que Git usa para descifrar, cifrar y admitir Git diff. Una frase de contraseña maestra y una sal (¡arreglado!) Se definen dentro de estos scripts y DEBE asegurarse de que .gitencrypt nunca se envíe. clean_filter_openssl
Script de ejemplo :
#!/bin/bash
SALT_FIXED=<your-salt> # 24 or less hex characters
PASS_FIXED=<your-passphrase>
openssl enc -base64 -aes-256-ecb -S $SALT_FIXED -k $PASS_FIXED
Similar para smudge_filter_open_ssl
y diff_filter_oepnssl
. Ver Gist.
Su repositorio con información confidencial debe tener un archivo .gitattribute (sin cifrar e incluido en el repositorio) que hace referencia al directorio .gitencrypt (que contiene todo lo que Git necesita para cifrar / descifrar el proyecto de manera transparente) y que está presente en su máquina local.
.gitattribute
contenido:
* filter=openssl diff=openssl
[merge]
renormalize = true
Finalmente, también deberá agregar el siguiente contenido a su .git/config
archivo
[filter "openssl"]
smudge = ~/.gitencrypt/smudge_filter_openssl
clean = ~/.gitencrypt/clean_filter_openssl
[diff "openssl"]
textconv = ~/.gitencrypt/diff_filter_openssl
Ahora, cuando inserta el repositorio que contiene su información confidencial en un repositorio remoto, los archivos se cifrarán de forma transparente. Cuando extrae de una máquina local que tiene el directorio .gitencrypt (que contiene su frase de contraseña), los archivos se descifrarán de forma transparente.
Notas
Debo señalar que este tutorial no describe una forma de cifrar solo su archivo de configuración confidencial. Esto cifrará de forma transparente todo el repositorio que se envía al host VC remoto y descifrará todo el repositorio para que se descifre por completo a nivel local. Para lograr el comportamiento que desea, puede colocar archivos confidenciales para uno o varios proyectos en una sensible_configuración_repo. Podría investigar cómo funciona esta técnica de cifrado transparente con los submódulos Git http://git-scm.com/book/en/Git-Tools-Submodules si realmente necesita que los archivos confidenciales estén en el mismo repositorio.
El uso de una frase de contraseña fija podría conducir teóricamente a vulnerabilidades de fuerza bruta si los atacantes tuvieran acceso a muchos repositorios / archivos cifrados. OMI, la probabilidad de esto es muy baja. Como se menciona en una nota al final de este tutorial, no usar una frase de contraseña fija dará como resultado versiones locales de un repositorio en diferentes máquinas que siempre muestran que se han producido cambios con el 'estado de git'.