Outils pour utilisateurs

Outils du site


blog

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

2025/03/24 15:06

Ansible inventory script - inventaire dynamique 2 - CSV

Cahier des charges :

  • Inventaire basé sur un fichier CSV

Voir aussi :

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()
2025/03/24 15:06

GPG - signer une clef - key signing party

Signer la clef de quelqu'un

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>
2025/03/24 15:06

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
2025/03/24 15:06

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

Renew primary key

2025/03/24 15:06
blog.txt · Dernière modification : de 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki