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 echoajoute aussi un retour à la ligne par défaut ; utilisezecho -nouprintf '%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
- Manuel Bash sur les here-strings : https://www.gnu.org/software/bash/manual/bash.html#Here-Strings