Расшифровка секрета Kubernetes

Я унаследовал настройку Kubernetes/Docker и случайно разбил модуль, изменив что-то, связанное с паролем БД.

Я пытаюсь устранить эту проблему.

У меня нет большого опыта работы с Kubernetes или Docker, поэтому я все еще учусь, как что-то делать.

Я полагаю, что значение содержится внутри учетных данных db-user-pass, которые являются секретом непрозрачного типа.

Я описываю это:

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

но я понятия не имею, как получить какие-либо данные из этого секрета. Пример на сайте Kubernetes, кажется, предполагает, что у меня будет строка в кодировке base64, но я даже не могу этого понять. Как мне получить значение для этого?

Попробуйте kubectl get secret db-user-pass -o yaml, который выводит его в форме YAML и обычно включает закодированные секретные значения.

David Maze 05.07.2019 23:03

Идеально! Спасибо. Если вы хотите написать это как ответ, я приму это.

Steven Matthews 05.07.2019 23:03
kubectl get secret db-user-pass -o json | jq '.data | map_values(@base64d)'. Это дает наилучшие результаты, но требует зависимости jq.
marcelosalloum 28.10.2020 15:43

для точек в json см. это: github.com/kubernetes/kubernetes/issues/23386

Tilo 25.08.2021 20:29
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
105
4
115 736
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Это связь, который вы, возможно, ищете.

Секреты Kubernetes требуют, чтобы секреты были предоставлены в формате с кодировкой base64, который может быть создан с использованием двоичного кода base64 в случае дистрибутивов Linux.

Пример:

echo "hello" | base64
aGVsbG8K

Kubernetes декодирует кодировку base64, когда мы передаем секретный ключ как переменную среды или монтируем как том.

Добавьте параметр --decode для декодирования секрета из base64.

Matze 05.07.2019 23:09
echo "aGVsbG8K" | base64 --decode выведет hello
Malathi 05.07.2019 23:10
Ответ принят как подходящий

Вы можете использовать kubectl get secrets/db-user-pass -o yaml или -o json, где вы увидите username и password в кодировке base64. Затем вы можете скопировать значение и расшифровать его с помощью чего-то вроде echo <ENCODED_VALUE> | base64 -D (Mac OS X).

Более компактный однострочный для этого:

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

и аналогично для имени пользователя:

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

Примечание: в GNU/Linux флаг base64 — это -d, а не -D.

согласно base64 на centos7 команда base64 -d не -D

TheSteve0 12.03.2020 20:29

-D также недоступен для Ubuntu 18

cafebabe1991 28.07.2020 07:28

Этот ответ был опубликован кем-то на Mac OS. -d — подходящий аргумент для декодирования в Linux.

Derek Lemon 17.09.2020 01:02

Этот шаблон не работает, если ключ внутри секрета содержит точку (например, credentials.json). Рабочий вариант: kubectl get secrets/secret-name --template = "{{index .data \"credentials.json\" | base64decode}}". Также обратите внимание на использование base64decode Go вместо base64 ОС, чтобы он работал под любой ОС.

Ruslan Stelmachenko 05.12.2020 06:36

Нет смысла заставлять это работать на любой ОС, так как докер действительно работает только в Linux. Я обновил ответ для работы с bash и сделал пометку об OS/X и zsh.

Software Engineer 04.05.2021 17:33

Во-первых, получите секрет от etcd, запросив сервер API с помощью kubectl.

kubectl get secret db-user-pass -o yaml 

Это даст вам секрет в кодировке base64 в формате yaml.

Как только у вас есть файл yaml, декодируйте их, используя

"base64 --decode"

Окончательная команда будет выглядеть так: Не забудьте флаг -n в команде echo

echo -n "jdddjdkkdkdmdl" | base64 --decode

Я бы предложил использовать эту удобную команду. Он использует мощность go-шаблоны. Он перебирает все значения, декодирует их и печатает вместе с ключом. Он также обрабатывает не заданные значения.

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: decoded_username

Если вам не нравятся шаблоны go, вы можете использовать разные форматы вывода, например. yaml или json, но это выведет секреты, закодированные base64.

