bash-herestring-newline-secrets

Par divinevideo · divine-mobile

Corrige les échecs d'authentification par mot de passe/secret causés par des sauts de ligne en fin de chaîne lors de la création de secrets Google Cloud (ou similaires) avec des here-strings bash. À utiliser quand : (1) l'authentification par mot de passe échoue avec le bon mot de passe, (2) le secret a été créé avec la syntaxe `<<< "valeur"`, (3) une erreur comme "password authentication failed" ou "invalid token" apparaît malgré une valeur correcte. Les here-strings bash (`<<<`) ajoutent un saut de ligne en fin de chaîne qui corrompt les secrets.

npx skills add https://github.com/divinevideo/divine-mobile --skill bash-herestring-newline-secrets

Retour à la ligne Bash Here-String dans les secrets

Problème

Lors de la création de secrets avec des here-strings bash (<<<), un retour à la ligne est silencieusement ajouté à la valeur. Cela provoque des échecs d'authentification avec des messages d'erreur trompeurs suggérant que le mot de passe/token est incorrect alors qu'il est en fait correct—il a juste un caractère de retour à la ligne supplémentaire.

Contexte / Conditions de déclenchement

  • Secret créé avec : gcloud secrets create NAME --data-file=- <<< "value"
  • Ou similaire : echo "value" | gcloud secrets create... (echo ajoute un retour à la ligne par défaut)
  • Messages d'erreur comme :
    • "password authentication failed for user X"
    • "invalid token"
    • "authentication failed"
  • La valeur du secret semble correcte quand elle est affichée
  • Fonctionne localement mais échoue quand le secret est utilisé

Solution

Incorrect (ajoute un retour à la ligne) :

gcloud secrets create my-secret --data-file=- <<< "mypassword"
echo "mypassword" | gcloud secrets create my-secret --data-file=-

Correct (pas de retour à la ligne) :

echo -n "mypassword" | gcloud secrets create my-secret --data-file=-
printf '%s' "mypassword" | gcloud secrets create my-secret --data-file=-

Pour corriger un secret existant :

echo -n "correct-value" | gcloud secrets versions add my-secret --data-file=-

Vérification

Vérifiez la longueur du secret pour détecter un retour à la ligne à la fin :

# Récupérer le secret et compter les octets
gcloud secrets versions access latest --secret=my-secret | wc -c
# Comparer à la longueur attendue (longueur du mot de passe, pas longueur + 1)

Ou utilisez xxd pour voir les octets réels :

gcloud secrets versions access latest --secret=my-secret | xxd | tail -1
# Cherchez '0a' (retour à la ligne) à la fin

Exemple

Symptôme :

Database connection test failed: password authentication failed for user "crawler"

Investigation :

$ gcloud secrets versions access latest --secret=my-db-password
mypassword
$ gcloud secrets versions access latest --secret=my-db-password | wc -c
11  # Mais le mot de passe n'a que 10 caractères !

Correction :

$ echo -n "mypassword" | gcloud secrets versions add my-db-password --data-file=-
Created version [2] of the secret [my-db-password].

Notes

  • Cela affecte tout système utilisant des secrets : bases de données, APIs, tokens, etc.
  • Le here-string <<< est une fonctionnalité bash qui AJOUTE TOUJOURS un retour à la ligne
  • echo ajoute aussi un retour à la ligne par défaut ; utilisez echo -n ou printf '%s'
  • Certains systèmes suppriment les espaces blancs des secrets, mais beaucoup (comme PostgreSQL) ne le font pas
  • Lors du débogage des échecs d'authentification, vérifiez toujours d'abord les espaces blancs à la fin

Références

Skills similaires