Evita que les credencials acabin a l’historial de zsh

Filtra ordres sensibles abans que arribin a l’historial persistent

Evita que les credencials acabin a l’historial de zsh

Hi ha errors que duren segons i rastres que duren anys. Enganxar un token temporal d’una API d’Apple, una clau d’un servei intern o una contrasenya en una ordre de Terminal sol ser un d’aquests casos: l’ordre funciona, la feina continua i la credencial queda al fitxer d’historial. Dies després, una cerca amb fletxa amunt o fc la recupera amb una facilitat inquietant.

Terminal utilitza habitualment zsh com a shell predeterminada al Mac, i zsh incorpora un punt d’intercepció especialment útil: zshaddhistory. Aquesta funció s’executa quan zsh ha llegit una línia interactiva i abans que la incorpori a l’historial. Si retorna un estat diferent de zero, la línia no s’escriu al fitxer d’historial. (support.apple.com)

El requisit és treballar des d’un compte amb accés al vostre directori personal i tenir zsh actiu. Comproveu-ho:

print -r -- $ZSH_VERSION

Aquesta ordre només mostra la versió de zsh carregada a la sessió. Si surt un número de versió, podeu continuar. El canvi següent no requereix permisos d’administrador: modifica ~/.zshrc, el fitxer de configuració del vostre usuari. Abans, conserveu-ne una còpia amb marca de temps:

cp ~/.zshrc ~/.zshrc.abans-historial.$(date +%Y%m%d-%H%M%S)

cp crea un resguard que permet recuperar la configuració anterior si un altre framework de shell, un tema o una funció pròpia interactua malament amb el filtre.

Afegiu aquest bloc al final de ~/.zshrc:

autoload -Uz add-zsh-hook

_history_filtra_credencials() {
  local linia=${1%$'\n'}

  case $linia in
    *'Authorization: Bearer '*|*'--token '*|*'--api-key '*|*'API_KEY='*|*'password='*)
      print -u2 -- "zsh: ordre sensible exclosa de l'historial"
      return 1
      ;;
  esac

  return 0
}

add-zsh-hook -d zshaddhistory _history_filtra_credencials 2>/dev/null
add-zsh-hook zshaddhistory _history_filtra_credencials

La primera línia carrega add-zsh-hook, la utilitat de zsh que registra funcions en punts concrets del cicle de vida del shell. La funció rep la línia introduïda, n’elimina el salt final i compara patrons explícits: una capçalera Bearer, opcions com --token i assignacions habituals com API_KEY=. Quan en detecta un, escriu un avís a l’error estàndard i retorna 1; zsh manté la línia disponible només fins a la següent ordre, però evita que arribi a l’historial persistent. (zsh.sourceforge.io)

Les dues últimes línies eliminen primer un registre anterior de la funció i després l’hi inscriuen de nou. Aquesta decisió evita que, en recarregar .zshrc, el filtre s’executi repetidament a cada ordre.

Apliqueu la configuració sense tancar Terminal:

source ~/.zshrc
add-zsh-hook -L zshaddhistory

source llegeix el fitxer dins de la sessió actual. La segona ordre ha de mostrar _history_filtra_credencials associada a zshaddhistory; serveix per verificar el registre sense inspeccionar estructures internes de zsh.

Feu una prova amb una credencial fictícia:

printf '%s\n' 'API_KEY=prova-no-real'
:
if fc -ln -20 | grep -Fq 'API_KEY=prova-no-real'; then
  print -- "cal revisar el filtre"
else
  print -- "filtrat correctament"
fi

La línia : força l’execució de la comanda següent, moment en què zsh descarta la línia sensible de la memòria temporal. fc -ln -20 llegeix les últimes entrades sense numeració i la comprovació confirma que la mostra ja no hi figura.

Aquest filtre protegeix l’historial, no la pantalla de Terminal, els logs d’una eina ni els arguments visibles mentre un procés s’executa. Per a secrets reals, manteniu-los fora de la línia d’ordres sempre que l’eina admeti entrada estàndard, fitxers amb permisos restrictius o un gestor de credencials. El hook redueix l’impacte d’una distracció; una bona arquitectura evita que la distracció contingui cap secret.

Petit repte final: adapteu els patrons a les eines del vostre entorn —per exemple, una opció pròpia com --mdm-secret— i verifiqueu que bloqueja una prova fictícia sense ocultar ordres legítimes que només contenen la paraula “token” dins d’un comentari o un fitxer.

Per saber-ne més

Configura un hook de zsh per impedir que tokens, claus d’API i contrasenyes escrites a Terminal quedin desats a l’historial.

🔝

Apple zsh

Altres:

Converteix una conversa de Teams en una petició de compra completa amb Copilot Studio

2023

2024

2026