Как использовать Kubeseal, чтобы запечатать секрет из шлема? - PullRequest
0 голосов
/ 30 сентября 2019

Представьте себе секрет, подобный этому:

apiVersion: v1
kind: Secret
metadata:
  name: {{ include "test-cicd.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "test-cicd.name" . }}
    helm.sh/chart: {{ include "test-cicd.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
type: Opaque
data:
  secret.yaml: |
    {{ if eq .Values.env "prod" }}
    foo: bar-prod
    foo2: bar2_prod
    {{ else if eq .Values.evn "dev" }}
    foo: bar-dev
    {{ end }}

Можно ли это запечатать, используя Kubeseal ? Сделав это сейчас, я получаю invalid map key: map[interface {}]interface {}{"include \"test-cicd.fullname\" .":interface {}(nil)}, что, вероятно, связано с тем, что это не «допустимый» файл yaml.

Одна вещь, которую я попробовал, была: 1. Снятие шаблонных линий штурвала 2. Генерация sealedsecret 3Создание шаблона для запечатанного секрета с использованием шлема

Но при этом запечатанный секрет не может быть расшифрован оператором на стороне кластера во время развертывания.

1 Ответ

1 голос
/ 08 октября 2019

mkmik дал ответ на мой вопрос по Github , так что я привожу здесь его также только для записей.


Итак, вы составляете секретное значение с помощью шаблонов на стороне клиента. Части вашего файла secret.yaml являются секретными, но части должны быть шаблонными директивами (if) и, следовательно, не могут быть зашифрованы.

У вас есть два варианта:

  1. youкаким-то образом зашифруйте свои секреты с помощью некоторого клиентского программного обеспечения хранилища, возможно, с интеграцией руля (например, https://github.com/futuresimple/helm-secrets)., для которого требуется, чтобы каждый пользователь (и среда CI), применяющий эту таблицу рулевого управления, мог расшифровать секреты.

  2. вы перефакторируете свои секреты, чтобы секреты были «атомарными», и используете запечатанные секреты, чтобы извлечь выгоду из своего подхода «одностороннего шифрования», который позволяет вашим пользователям devops (и автоматизации CI)применять схемы штурвала, даже не видя сами секретные значения.

В остальной части этого ответа предполагается, что вы выбрали вариант (2)


Теперь, так как выРешив использовать Helm, вы должны иметь дело с тем фактом, что шаблоны helm не являются файлами json / yaml, а вместо этого являются шаблонами Go, и, следовательно, ими нельзя манипулировать с помощью инструментов, предназначенных для человека. Форматы структурированных данных ipulated.

К счастью, в kubeseal есть команда --raw, которая позволяет вам шифровать отдельные секретные значения и помещать их вручную в любой формат файла, который вы используете для описания своих ресурсов k8s.

Итак, предполагая, что вы хотите создать шаблон Helm для ресурса SealedSecrets, который принимает значения имени и метки в качестве параметров, а также выбирает, какие секреты следует поместить также на основе логического параметра prod / dev, этот пример может работать для вас:

apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: {{ include "test-cicd.fullname" . }}
  annotations:
    # this is because the name is a deployment time parameter
    # consider also using "cluster-wide" if the namespace is also a parameter
    # please make sure you understand the implications, see README
    sealedsecrets.bitnami.com/namespace-wide: "true"
  labels:
    app.kubernetes.io/name: {{ include "test-cicd.name" . }}
    helm.sh/chart: {{ include "test-cicd.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
type: Opaque
spec:
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "test-cicd.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
        app.kubernetes.io/managed-by: {{ .Release.Service }}
  encryptedData:
    {{ if eq .Values.env "prod" }}
    foo: AgASNmKx2+QYbbhSxBE0KTa91sDBeNSaicvgBPW8Y/q/f806c7lKfF0mnxzEirjBsvF67C/Yp0fwSokIpKyy3gXtatg8rhf8uiQAA3VjJGkl5VYLcad0t6hKQyIfHsD7wrocm36uz9hpH30DRPWtL5qy4Z+zbzHj8AvEV+xTpBHCSyJPF2hyvHXTr6iQ6KJrAKy04MDwjyQzllN5OQJT2w4zhVgTxXSg/c7m50U/znbcJ1x5vWLXLSeiDRrsJEJeNoPQM8OHmosf5afSOTDWQ4IhG3srSBfDExSFGBIC41OT2CUUmCCtrc9o61LJruqshZ3PkiS7PqejytgwLpw/GEnj2oa/uNSStiP9oa9mCY6IUMujwjF9rKLIT456DlrnsS0bYXO2NmYwSfFX+KDbEhCIVFMbMupMSZp9Ol2DTim5SLIgIza/fj0CXaO3jGiltSQ0aM8gLSMK9n3c1V+X5hKmzMI3/Xd01QmhMmwqKp+oy21iidLJjtz67EiWyfIg1l7hiD5IIVlM9Gvg3k67zij5mOcXPkFnMmUQhQWxVKgAf4z8qEgprt03C+q+Wwwt25UDhQicpwoGtVQzU5ChJi09ja5LeW4RrvDf2B5KRp9HXoj1eu93MMl1Kcnx+X7uVT5OqQz28c4wOLT4FDItFzh8zREGZbiG/B3o1vI8MmwvxXj++pQ7SfBxoz9Xe8gmQ7BuXno=
    foo2: AgAkaTBYcESwogPiauZ15YbNldmk4a9esyYuR2GDt7hNcv+ycPLHmnsJcYs0hBtqucmrO3HbgCy/hQ6dMRCY12RA7w7XsFqNjZy3kavnhqwM6YkHntK2INwercRNQpO6B9bH6MxQTXcxfJbPqaPt30iTnTAhtpN47lueoyIoka4WWzwG/3PAikXhIlkTaq0hrclRJHRqg4z8Kmcaf5A/BRL2xX8syHbjA7MK9/OoK+zytv+LGrbLLHUtuhNNNQ2PG9u05rP6+59wRduQojEDtB9FTCa+daS+04/F4H1vi6XUNnjkK+Xna1T2Eavyuq2GieKj/7ig96et/4HoTAz44zwVhh8/pk0IFC8srcH3p+rFtZZmjvbURrFahEjFZbav3BDMBNhrU8SI3MDN0Abiyvz4vJJfSxIYcyLD1EQ507q7ZXrqYN/v1EiYgYUACi0JGxSWHB9TlCkZOAdCl+hroXEhBN2u5utLJ12njBQJ8ACNQDOYf+CmtV0y7foCZ6Aaap0pV7a8twyqK8c17kImzfi102Zel8ALfLAzdAXBV9c1+1pH76turnTCE33aSMQlaVF3VTmFQWqB8uIO/FQhZDPo8u/ki3L8J31nepup4/WE7i59IT0/9qGh2LKql4oAv6v4D7qtKziN6DvG7bsJlj14Dln0roiTfTWEEnBqdDER+GKZJlKayOWsPQdN0Wp+2KVfwLM=
    {{ else if eq .Values.evn "dev" }}
    foo: AgAkaTBYcESwogPi..........
    {{ end }}

Альтернативный подход состоит в том, чтобы иметь два шаблона, один для prod и один для dev, и использовать логику шаблонов Helm для выбора нужного файла в зависимости от среды, в которой вы развертываете.

В любом случае, каждый из этих двоичных объектов base64 может быть получен с помощью:

$ kubeseal --raw --scope namespace-wide --from-file=yoursecret.txt

Pro-tip, вы можете передать секрет, если его нет в файле:

$ echo -n yoursecret | kubeseal --raw --scope namespace-wide --from-file=/dev/stdin

Тогда вывставьте вывод этой команды в шаблон Helm Go.

...