Table des matières
- 2026:
- 2025:
4 billet(s) pour septembre 2026
| Notes HTTP Strict Transport Security - HSTS | 2026/09/18 11:04 | Jean-Baptiste |
| Notes GNU Linux GPU carte graphiques | 2026/09/08 15:49 | Jean-Baptiste |
| Notes GNU Linux graphique | 2026/09/08 15:42 | Jean-Baptiste |
| Notes urlencoding - passer des mots de passe en HTTPS | 2026/09/03 17:58 | Jean-Baptiste |
GPG - Toile de confiance - Web of Trust
Voir aussi :
Comment importer la clé publique Ouvrir une fenêtre dos puis taper les commandes dans l’ordre ci-dessous
gpg --import </repertoire>/correspondant.pg
gpg: key 47C22EFD: public key "Igor < >" imported
gpg: Total number processed: 1
gpg: imported: 1
gpg --edit-key mail@truc.com
gpg (GnuPG) 1.4.1; Copyright (C) 2005 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.
pub 1024D/47C22EFD created: 2005-12-23 expires: never usage: CS
trust: unknown validity: unknown
sub 2048g/AD4240EC created: 2005-12-23 expires: never usage: E
[ unknown] (1). Igor BAREEV mail@truc.com
Command> trust
pub 1024D/47C22EFD created: 2005-12-23 expires: never usage: CS
trust: unknown validity: unknown
sub 2048g/AD4240EC created: 2005-12-23 expires: never usage: E
[ unknown] (1). Igor BAREEV mail@truc.com
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)
1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu
Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y
1.3 Comment encrypter un fichier avec la clé publique du partenaire truc
Synthaxe:
gpg --encrypt -a -r mail@truc.com file
Il suffit ensuite de créer un batch en fonction d’où est déposé le fichier de virement des paies
C:\batch\Pgp_encryption.bat
gpg --encrypt -a -r mail@truc.com C:\VIRTPAYE\*
Sauvegardes \ Voir --export-ownertrust
Ansible inventory script - inventaire dynamique 2 - CSV
Cahier des charges :
- Inventaire basé sur un fichier CSV
Voir aussi :
- Les options :
Host Filter,Enabled Variable,Enabled Value
Exemple de fichier CSV
inv.csv
hostname;fqdn;env;ip;env;os_system;os_distrib;os_majeur_version srvweb1;srvweb1.acme.local;prod;192.168.1.10;linux;redhat;8 srvweb2;srvweb2.acme.local;dev;192.168.1.11;linux;redhat;8
Script Python d'Inventory Script
inventory_from_csv.py
#!/usr/bin/env python3 """ CSV external inventory script. # Creative Commons CC0 Public Domain Licence """ import sys import csv import argparse import json from ansible.module_utils._text import to_text _GROUP = 'GROUPE1' mapping = {} def parser_args(): parser = argparse.ArgumentParser(description="") parser.add_argument('--list', default=False, dest="list", action="store_true", help="Produce a JSON consumable grouping of servers for Ansible") parser.add_argument('--host', default=None, dest="host", help="Generate additional host specific details for given host for Ansible") return parser def mk_inventory_from_csv(): """ Make inventory from CSV file """ mapping['_meta']={} mapping['_meta']['hostvars']={} mapping[_GROUP]={} mapping[_GROUP]['hosts'] = [] with open('inv.csv', newline=`) as csvfile: csvreader = csv.DictReader(csvfile, delimiter=';') for row in csvreader: hostname = to_text(row['hostname'].strip()) mapping['_meta']['hostvars'][hostname]={} mapping['_meta']['hostvars'][hostname]['ansible_host'] = to_text(row['fqdn'].strip()) mapping['_meta']['hostvars'][hostname]['env'] = to_text(row['env'].strip()) mapping[_GROUP]['hosts'].append(hostname) def get_host_details(host): """ Get json hostvars for specified host """ host = mapping['_meta']['hostvars'][host] return json.dumps(host, indent=4) args = parser_args().parse_args() def main(): if args.list: mk_inventory_from_csv() print(json.dumps(mapping, indent=4)) sys.exit(0) elif args.host: mk_inventory_from_csv() print(get_host_details(args.host)) sys.exit(0) else: parser_args.print_help() sys.exit(0) if __name__ == '__main__': main()
On test
chmod +x inventory_from_csv.py ./inventory_from_csv.py --list | jq . ./inventory_from_csv.py --host srvweb1 | jq . ansible-inventory -i inventory_from_csv.py --list ansible-inventory -i inventory_from_csv.py --host srvweb1
Annexes
Script Python sql2csv
sql2csv.py
#! /usr/bin/env python3 """ Make CSV inventory file from SQL query (CMDB) """ import os import pyodbc cfg_csv_path = os.environ["INVENTORY_OPT_CSV_PATH"] cfg_queryname = os.environ["INVENTORY_OPT_QUERYNAME"] db_user = os.environ["MSSQL_LOGIN_USER"] db_pass = os.environ["MSSQL_LOGIN_PASSWORD"] db_name = os.environ["MSSQL_LOGIN_DATABASE"] db_host = os.environ["MSSQL_LOGIN_HOST"] db_port = os.environ["MSSQL_LOGIN_PORT"] def clean_field(field): """ Clean each fields. CSV use ';' as field separator and so all ';' characters must be removed CSV use line break as line separator and so all '\n' and '\r' characters must be replaced """ if field is None or field == "Undefined": ret = "" else: ret = str(field).strip().replace(";", "").replace("\n", ",").replace("\r", ",") return ret with open(f"config/{cfg_queryname}/query.sql", "r") as f: query = f.read().strip() def main(): db = pyodbc.connect( DRIVER="FreeTDS", Server=db_host, Port=db_port, Database=db_name, UID=db_user, PWD=db_pass, ) cursor = db.cursor() result = cursor.execute(query) with open(cfg_csv_path, mode="w") as file_object: headers = [] for row in result.description: headers.append(row[0]) print(";".join(headers), file=file_object) for row in result: print(";".join(list(map(clean_field, row))), file=file_object) main()
GPG - signer une clef - key signing party
Signer la clef de quelqu'un
Voir :
Signer la clef de qqun 1
Importation de la clef en local
# Vérifier l'emprunte avant de l'importer gpg --with-fingerprint key.asc # Puis si OK gpg --import key.asc
Ou importation de la clef depuis internet
gpg --recv-key '<fingerprint>'
Vérifier
gpg -v --fingerprint '<fingerpring>'
Si ok signez localement la clef
gpg --lsign-key '<fingerprint>'
Pour changer la confiance a accorder à la personne (optionnel)
gpg --edit-key '<fingerprint>'
3 est un bon choix
Ou pour la signer et l'envoyer sur le serveur de clefs
#gpg --sign-key --ask-cert-level '<fingerprint>' gpg --sign-key '<fingerprint>' gpg --send-keys --keyserver '<fingerprint>'
Donnez votre signature à la personne concernée
gpg --output ~/signed.key --export --armor email@example.com
La personne devra faire
gpg --import ~/signed.key
Signer la clef de qqun 2
gpg --ask-cert-level --sign-key jean@acme.fr
Exporter la signature
gpg -a --export jean@acme.fr > jean_at_acme.fr.asc gpg --sign --encrypt -r jean@acme.fr jean_at_acme.fr.asc
Recevoir une signature
gpg --decrypt jean_at_acme.fr.asc.gpg gpg --import jean_at_acme.fr.asc
Vérifier puis exporter la signature
gpg --list-sigs jean@acme.fr gpg --send-keys <KeyID>
GPG - Script - batch - auto encrypt
Voir aussi :
Par défaut GPG utilise le dossier « .gnupg » dans le HOMEDIR de l'utilisateur. Il contient notamment la configuration, le trousseau de clefs, le trust database etc…
Or notre besoin actuel est juste de pouvoir chiffrer un fichier avec une clef publique déterminée. Je propose une approche “stateless” où le trousseau de clefs serait créé avant chaque chiffrement et détruit à la fin.
Par exemple pour chiffrer “secret_plan_to_rule_the_world.txt” avec la clef publique de Bob :
bash gpg-auto-encrypt.sh -k bob.pub.asc -i secret_plan_to_rule_the_world.txt -o encrypted-data.txt.gpg
Le fichier “encrypted-data.txt.gpg” a été généré et peut être envoyé. Seul Bob pourra le déchiffrer.
En cas de changement de clef, il suffit de remplacer le fichier “bob.pub.asc”
Il manque cruellement la vérification de Signature \ Sans signature rien de garantie que le fichier chiffré n’a été altéré volontairement ou pour des causes techniques.\ Sans signature vous pouvez faire confiance sur le fait que seul Bob pourra déchiffré le fichier (à condition d’être certain de la clef de Bob et que Bob ai bien protégé sa clef privée) \ Mais Bob ne peut pas avoir confiance en votre fichier.
gpg-auto-encrypt.sh
#! /bin/bash set -euo pipefail export LC_ALL=C SCRIPT_NAME="$(basename "$0")" install -d "${HOME}/tmp/" GNUPGHOME="$(mktemp -d -p "${HOME}/tmp/" --suffix=_"${SCRIPT_NAME%%.*}")" trap 'rm -rf "$GNUPGHOME"' EXIT gpg_import() { PUBKEY_ID=$(gpg --batch --import "${PUBKEY_FILE}" 2>&1 | awk '/^gpg: key / {gsub(":", "") ; print $3 ;}') } gpg_encrypt() { gpg --batch --trust-model always --output "$OUTPUT_FILE" -r "${PUBKEY_ID}" --encrypt "$DATA_FILE" } main() { gpg_import gpg_encrypt } usage() { cat <<-EOF Usage: $0 -k KEY_FILE -i INPUT_FILE -o OUTPUT_FILE Mandatory arguments: -k FILE Public key file. -i FILE File to encrypt. -o FILE Encrypted file to write. Example : $0 -k bob.pub.asc -i secret_plan_to_rule_the_world.txt -o encrypted-data.txt.gpg EOF } ARGS_COUNT="$#" while [ "${1-}" != "" ]; do case $1 in -k) shift PUBKEY_FILE=$1 ;; -i) shift DATA_FILE=$1 ;; -o) shift OUTPUT_FILE=$1 ;; -h | --help) usage exit 0 ;; --) # End of all options shift break ;; -*) echo "SCRIPT_NAME: invalid option" >&2 echo "Try '$SCRIPT_NAME --help' for more information." >&2 exit 1 ;; *) usage ;; esac shift done if [ "$ARGS_COUNT" -lt 6 ]; then usage exit 1 fi main
GPG - Renouvellement de clefs
Revoke
Revoquer ca clef https://www.gnupg.org/gph/en/manual/c235.html
gpg --gen-revoke 50D12DE07663C664 --output ~/revocation.crt chmod 600 ~/revocation.crt
gpg --import ~/.gnupg/email@domain.tld.rev.asc gpg --export -a your_keyid >mykey.asc gpg --keyserver subkeys.pgp.net --send 50D12DE07663C664 gpg --keyserver pgp.mit.edu --send-keys mykey
revkey revsig save
gpg --import ~/.gnupg/email@domain.tld.public_key.asc ~/.gnupg/email@domain.tld.private_key.asc gpg --edit-key email@domain.tld
Expired
Que faire quand la clef a expirée
https://makandracards.com/makandra-orga/13644-what-to-do-when-your-gpg-pgp-key-expires
gpg --edit-key 0x12345678 gpg> expire ... gpg> save
gpg --edit-key 0x12345678 gpg> key 1 gpg> expire ... gpg> key 1 gpg> key 2 gpg> expire ... gpg> save
