https://github.com/AGWA/git-crypt
Adiciona uma camada de criptografia de arquivos em repositórios git.
Qual o problema que ele resolve?
Permite o armazenamento de informações sensíveis (Ex: Senha do banco de produção) nos repositórios Git que trabalhamos no dia a dia.
Como funciona?
São duas as formas para ter acesso a informação descriptografada:
- Utilizando um arquivo com secret (chave mestra).
- Por usuário (via GPG)
GnuPG
# Verifique se o GPG está instalado
which gpg # type gpg
# Se não estiver, execute (Debian/Ubuntu):
sudo apt update && sudo apt install gnupg
git
# Verifique se o Git está instalado
which git # type git
# Se não estiver, execute (Debian/Ubuntu):
sudo apt update && sudo apt install git
git-crypt
# Instalação para Debian/Ubuntu:
sudo apt install git-crypt
# Verifique a instalação com:
git crypt --version
https://github.com/AGWA/git-crypt/blob/master/INSTALL.md
# Crie uma pasta para o projeto:
mkdir greeter
# Acesse a pasta:
cd greeter
# Inicie o git:
git init
# Crie o programa:
cat <<EOF > greet.sh
#!/bin/bash
while getopts n:name: option
do
case "\${option}"
in
n) NAME=\${OPTARG};;
esac
done
if [ -z "\$NAME" ]; then
NAME=\`cat secretname | head -1\`
fi
echo "Hello \$NAME"
EOF
# Permita a execução do programa:
chmod +x greet.sh
# Teste o executável:
./greet.sh -n Rodrigo # $ Hello Rodrigo
./greet.sh # $ Hello
# Faz o commit do executável:
git add greet.sh
git commit -m 'Add greet.sh'
# Crie o arquivo com o nome secreto:
echo 'Voldemort' > secretname
# Teste o executável novamente:
./greet.sh # Hello Voldemort
Neste ponto finalizamos a implementação do projeto.
Mas o problema que temos é: Se fizermos um commit qualquer usuário poderá ver o nome secreto.
git-crypt em ação!
# Inicie o git-crypt:
git crypt init
# Crie um arquivo para configurar a criptografia:
echo 'secretname filter=git-crypt diff=git-crypt' > .gitattributes
# Verifique se o arquivo desejado será criptogradado:
git crypt status
# not encrypted: .gitattributes
# not encrypted: greet.sh
# encrypted: secretname
# Uma vez que a criptografia foi habilitada, podemos realizar o commit:
git add .gitignore .gitattributes secretname
git commit -m 'Add secretname (encrypted)'
# Faça um clone do repositório
cd ..
git clone greeter _greeter
# Execute o programa para ver o output com conteúdo criptografado.
./greet.sh
# ./greet.sh: line 12: warning: command substitution: ignored null byte in input
# Hello GITCRYPT�ߑ�
# �����q��Q��1@��
#################################
# Descriptografando o conteúdo. #
#################################
# Faça cópia da chave mestra:
cp ../greeter/greeter.key .
# Execute o comando para descriptografia:
git crypt unlock greeter.key
# Verifique se o output ficou legível:
./greet.sh # $ Hello Voldemort
##############################
# Criptografando o conteúdo. #
##############################
git crypt lock
./greet.sh
# ./greet.sh: line 12: warning: command substitution: ignored null byte in input
# Hello GITCRYPT�ߑ�
# �����q��Q��1@��
gpg --full-generate-key
gpg --list-signatures
git-crypt add-gpg-user ABCDFE01
# Como compartilhar (exportar/importar uma chave pública)
# == Via arquivo: ==
gpg --output mygpgkey_pub.gpg --armor --export ABCDFE01
gpg --import ~/mygpgkey_pub.gpg
# https://stackoverflow.com/a/34132924
gpg --edit-key ABCDFE01
# gpg> trust
#
# gpg> 1 = I don't know or won't say
# gpg> 2 = I do NOT trust
# gpg> 3 = I trust marginally
# gpg> 4 = I trust fully
# gpg> 5 = I trust ultimately
# gpg> m = back to the main menu
# == Via servidor de arquivos ==
gpg --keyserver hkps.pool.sks-keyservers.net --send-keys ABCDFE01
gpg --keyserver hkps.pool.sks-keyservers.net --search-keys '[email protected]'
###################################
# Como encriptar arquivos com gpg #
###################################
# == Com senha: ==
gpg -c greeter.key
gpg greeter.key.gpg
# == Assinando para um usuário específico: ==
gpg --encrypt --sign --recipient F93F4A77E2984B98 name
gpg --output name --decrypt name.gpg