Это самый надежный ответ.

Pawel Furmaniak 11.01.2020 13:29

Кто-нибудь понял синтаксис, чтобы заставить это работать в PowerShell? Если я помещаю шаблон в файл и использую --go-template-file, он работает. Но --go-template ведет себя иначе (выдает разные ошибки о неожиданном том или ином). Даже при правильном выходе из строки (что, честно говоря, болезненно).

BrettJ 19.04.2020 18:34

Использование: 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}}' Обратите внимание на экранированные двойные кавычки.

Rashack 14.01.2021 14:40

Для более простого декодирования вы можете использовать такой инструмент, как ксд, который сделает для вас декодирование base64.

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

или используя https://github.com/elsesiy/kubectl-view-секрет

kubectl view-secret secrets/db-user-pass

Я люблю этот плагин и рекомендую его.

tdensmore 08.10.2021 20:51

Если у вас есть jq (запрос json), это работает:

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

ПРИМЕЧАНИЕ:

  • db-user-pass это название секрета k8s
  • .data — это переменная внутри, которая содержит секретное значение

Это работает! Обратите внимание, что для этого требуется jq 1.6 или выше (который не установлен в базовой версии на некоторых системах) и могут возникнуть проблемы с github.com/stedolan/jq/issues/47.

btown 28.03.2020 21:30

Это дает наилучший результат!

marcelosalloum 28.10.2020 15:41

Спасибо за эту замечательную командную строку, результат волшебный

rasolog 14.03.2021 12:19

на убунту 18+

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

У меня не работает. В версии 1.18.5 я получаю «<нет значения>» при использовании --template = {{.data.password}} в качестве параметра.

Dave 06.05.2021 22:54

Я использую один и тот же каждый день, у меня есть разные кластеры версий 1,17, 1.18,1.19 и 1.20, и он все еще работает для меня.

Gajendra D Ambi 07.05.2021 23:10

Кубернет 1.11+

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

Если ваши секретные ключи содержат тире (-) или точку (.):

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

Поскольку в нашем секрете argocd-cluster есть точка с admin.password внутри data, этот подход с использованием go-template был единственным решением, которое сработало для нас. Вот наша команда: kubectl -n argocd get secret argocd-cluster -o=go-template='{{index .data "admin.password"}}' | base64 -d; echo.

jonashackt 22.02.2022 11:19

Расширение решения @Břetislav Hájek (большое спасибо за это). Если вам нужно получить его по метке, вам нужно добавить дополнительную команду range для перебора возвращенных элементов.

$ LABEL_FILTER = "app.kubernetes.io/name=mysql-chart"

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

mysql_password: ...
mysql_root_password: ...
mysql_user: ...

С баш. Это работает под управлением Ubuntu 18.04 и Kubernetes 1.18.5.

kubectl -n metallb-system get secrets memberlist -o json | grep secretkey | grep -v f:s | awk -F '"' '{print$4}' |base64 --decode; echo

Этот один лайнер используется для получения закодированного файла kubeconfig из секрета и создания из него файла для динамического использования в задании ci, например:

kubectl get secret YOUR_SECRET -o json | grep -oP '(?<=\"YOUR_SECRET_KEY\": \")[^\"]*' | base64 --decode > ./YOUR_KUBECONFIG_FILE_NAME

Этот вариант jsonpath работает для меня на OSX.

kubectl get secrets/db-user-pass -o jsonpath = "{.data.username}" | base64 -d

Чтобы получить секрет с точкой в ​​имени.

kubectl get secrets/tls -o jsonpath = "{.data['tls\.crt']}" | base64 -d

Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.

Community 22.10.2021 10:40

Это должно работать на всех платформах с kubectl 1.11+.

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

И если вы хотите получить все ключи, значения

kubectl get secrets/db-user-pass --template='{{ range $key, $value := .data }}{{ printf "%s: %s\n" $key ($value | base64decode) }}{{ end }}'

Минимальный инструмент командной строки nodejs (гитхаб)

npm i -g kusd
kubectl get secret your-secret -o yaml | kusd

Другие вопросы по теме