Как сгенерировать случайную строку / пароль в секретах Kubernetes

На данный момент я развертываю свои модули приложений, используя статические файлы, и один из них app-secrets.yaml со всеми секретами для развертывания приложения.

---
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  root: xxxxxx
  user1: xxxxxx
  user2: xxxxxx

но это небезопасно и не удобно (если мне нужен другой экземпляр приложения, я должен создать другой файл с паролем, сгенерированным человеком).

Я хочу сгенерировать случайные пароли при создании приложения, но не знаю, возможно ли это. Я уже изучал тему секрет и особенно secretGenerator, но это не совсем то, что Я хочу, как я это понимаю, потому что он создает не случайную строку, а случайное секретное имя, например secret/app-secrets-ssdsdfmfh4k, но я должен предоставить все же пароли.


person Baptiste Mille-Mathias    schedule 09.01.2020    source источник


Ответы (3)


Вы можете использовать kubernetes-secret-generator. Я протестировал его, и он делает именно то, что вам нужно.

Для этого у вас должен быть шлем в кластере и следовать этим инструкциям:

Клонировать репозиторий

$ git clone https://github.com/mittwald/kubernetes-secret-generator

Создание развертывания Helm

$ helm upgrade --install secret-generator ./deploy/chart

Теперь вы можете использовать это, вам просто нужно

Добавьте аннотацию secret-generator.v1.mittwald.de/autogenerate к любому секретному объекту Kubernetes. Значением аннотации может быть имя поля (или список имен полей, разделенных запятыми) внутри секрета; SecretGeneratorController возьмет эту аннотацию и добавит поле [или поля] (password в приведенном ниже примере) к секрету со случайно сгенерированным строковым значением. Из здесь.

$ kubectl apply -f mysecret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
  annotations:
    secret-generator.v1.mittwald.de/autogenerate: password
data:
  username: UGxlYXNlQWNjZXB0Cg==

После применения этого секрета вы можете взглянуть на него, чтобы проверить, правильно ли сгенерирован проход:

$ kubectl get secrets mysecret -o yaml
apiVersion: v1
data:
  password: dnVKTDBJZ0tFS1BacmtTMnBuc3d2YWs2YlZsZ0xPTUFKdStDa3dwUQ==
  username: UGxlYXNlQWNjZXB0Cg==
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"username":"UGxlYXNlQWNjZXB0Cg=="},"kind":"Secret","metadata":{"annotations":{"secret-generator.v1.mittwald.de/autogenerate":"password"},"name":"mysecret","namespace":"default"}}
    secret-generator.v1.mittwald.de/autogenerate: password
    secret-generator.v1.mittwald.de/autogenerate-generated-at: 2020-01-09 14:29:44.397648062
      +0000 UTC m=+664.011602557
    secret-generator.v1.mittwald.de/secure: "yes"
  creationTimestamp: "2020-01-09T14:29:44Z"
  name: mysecret
  namespace: default
  resourceVersion: "297425"
  selfLink: /api/v1/namespaces/default/secrets/mysecret
  uid: 7ae42d71-32ec-11ea-92b3-42010a800009
type: Opaque

Как мы видим, пароль был сгенерирован и зашифрован так, как вам нужно.

person Mark Watney    schedule 09.01.2020
comment
именно то, что я искал, к сожалению, k8s не предоставляет этого по умолчанию и что этот проект использует helm для развертывания. - person Baptiste Mille-Mathias; 14.01.2020

Kubernetes изначально не имеет этой функции.

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

Если вы хотите автоматизировать эту ручную задачу, вы можете использовать этот пользовательский контроллер для выполнения этого .

Добавьте аннотацию secret-generator.v1.mittwald.de/autogenerate к любому секретному объекту Kubernetes. Значением аннотации может быть имя поля (или список имен полей, разделенных запятыми) в секрете; SecretGeneratorController возьмет эту аннотацию и добавит поле [или поля] (пароль в приведенном ниже примере) к секрету со случайно сгенерированным строковым значением

person Arghya Sadhu    schedule 09.01.2020

Ты тоже можешь это сделать:

$ head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 ; echo '' | base64 | kubectl create secret generic mysecret --from-literal=password=-

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

Примечание: измените число в head -c 8, чтобы контролировать длину строки.

person suren    schedule 10.01.2020
comment
Пример выше не работает, поэтому я даю рабочий: head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 | xargs -I {} kubectl create secret generic mysecret --from-literal=password={} - person red; 05.07.2021
comment
@red Прежде всего, я только что попробовал с k8s 1.20, и он ДЕЙСТВИТЕЛЬНО работал. и вы должны ожидать, что некоторые сообщения устареют через полтора года. - person suren; 07.07.2021