Aller au contenu

Secrets

Passer des secrets sur la ligne de commande est une mauvaise pratique. Les solutions de contournement les plus fréquemment utilisées sont :

  • Le stockage du secret dans un fichier : le secret n’apparaît pas dans l’historique, on le rappelle dans la ligne de commande avec $(cat ./secretFile). Mais on oublie souvent d’effacer le fichier après la fin des opérations, et les secrets sont éparpillés (en clair) sur les serveurs de travail.

  • Fausse bonne idée : Ajouter un espace au début de la commande “bash”. Bien connue des sysadmins, cette astuce permet de ne pas historiser les commandes exécutées. Dans la pratique, il arrive fréquemment d’oublier cet espace et dans un environnement partagé, c’est surtout une très mauvaise pratique. En cas de problème l’historique étant inexistant, la résolution des problèmes devient complexe.

La solution proposée est le support natif de SOPS pour les fichiers d’inventaires. Ce dispositif permet de stocker les secrets chiffrés, et permettre l’intégration dans un dépôt Git.

Lorsque le paramètre ‘-i’ est utilisé avec la commande “run”, “automation-cli” détecte automatiquement le type de cet inventaire. S’il est chiffré avec SOPS, “automation-cli” utilise votre environnement SOPS pour tenter de le déchiffrer. Le déchiffrement est effectué en RAM, et n’effectue aucune copie sur disque.

[...]
// using sops binay with current SOPS environment - result is redirect to variable
const decryptedContent = execSync(`sops --decrypt ${this.filePath}`);
// document is parsed from variable content
yamlDoc = parseDocument(decryptedContent.toString());
[...]

Installation et initialisation de SOPS

SOPS est un projet développé par la fondation Mozilla. Le but étant de pouvoir exposer publiquement des fichiers contenant des secrets (dépôt Git). L’utilisation de fichiers chiffrés implique de disposer de la clé de déchiffrement. La structure du document reste conservée et supporte YAML, env, INI, JSON…

Les clés de chiffrement utilisées sont de type “age”.

Fenêtre de terminal
sudo apt-get install -y age
version="3.9.1"
platform="amd64" # ou arm64
package="/tmp/sops.deb"
sudo wget -O "${package}" "https://github.com/getsops/sops/releases/download/v${version}/sops_${version}_${platform}.deb"
if [ -f "${package}" ];then
sudo dpkg -i "${package}"
else
echo "File ${binary} not found"
exit 1
fi

Création d’une clé ‘age’

Cette clé sera utilisée par SOPS pour chiffrer et déchiffrer les documents SOPS.

Fenêtre de terminal
# idempotent method
# Default user storage path "(home directory)/.config/sops/age"
mkdir -p ~/.config/sops/age
age-keygen >> ~/.config/sops/age/keys.txt
chmod 600 ~/.config/sops/age/keys.txt

La sortie standard expose la clé publique qui sera utilisée pour chiffrer vos documents.

Sauvegarde de la clé dans un gestionnaire de mot de passe

Fenêtre de terminal
cat ~/.config/sops/age/keys.txt

Un secret est établi sur 3 lignes :

# created: 2024-08-16T14:36:52+02:00
# public key: [public key]
AGE-SECRET-KEY-[private key]

Copier les trois lignes dans votre gestionnaire de mot de passe ou encoder ces trois lignes avec base64 : echo "[content]" |base64 -w 0.

Ajout d’une clé existante

Vous disposez déjà d’une clé stockée dans un gestionnaire de mot de passe d’équipe par exemple, pour l’ajouter au portefeuille (existant ou inexistant).

Fenêtre de terminal
# idempotent method
# Default user storage path "(home directory)/.config/sops/age"
mkdir -p ~/.config/sops/age
echo "[key to add (3 lines)]" >> ~/.config/sops/age/keys.txt
#or with base64 content
echo "[base64 content]" |base64 -d >> ~/.config/sops/age/keys.txt
chmod 600 ~/.config/sops/age/keys.txt

Création d’un “inventoryFile” chiffré avec SOPS

Nouveau fichier

Fenêtre de terminal
sops edit --age [age public key] inventory.yaml

Fichier existant

Fenêtre de terminal
sops encrypt --age [age public key] inventory.yaml > inventory.yaml.enc
# delete original
rm inventory.yaml
# rename crypted file to inventoryFile original file name
mv inventory.yaml.enc inventory.yaml

Manipuler les fichiers chiffrés avec SOPS en ligne de commande

Fenêtre de terminal
sops [file full path]

Par défaut sops utilise l’éditeur “vi”, pour utiliser l’éditeur de votre choix (ex : nano), préfixer la commande par : EDITOR="nano" sops [file full path].

Manipuler les fichiers chiffrés avec SOPS dans VSCode

  • Installer l’extension : @signageos/vscode-sops.
  • Ouvrir le fichier chiffré, vous travaillez sur une copie (déchiffré), à chaque modification le contenu “en clair” est chiffré dans le fichier original.