Skip to content

Instantly share code, notes, and snippets.

@serradura
Last active September 12, 2022 15:40
Show Gist options
  • Save serradura/f3a6b58c130a0afc480b165fbf40e18f to your computer and use it in GitHub Desktop.
Save serradura/f3a6b58c130a0afc480b165fbf40e18f to your computer and use it in GitHub Desktop.

git-crypt

https://github.com/AGWA/git-crypt

O que é?

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:

  1. Utilizando um arquivo com secret (chave mestra).
  2. Por usuário (via GPG)

Requisitos:

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

Projeto de Exemplo:

1) Criação do projeto

# 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

2) Configuração da criptografia

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)'

3) Verificando a criptografia

# 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@��

4) Fazendo uso do GPG (permissão por usuário)

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment