23
votes

Décoder le secret de Kubernetes

J'ai hérité d'une configuration Kubernetes / Docker, et j'ai accidentellement écrasé le pod en modifiant quelque chose concernant le mot de passe DB.

J'essaye de résoudre ceci.

Je n'ai pas beaucoup d'expérience Kubernetes ou Docker, donc j'apprends encore à faire les choses.

La valeur est contenue dans les informations d'identification db-user-pass, je crois, qui est un secret de type Opaque.

Je le décris:

kubectl describe secrets/db-user-pass
Name:         db-user-pass
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  16 bytes
username:  13 bytes

mais je n'ai aucune idée de comment obtenir des données de ce secret. L'exemple sur le site Kubernetes semble supposer que j'aurai une chaîne encodée en base64, mais je n'arrive même pas à l'obtenir. Comment en obtenir la valeur?


3 commentaires

Essayez kubectl get secret db-user-pass -o yaml , qui le kubectl get secret db-user-pass -o yaml YAML et inclura généralement les valeurs secrètes codées.


Parfait! Merci. Si vous voulez écrire ceci comme réponse, je l'accepterai.


kubectl get secret db-user-pass -o json | jq '.data | map_values(@base64d)' . Cela donne les meilleurs résultats mais nécessite la dépendance jq .


9 Réponses :


4
votes

C'est le lien que vous recherchez peut-être.

Les secrets Kubernetes doivent être fournis au format encodé en base64, qui peut être créé en utilisant le binaire base64 dans le cas de distributions Linux.

Exemple:

echo "hello" | base64
aGVsbG8K

Kubernetes décode l'encodage base64 lorsque nous transmettons la clé secrète en tant que variable d'environnement ou montée en volume.


2 commentaires

Ajoutez le paramètre --decode pour décoder le secret à partir de base64.


echo "aGVsbG8K" | base64 --decode affichera hello



37
votes

Vous pouvez utiliser kubectl get secrets/db-user-pass -o yaml ou -o json où vous verrez le username et le password encodés en base64. Vous pouvez ensuite copier la valeur et la décoder avec quelque chose comme echo <ENCODED_VALUE> | base64 -D .

Un one-liner plus compact pour cela:

$ kubectl get secrets/db-user-pass --template={{.data.username}} | base64 -D

et de même pour le nom d'utilisateur:

$ kubectl get secrets/db-user-pass --template={{.data.password}} | base64 -D


4 commentaires

selon base64 sur centos7 la commande est base64 -d pas -D


-D n'est pas disponible non plus pour ubuntu 18


Cette réponse a été publiée par quelqu'un sur un Mac OS. -d est l'argument approprié pour décoder sous Linux.


Ce modèle ne fonctionne pas lorsqu'une clé à l'intérieur d'un secret contient un point (par exemple credentials.json ). La variante de travail est: kubectl get secrets/secret-name --template="{{index .data \"credentials.json\" | base64decode}}" . Notez également l'utilisation du base64decode base64 de Go au lieu de base64 du système d'exploitation pour le faire fonctionner sous n'importe quel système d'exploitation.



5
votes

Tout d'abord, obtenez le secret sur etcd en interrogeant le serveur api à l'aide de kubectl.

kubectl get secret db-user-pass -o yaml 

Cela vous donnera le secret encodé en base64 au format yaml.

Une fois que vous avez le fichier yaml, décodez-les en utilisant

"base64 --decode"

La commande finale ressemblera à ceci: N'oubliez pas l'indicateur -n dans la commande echo

echo -n "jdddjdkkdkdmdl" | base64 --decode


0 commentaires

27
votes

Je suggérerais d'utiliser cette commande pratique. Il utilise une puissance de go-templates . Il itère sur toutes les valeurs, les décode et les imprime avec la clé. Il gère également les valeurs non définies.

kubectl get secret name-of-secret -o go-template='
{{range $k,$v := .data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}'

## In your case it would output
# password: decoded_password
# username: doceded_username

Si vous n'aimez pas les go-templates, vous pouvez utiliser différents formats de sortie, par exemple yaml ou json , mais cela produira des secrets encodés en base64.


2 commentaires

C'est la réponse la plus robuste.


Quelqu'un a-t-il trouvé la syntaxe pour que cela fonctionne dans PowerShell? Si je mets le modèle dans un fichier et que j'utilise --go-template-file cela fonctionne. Mais --go-template se comporte différemment (donne diverses erreurs sur ceci ou cela inattendu). Même en échappant correctement à la corde (ce qui, franchement, est douloureux).



2
votes

Pour un décodage plus facile, vous pouvez utiliser un outil comme ksd qui effectuera le décodage base64 pour vous

kubectl view-secret secrets/db-user-pass

ou en utilisant https://github.com/elsesiy/kubectl-view-secret

kubectl get secrets/db-user-pass -o yaml | ksd


0 commentaires

4
votes

Si vous avez jq (requête json), cela fonctionne:

kubectl get secret db-user-pass -o json | jq '.data | map_values(@base64d)'


2 commentaires

Cela marche! Notez qu'il nécessite jq 1.6 ou supérieur (qui n'est pas installé de base sur certains systèmes) et peut avoir des problèmes par github.com/stedolan/jq/issues/47


Cela donne le plus beau résultat!



2
votes

sur ubuntu 18+

kubectl get secrets/db-user-pass --template={{.data.password}} | base64 -d


0 commentaires

0
votes

Gouverneurs 1.11+

kubectl get secrets/db-user-pass --template='{{.data.password | base64decode }}'


0 commentaires

1
votes

Si vos clés secrètes contiennent un tiret ( - ) ou un point ( . ):

kubectl get secret db-user-pass -o=go-template='{{index .data "password"}}' | base64 -d


0 commentaires