« Unix pass » : différence entre les versions
| (7 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
== Introduction == | |||
=== '''1. À quoi sert le paquet <code>pass</code> ?''' === | |||
* <code>pass</code> est le '''gestionnaire de mots de passe Unix'''. | |||
* Il stocke tes mots de passe dans des fichiers texte '''chiffrés avec GPG'''. | |||
* Chaque entrée est un fichier <code>.gpg</code> dans <code>~/.password-store</code>. | |||
* Il fournit des commandes simples : | |||
** <code>pass insert service/login</code> → ajoute un mot de passe | |||
** <code>pass show service/login</code> → affiche le mot de passe | |||
** <code>pass git ...</code> → versionne le store avec Git | |||
----- | |||
=== '''2. À quoi sert le paquet <code>gnupg</code> ?''' === | |||
* <code>gnupg</code> (GNU Privacy Guard) est l’outil qui gère la '''cryptographie'''. | |||
* Il permet de : | |||
** Générer des '''paires de clés''' (publique/privée). | |||
** Chiffrer/déchiffrer les fichiers. | |||
* <code>pass</code> utilise GPG pour '''chiffrer les mots de passe''' avec ta clé publique et les déchiffrer avec ta clé privée. | |||
----- | |||
=== '''3. Leur utilisation complémentaire''' === | |||
* <code>pass</code> '''ne chiffre rien par lui-même''' → il délègue à <code>gnupg</code>. | |||
* Workflow : | |||
*# Tu crées une clé GPG (<code>gpg --gen-key</code>). | |||
*# Tu dis à <code>pass</code> quelle clé utiliser (<code>pass init <ID_clé></code>). | |||
*# Chaque mot de passe est stocké dans un fichier <code>.gpg</code> chiffré avec cette clé. | |||
----- | |||
=== '''4. Est-ce un équivalent à KeePass ?''' === | |||
* Oui, '''fonctionnellement''', <code>pass</code> est une alternative à KeePass : | |||
** KeePass = base de données chiffrée (format <code>.kdbx</code>). | |||
** <code>pass</code> = arborescence de fichiers chiffrés GPG. | |||
* Différences : | |||
** KeePass → interface graphique, multiplateforme, plugins. | |||
** <code>pass</code> → CLI, très Unix, intégration Git native. | |||
* Avantage de <code>pass</code> : | |||
** '''Simplicité''', '''portabilité''', '''intégration Git'''. | |||
* Avantage de KeePass : | |||
** '''UI conviviale''', '''plugins''', '''multi-device sans config complexe'''. | |||
== 🔐 1. <code>pass</code> – Le gestionnaire de mots de passe Unix == | == 🔐 1. <code>pass</code> – Le gestionnaire de mots de passe Unix == | ||
| Ligne 20 : | Ligne 69 : | ||
<ul> | <ul> | ||
<li><p>'''Ajouter un mot de passe''' :</p> | <li><p>'''Ajouter un mot de passe''' :</p> | ||
<syntaxhighlight lang="bash">pass insert perso/site-web</syntaxhighlight> | |||
ou | |||
<syntaxhighlight lang="bash">pass add perso/site-web</syntaxhighlight> | <syntaxhighlight lang="bash">pass add perso/site-web</syntaxhighlight> | ||
<p>→ tape ton mot de passe quand demandé</p></li> | <p>→ tape ton mot de passe quand demandé</p></li> | ||
| Ligne 25 : | Ligne 76 : | ||
<li><p>'''Lister les entrées''' : <code>bash pass ls</code></p></li> | <li><p>'''Lister les entrées''' : <code>bash pass ls</code></p></li> | ||
<li><p>'''Supprimer une entrée''' : <code>bash pass rm perso/site-web</code></p></li></ul> | <li><p>'''Supprimer une entrée''' : <code>bash pass rm perso/site-web</code></p></li></ul> | ||
== 🔐 2. Commandes pratiques (compatibles Debian 13) pour : == | |||
# '''Voir les TTL effectifs de gpg‑agent''' | |||
# '''Vérifier que l’agent tourne''' (ou le lancer si besoin) | |||
----- | |||
=== 1) Afficher les TTL effectifs (default & current) === | |||
<syntaxhighlight lang="bash"># Affiche les valeurs "default" et "current" vues par gpg-agent | |||
gpgconf --list-options gpg-agent \ | |||
| awk -F: '/^default-cache-ttl|^max-cache-ttl/ {printf "%-20s default=%s current=%s\n",$1,$7,$10}'</syntaxhighlight> | |||
* <code>default-cache-ttl</code> : durée par défaut (en secondes) de mise en cache de ta passphrase. | |||
* <code>max-cache-ttl</code> : durée maximale (plafond) autorisée. | |||
<blockquote>Si aucune « current » n’est définie dans la conf utilisateur, ce seront les '''valeurs par défaut''' de GnuPG: typiquement '''600 s''' (10min) pour <code>default-cache-ttl</code> et '''7200 s''' (2h) pour <code>max-cache-ttl</code>.<br /> | |||
Tu peux aussi vérifier ce que tu as explicitement configuré : | |||
</blockquote> | |||
<syntaxhighlight lang="bash">grep -E '^(default|max)-cache-ttl' "$HOME/.gnupg/gpg-agent.conf" || echo "Aucun TTL défini dans gpg-agent.conf (valeurs par défaut appliquées)"</syntaxhighlight> | |||
<blockquote>Référence: la conf du cache TTL est gérée par '''gpg-agent''', pas par <code>pass</code> lui‑même (voir la doc man de pass et gpg-agent). | |||
</blockquote> | |||
----- | |||
=== 2) Vérifier que gpg‑agent tourne (et obtenir son socket) === | |||
==== Méthode simple (et idempotente) ==== | |||
<syntaxhighlight lang="bash"># Lance l’agent si besoin (sans créer de doublons), ne produit pas d’erreur si déjà lancé | |||
gpgconf --launch gpg-agent | |||
# Récupère le chemin du socket | |||
SOCK="$(gpgconf --list-dirs agent-socket)" | |||
echo "Socket gpg-agent: $SOCK" | |||
# Vérifie que le socket existe | |||
ls -l "$SOCK"</syntaxhighlight> | |||
==== Tester la communication avec l’agent ==== | |||
<syntaxhighlight lang="bash"># Interroge l'agent (retourne la version si OK) | |||
gpg-connect-agent 'GETINFO version' /bye</syntaxhighlight> | |||
==== (Optionnel) Voir le/les processus ==== | |||
<syntaxhighlight lang="bash">pgrep -a gpg-agent || echo "Aucun processus gpg-agent visible (il peut être auto-spawn via le socket)"</syntaxhighlight> | |||
<blockquote>Points à connaître dans un '''container Docker''' : | |||
* <code>gpgconf --launch gpg-agent</code> et <code>gpg-connect-agent</code> suffisent : gpg-agent est '''auto‑démarré à la demande''' via le socket UNIX, même sans systemd. | |||
* Si tu utilises <code>pinentry-mode loopback</code> (fréquent en CI/container), pense à l’option <code>--pinentry-mode=loopback</code> côté GnuPG/<code>gpg</code> et/ou à configurer <code>allow-loopback-pinentry</code> dans <code>gpg-agent.conf</code>. | |||
</blockquote> | |||
----- | |||
=== Bonus : remettre à jour l’agent après modification des TTL === | |||
Si tu modifies <code>~/.gnupg/gpg-agent.conf</code> : | |||
<syntaxhighlight lang="bash">gpgconf --reload gpg-agent | |||
# puis re-vérifie : | |||
gpgconf --list-options gpg-agent | awk -F: '/^default-cache-ttl|^max-cache-ttl/ {printf "%-20s default=%s current=%s\n",$1,$7,$10}'</syntaxhighlight> | |||
Le délai avant que <code>pass show</code> te redemande la '''passphrase GPG''' dépend du '''cache d’agent GPG''' (gpg-agent), pas de <code>pass</code> lui-même. | |||
=== Par défaut : === | |||
* '''gpg-agent''' garde la passphrase en mémoire pendant '''600 secondes (10 minutes)''' après la dernière utilisation. | |||
* Ce délai est contrôlé par les paramètres : | |||
** <code>default-cache-ttl</code> (par défaut 600 s) | |||
** <code>max-cache-ttl</code> (par défaut 7200 s = 2 h) | |||
Ces paramètres se trouvent dans le fichier : | |||
<pre>~/.gnupg/gpg-agent.conf</pre> | |||
=== Pour vérifier ou modifier : === | |||
Ajoute par exemple : | |||
<pre>default-cache-ttl 3600 # 1 heure | |||
max-cache-ttl 7200 # 2 heures</pre> | |||
Puis recharge l’agent : | |||
<syntaxhighlight lang="bash">gpgconf --reload gpg-agent</syntaxhighlight> | |||
== 🔐 3. Script pour configurer et visualiser gpg‑agent == | |||
(avec '''paramètre d’entrée''') | |||
* '''Par défaut (sans option)''' → il '''affiche uniquement''' l’état de <code>gpg-agent</code> + les TTL actuels. | |||
* '''Avec <code>--set-ttl <DEF> <MAX></code>''' → il '''applique''' les TTL (en secondes), '''recharge''' l’agent, puis '''réaffiche''' les valeurs. | |||
<blockquote>Rappel : les TTL (<code>default-cache-ttl</code> / <code>max-cache-ttl</code>) sont gérés par '''gpg‑agent''' (pas par <code>pass</code>). On peut les lire et recharger via <code>gpgconf</code>. [https://man.archlinux.org/man/pass.1.en.raw [man.archlinux.org]] | |||
</blockquote> | |||
----- | |||
=== Script : <code>pass-ttl-check.sh</code> === | |||
<pre> | |||
Ce script vérifie l’état de gpg-agent et ses TTL (durées de cache), et permet de définir de nouvelles valeurs pour default-cache-ttl et max-cache-ttl dans gpg-agent.conf puis de recharger l’agent pour les appliquer immédiatement. | |||
</pre> | |||
<blockquote>Installe-le, par exemple dans <code>~/bin/pass-ttl-check.sh</code>, puis :<br /> | |||
<code>chmod +x ~/bin/pass-ttl-check.sh</code> | |||
</blockquote> | |||
<syntaxhighlight lang="bash">#!/usr/bin/env bash | |||
set -euo pipefail | |||
# ------------------------------------------------------------ | |||
# pass-ttl-check.sh | |||
# - Sans option : montre l'état de gpg-agent + TTL effectifs. | |||
# - --set-ttl <DEF> <MAX> : applique les TTL et recharge l'agent. | |||
# ------------------------------------------------------------ | |||
# Couleurs (facultatif) | |||
BOLD="\033[1m"; DIM="\033[2m"; RED="\033[31m"; GREEN="\033[32m"; YELLOW="\033[33m"; NC="\033[0m" | |||
info() { echo -e "${BOLD}$*${NC}"; } | |||
warn() { echo -e "${YELLOW}[!]${NC} $*"; } | |||
err() { echo -e "${RED}[x]${NC} $*" 1>&2; } | |||
ok() { echo -e "${GREEN}[ok]${NC} $*"; } | |||
need_bin() { | |||
command -v "$1" >/dev/null 2>&1 || { err "Commande requise non trouvée: $1"; exit 1; } | |||
} | |||
usage() { | |||
cat <<'USAGE' | |||
Usage: | |||
pass-ttl-check.sh # Affiche uniquement les infos (gpg-agent + TTL) | |||
pass-ttl-check.sh --set-ttl <DEF> <MAX> | |||
# Définit les TTL (secondes) puis reload gpg-agent | |||
pass-ttl-check.sh -h | --help # Aide | |||
Exemples : | |||
pass-ttl-check.sh | |||
pass-ttl-check.sh --set-ttl 3600 7200 | |||
USAGE | |||
} | |||
conf_file_path() { echo "${HOME}/.gnupg/gpg-agent.conf"; } | |||
ensure_gnupg_perms() { | |||
[[ -d "${HOME}/.gnupg" ]] || mkdir -p "${HOME}/.gnupg" | |||
chmod 700 "${HOME}/.gnupg" || true | |||
} | |||
launch_agent() { gpgconf --launch gpg-agent >/dev/null 2>&1 || true; } | |||
agent_socket() { gpgconf --list-dirs agent-socket 2>/dev/null || true; } | |||
check_agent() { | |||
launch_agent | |||
local sock; sock="$(agent_socket)" | |||
if [[ -n "${sock}" && -S "${sock}" ]]; then | |||
ok "gpg-agent dispo (socket: ${sock})" | |||
else | |||
warn "Socket gpg-agent introuvable (l'agent peut être auto-spawn via le socket)." | |||
fi | |||
if gpg-connect-agent 'GETINFO version' /bye >/dev/null 2>&1; then | |||
local ver | |||
ver="$(gpg-connect-agent 'GETINFO version' /bye 2>/dev/null | awk '{print $2}')" | |||
ok "Communication gpg-agent OK (version: ${ver})" | |||
else | |||
err "Impossible de communiquer avec gpg-agent." | |||
exit 1 | |||
fi | |||
} | |||
show_ttls() { | |||
info "\n--- TTL vus par gpg-agent ---" | |||
# gpgconf --list-options gpg-agent : colonnes séparées par ':'. | |||
# Nous affichons colonnes 7 (default) et 10 (current) pour les deux paramètres intéressants. | |||
if ! gpgconf --list-options gpg-agent \ | |||
| awk -F: '/^(default-cache-ttl|max-cache-ttl)/{ | |||
name=$1; def=$7; cur=$10; if(cur=="") cur="(defaut)"; | |||
printf "%-20s default=%-6s current=%s\n", name, def, cur | |||
}'; then | |||
warn "Impossible de lire les options via gpgconf." | |||
fi | |||
# Montre ce qui est explicitement posé dans le fichier de conf (si présent) | |||
local conf; conf="$(conf_file_path)" | |||
echo | |||
info "--- Contenu TTL dans ${conf} (si existant) ---" | |||
if [[ -f "$conf" ]]; then | |||
grep -E '^(default|max)-cache-ttl' "$conf" || echo "(aucune ligne TTL explicite)" | |||
else | |||
echo "(fichier absent)" | |||
fi | |||
} | |||
apply_ttls() { | |||
local DEF_TTL="$1" MAX_TTL="$2" | |||
[[ "$DEF_TTL" =~ ^[0-9]+$ && "$MAX_TTL" =~ ^[0-9]+$ ]] || { err "TTL non numériques."; exit 1; } | |||
ensure_gnupg_perms | |||
local conf; conf="$(conf_file_path)" | |||
[[ -f "$conf" ]] && cp -a "$conf" "${conf}.bak.$(date +%Y%m%d-%H%M%S)" && ok "Backup: ${conf}.bak.*" | |||
# Réécrit (ou crée) en supprimant d'éventuelles anciennes lignes TTL | |||
{ [[ -f "$conf" ]] && grep -Ev '^(default|max)-cache-ttl' "$conf" || true; } > "${conf}.tmp" | |||
{ | |||
echo "default-cache-ttl ${DEF_TTL}" | |||
echo "max-cache-ttl ${MAX_TTL}" | |||
# Optionnel si tu utilises --pinentry-mode loopback : | |||
# echo "allow-loopback-pinentry" | |||
} >> "${conf}.tmp" | |||
mv "${conf}.tmp" "$conf" | |||
chmod 600 "$conf" | |||
ok "TTL écrits dans ${conf} (default=${DEF_TTL}s, max=${MAX_TTL}s)" | |||
# Recharge l'agent pour prise en compte immédiate | |||
if gpgconf --reload gpg-agent; then | |||
ok "gpg-agent rechargé" | |||
else | |||
warn "Reload gpg-agent non concluant (l'agent se relancera au prochain usage)." | |||
fi | |||
} | |||
main() { | |||
# Dépendances minimales | |||
need_bin gpgconf | |||
need_bin gpg-connect-agent | |||
need_bin awk | |||
case "${1:-}" in | |||
-h|--help) usage; exit 0 ;; | |||
--set-ttl) | |||
[[ $# -eq 3 ]] || { err "Arguments manquants pour --set-ttl"; usage; exit 1; } | |||
info "=== Application des TTL demandés ===" | |||
check_agent | |||
apply_ttls "$2" "$3" | |||
show_ttls | |||
;; | |||
"") | |||
info "=== Informations gpg-agent & TTL ===" | |||
check_agent | |||
show_ttls | |||
;; | |||
*) | |||
err "Option inconnue: $1"; usage; exit 1 ;; | |||
esac | |||
} | |||
main "$@"</syntaxhighlight> | |||
----- | |||
=== Utilisation === | |||
* '''Afficher uniquement les infos (par défaut)''' : <code>bash ~/bin/pass-ttl-check.sh</code> | |||
* '''Appliquer des TTL (seconds) puis recharger l’agent''' : <code>bash ~/bin/pass-ttl-check.sh --set-ttl 3600 7200</code> → <code>default-cache-ttl = 3600</code> (1h), <code>max-cache-ttl = 7200</code> (2h). | |||
----- | |||
== Références == | |||
* '''Man page officielle de <code>pass</code>''' (alias <code>add</code> ↔ <code>insert</code>, et bonnes pratiques): [https://man.archlinux.org/man/pass.1.en.raw [man.archlinux.org]] | |||
* '''<code>gpg-agent</code> / <code>gpgconf</code>''' (lecture/écriture des options, reload de l’agent): la gestion des TTL se fait côté agent et s’observe via <code>gpgconf --list-options gpg-agent</code>, rechargée via <code>gpgconf --reload gpg-agent</code>. [https://man.archlinux.org/man/pass.1.en.raw [man.archlinux.org]] | |||
== Complément == | |||
Utlisation de <code>dirmngr</code> et <code>pinentry-tty</code> | |||
----- | |||
=== '''1. <code>dirmngr</code>''' === | |||
* '''Rôle :'''<br /> | |||
<code>dirmngr</code> est un composant de GnuPG qui gère les '''connexions réseau pour les clés'''.<br /> | |||
Il sert principalement à : | |||
** Télécharger des clés publiques depuis des '''serveurs de clés''' (HKP, LDAP). | |||
** Vérifier les '''CRL''' (listes de révocation). | |||
** Gérer la communication avec des services externes (par exemple pour la validation des certificats). | |||
* '''Pourquoi utile avec <code>pass</code> ?'''<br /> | |||
Si tu veux importer une clé GPG distante ou vérifier sa validité, <code>dirmngr</code> est nécessaire. Sans lui, <code>gpg --recv-keys</code> ne fonctionne pas. | |||
----- | |||
=== '''2. <code>pinentry-tty</code>''' === | |||
* '''Rôle :'''<br /> | |||
<code>pinentry</code> est le programme qui affiche la '''boîte de dialogue pour saisir ton mot de passe GPG''' (passphrase).<br /> | |||
Il existe plusieurs variantes : | |||
** <code>pinentry-gtk</code> → interface graphique. | |||
** <code>pinentry-curses</code> → interface en mode texte. | |||
** <code>pinentry-tty</code> → '''pur terminal''', idéal pour les scripts ou containers sans UI. | |||
* '''Pourquoi utile avec <code>pass</code> ?'''<br /> | |||
Quand tu fais <code>pass insert</code> ou <code>pass show</code>, GPG doit déchiffrer avec ta clé privée → il te demande la passphrase.<br /> | |||
<code>pinentry-tty</code> permet cette saisie directement dans le terminal. | |||
----- | |||
✅ '''En résumé :''' | |||
* <code>dirmngr</code> = communication réseau pour clés GPG. | |||
* <code>pinentry-tty</code> = saisie sécurisée de la passphrase dans le terminal. | |||
[[Catégorie: Terminal Tools]] [[category:Linux]] | [[Catégorie: Terminal Tools]] [[category:Linux]] | ||