Post

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.

DISCLAIMER: Questo blog non rappresenta una testata giornalistica in quanto viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge N°62 del 07/03/2001. Leggi di più

© Cybertome. Alcuni diritti riservati.

Servizio offerto da Jekyll con tema Chirpy