Как декодировать Kubernetes Secret
- Выполните
kubectl get secret app-db -n shop -o yamlи вставьте вывод в поле. JSON из-o jsonтоже подойдёт. - В таблице перечислены все ключи с декодированными значениями и размерами, а также кнопки Скопировать и Скопировать Base64.
- В поле результата появится тот же Secret, переписанный через
stringData, со значениями открытым текстом. Двоичные значения остаются вdata. - Для обратной задачи переключитесь на Собрать Secret: на входе строки
KEY=value, на выходе Secret сdataв Base64.
На вход можно подать и List из kubectl get secrets -o yaml, несколько документов через ---, манифест после рендеринга Helm, отдельный .dockerconfigjson или просто одно значение Base64.
Пример: что выдаёт kubectl и что это значит
apiVersion: v1
data:
DATABASE_URL: cG9zdGdyZXM6Ly9hcHA6czNjcjN0LVBhNTVAZGI6NTQzMi9zaG9w
DB_PASSWORD: czNjcjN0LVBhNTUK
DB_USER: YXBw
kind: Secret
metadata:
name: app-db
namespace: shop
type: Opaque
| Ключ | Декодировано | Размер |
|---|---|---|
DATABASE_URL | postgres://app:s3cr3t-Pa55@db:5432/shop | 39 B |
DB_PASSWORD | s3cr3t-Pa55 и перевод строки | 12 B |
DB_USER | app | 3 B |
В пароле 11 символов, а значение занимает 12 байт. Кто-то создал его командой echo 's3cr3t-Pa55' | base64, и перевод строки в конце сломает вход в базу данных. Без перевода строки Base64 был бы czNjcjN0LVBhNTU=.
Что распознаёт декодер
- Сертификаты и ключи PEM вроде
tls.crtиtls.keyв Secret типаkubernetes.io/tlsпомечаются. У сертификатов есть ссылка на декодер сертификатов, где можно проверить срок действия и SAN. - Значения JSON форматируются.
- Двоичные значения, например хранилище ключей Java, получают тип файла, превью в hex и кнопку Скачать.
- Значения
.dockerconfigjsonи.dockercfgраскладываются на реестр, имя пользователя и пароль, аauthдекодируется. Декодер .dockerconfigjson ставит их на первое место.
Однострочники kubectl
Одно значение. Точки в именах ключей внутри jsonpath нужно экранировать:
kubectl get secret app-db -o jsonpath='{.data.DB_PASSWORD}' | base64 --decode
kubectl get secret app-tls -o jsonpath='{.data.tls\.crt}' | base64 --decode
Все значения сразу можно получить через встроенную в kubectl шаблонную функцию base64decode или через jq:
kubectl get secret app-db -o go-template='{{range $k, $v := .data}}{{$k}}={{$v | base64decode}}{{"\n"}}{{end}}'
kubectl get secret app-db -o json | jq '.data | map_values(@base64d)'
Как создать Secret, не попав в ловушку с переводом строки:
kubectl create secret generic app-db --from-literal=DB_PASSWORD='s3cr3t-Pa55' --dry-run=client -o yaml
Больше рецептов для командной строки собрано на странице про Base64 в Bash.
Ограничения и частые проблемы
- «Во вводе не найден Secret с data или stringData»: скорее всего, вставлен Deployment или ConfigMap. Значения ConfigMap хранятся обычным текстом, декодировать их не нужно.
- Размер: Secret целиком ограничен 1 MiB. Собрать Secret проверяет это ограничение, имена ключей и имя в стиле DNS до того, как вы что-либо примените.
- Возможности YAML: парсер понимает то, что выдают kubectl, Helm и Kustomize, включая блочные скаляры и несколько документов. Якоря, алиасы и ключи слияния не поддерживаются.
- Secret релизов Helm (
sh.helm.release.v1.*) содержат Base64 от данных gzip внутри значенияdata, которое само в Base64. Декодируйте здесь внешний слой, а затем воспользуйтесь декодером gzip из Base64.
Вопросы и ответы
Как декодировать секрет Kubernetes через kubectl?
Для одного ключа: kubectl get secret app-db -o jsonpath='{.data.DB_PASSWORD}' | base64 --decode. Для всех ключей сразу вставьте сюда вывод -o yaml или воспользуйтесь однострочниками с go-template или jq на этой странице.
Шифруются ли секреты Kubernetes?
В поле data лежит всего лишь Base64, и раскодировать его может любой, у кого есть доступ на чтение. Шифрование при хранении в etcd включается отдельной настройкой кластера, а кто может читать Secret, решает RBAC. См. кодирование и шифрование.
Почему в конце декодированного секрета перевод строки?
Значение создали через echo вместо echo -n, и перевод строки тоже закодировался. Base64 у такого значения часто заканчивается на K, o= или Cg==. Пересоздайте его через printf '%s' value | base64 или kubectl create secret --from-literal.
Чем data отличается от stringData?
data хранит значения в Base64, а stringData принимает обычный текст, который API-сервер сам кодирует при записи. При чтении всегда возвращается data. Поле результата здесь переписывает Secret через stringData, чтобы его можно было отредактировать и применить заново.