Cripta informazioni sensibili prima di conservarle nel tuo repository!
Mandare in commit delle secrets sul tuo repository Git può esporre infromazioni sensibili come passwords e access tokens. Anche se i commit avvengono verso dei repository privati. Se hai intenzione di eseguire delle commit di secrets verso un repository git privato o pubblico che sia, ti consiglio di criptarli prima usando Mozilla SOPS
(il sops è per Secret Operations) e AGE
. SOPS è un editor per criptare i file che supportano i seguenti formati YAML, JSON, ENV, INI e BINARY e li cripta con AWS KMS, GCP KMS, Azure Key Vault, age, e PGP. Age è un semplice, moderno e sicuro tool per criptare file, scritto in Go. Può criptare e decryptare i tuoi files mantenendoli più sicuri prima di mandarli verso il tuo repository o dovunque vuoi conservarli.
Installa SOPS
https://github.com/mozilla/sops
Dalla pagine delle release:
https://github.com/mozilla/sops/releases
1
2
3
wget https://github.com/mozilla/sops/releases/download/v3.7.3/sops_3.7.3_amd64.deb
sudo dpkg -i ./sops_3.7.3_amd64.deb
rm ./sops_3.7.3_amd64.deb
per verificare:
1
sops -v
dovresti vedere la versione
1
sops 3.7.3 (latest)
Installa Age
https://github.com/FiloSottile/age
1
sudo apt install age
o in modo manuale:
prendi il file
1
wget -O age.tar.gz https://github.com/FiloSottile/age/releases/download/v1.0.0/age-v1.0.0-linux-amd64.tar.gz
estrai e spostalo
1
2
3
tar xf age.tar.gz
sudo mv age/age /usr/local/bin
sudo mv age/age-keygen /usr/local/bin
pulizia
1
2
rm -rm age
rm age.tar.gz
verifica age
con:
1
age -version
dovresti visualizzare la versione
1
v1.0.0
verifica age-keygen
con:
1
age-keygen -version
dovresti visualizzare la versione
1
v1.0.0
Configurare le chiavi
Ora che abbiamo age
installato dobbiamo creare le nostre chiavi pubbliche e private
1
age-keygen -o key.txt
l’output sarà
1
2
age-keygen: warning: writing secret key to a world-readable file
Public key: age1epzmwwzw8n09slh0c7z0z52x43nnga7lkksx3qrh07tqz5v7lcys45428t
verifichiamo il contenuto
1
cat key.txt
dovresti vedere
1
2
3
# created: 2022-09-26T21:55:47-05:00
# public key: age1epzmwwzw8n09slh0c7z0z52x43nnga7lkksx3qrh07tqz5v7lcys45428t
AGE-SECRET-KEY-1HJCRJVK7EE3A5N8CRP8YSDUGZKNW90Y5UR2RGYAS8L279LFP6LCQU5ADNR
Ricorda che questo è segreto e dovrai tenerlo tale! Non eseguire dei commit di questo file!
spostiamo il file e aggiungiamo come variabile alla nostra shell
1
2
mkdir ~/.sops
mv ./key.txt ~/.sops
aggiungiamolo alle nostre possibili shell:
1
2
nano ~/.zshrc
# o nano ~/.bashrc
aggiungere alla fine del file
1
export SOPS_AGE_KEY=$HOME/.sops/key.txt
eseguiamo il source della nostra shell
1
2
source ~/.zshrc
# o source ~/.bashrc
Adesso criptiamo
Ci sono diversi modi per farlo. puoi criptarlo direttamente o con un editor.
YAML
Questo esempio è per le secrets di kubernetes, valori helm o semplicemente un file yaml.
crea la secret:
secret.yaml
1
2
3
4
5
6
7
8
9
---
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
namespace: default
stringData:
MYSQL_USER: root
MYSQL_PASSWORD: password-super-segreta!!!!
per criptare il valore
1
sops --encrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") --encrypted-regex '^(data|stringData)$' --in-place ./secret.yaml
per decriptare utilizza:
1
sops --decrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") --encrypted-regex '^(data|stringData)$' --in-place ./secret.yaml
non dimenticarti di aggiungere il file
.decrypted~secret.yaml
sul.gitignore
del repository git
Kubernetes
Se vuoi criptare una secrets al volo e applicarlo poi su kubernetes:
criptiamo prima:
1
sops --encrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") --encrypted-regex '^(data|stringData)$' --in-place ./secret.yaml
decriptiamo e usiamo in pipe kubectl
1
sops --decrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") --encrypted-regex '^(data|stringData)$' ./secret.yaml | kubectl apply -f -
controlliamo la nostra secret con:
1
kubectl describe secrets mysql-secret-test
poi
1
kubectl get secret mysql-secret-test -o jsonpath='{.data}'
successivamente
1
kubectl get secret mysql-secret-test -o jsonpath='{.data.MYSQL_PASSWORD}' | base64 --decode
Visual Studio Code
installa l’estensione su vscode vscode-sops-beta
dal marketplace
scegli la versione beta per sops perchè è quella che supporta age + sops
codifica il file .env
File .ENV
crea
secret.env
MYSQL_USER=root
MYSQL_PASSWORD="password-super-segreta!!!!############"
cripta
1
sops --encrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") -i .env
per decriptare
1
sops --decrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") -i .env
non dimenticarti di aggiungere il file
.decrypted~secret.env
sul.gitignore
del repository git
JSON Files
secret.json
1
2
3
4
{
"mySqlUser": "root",
"password": "password-super-segreta!!!!#######"
}
cripta con:
1
sops --encrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") -i secret.json
decripta con:
1
sops --decrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") -i secret.json
non dimenticarti di aggiungere il file
.decrypted~secret.json
sul.gitignore
del repository git
File INI
secret.ini
1
2
3
[database]
user = root
password = password-super-segreta!!!!1223
cripta con:
1
sops --encrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") -i secret.ini
decripta con:
1
sops --decrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") -i secret.ini
non dimenticarti di aggiungere il file
.decrypted~secret.ini
sul.gitignore
del repository git
Files
secret.sql
1
2
3
--- https://xkcd.com/327/
--- DO NOT USE
INSERT INTO Students VALUES ( 'Mario' ); DROP TABLE STUDENTS; --' )
cripta con:
1
sops --encrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") --in-place ./secret.sql
decripta con:
1
sops --decrypt --age $(cat $SOPS_AGE_KEY |grep -oP "public key: \K(.*)") --in-place ./secret.sql