Post

Cripta informazioni sensibili prima di conservarle nel tuo repository!

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
Questo post è sotto licenza CC BY 4.0 a nome dell'autore.