Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Использование секрета из StarVault

1. Добавление секрета и настройка доступа в StarVault

  1. Зайдите в StarVault с root token.

  2. Перейдите на страницу Secrets и нажмите на Enable new engine +, чтобы создать новое хранилище секретов.

    secrets in vault 1
  3. Выберите хранилище Key-Value.

    secrets in vault 2
  4. В новом хранилище нажмите на Create secret +, чтобы создать секрет.

    secrets in vault 3
  5. Укажите название для обращения к секрету и пары ключ-значение. Сохраните созданный секрет.

    secrets in vault 4
  6. Перейдите на вкладку Policies для настройки правил доступа и нажмите на Create ACL policy +.

    secrets in vault 5
  7. В этой политике указываются права на созданный ранее секрет.
    Пример правила: path "kv/data/creds" { capabilities = [ "read" ] }

    secrets in vault 6
  8. Теперь перейдите на вкладку Access для настройки доступа к секрету используя созданную в прошлом пункте политику.

  9. Перейдите в Auth Methodsnova-kubernetes и нажмите на Create role +.

    secrets in vault 7
  10. Заполните поля с соответствующими значениями:

    Name: nova-test (1)
    Bound service account names: nova-test (2)
    Bound service account namespaces: test (3)
    Generated Tokens Policies: nova-test (4)
    1. Имя роли. Может быть любым.

    2. Имя сервисного аккаунта, который будет создан в Nova Console для доступа к секрету.

    3. Пространство имён в Nova Console, откуда можно обращаться к секрету.

    4. Созданная ранее политика доступа к секрету.

2. Настройка доступа со стороны Nova Console

  1. Перейдите на страницу Nova Console и создайте новое пространство имён. Перейдите на вкладку HomeNamespaces и нажмите на Создать Namespace.

    secrets in vault 8
  2. Создайте сервисный аккаунт в новом пространстве имён, который будет иметь доступ к созданному нами секрету в StarVault.
    Перейдите на вкладку RBAC ManagementServiceAccounts и нажмите на Создать Сервисная учётная запись.

    secrets in vault 9

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

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nova-test
      namespace: test
  3. Создайте привязку к уже существующей роли. Перейдите на вкладку RBAC ManagementClusterRoleBindings и нажмите Создать привязку.

    secrets in vault 10
  4. При создании Role Binding указываются следующие параметры:

    • привязка нужна для всего кластера;

    • роль для привязки - system:auth-delegator

    • созданный ранее сервисный аккаунт в пространстве имён test

      secrets in vault 11

3. Использование секрета в контейнере

3.1. Использование секрета в контейнере с копированием секрета из StarVault в Nova Console

  1. Перейдите на страницу Nova Console на вкладку AdministrationCustomResourceDefinitions, найдите SecretProviderClass и зайдите в него.

    secrets in vault 12
  2. Перейдите на вкладку Экземпляры, нажмите Создать SecretProviderClass и используйте следующий манифест:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: nova-test
      namespace: test
    spec:
      provider: vault
      parameters:
        objects: |
          - objectName: "pwd"
            secretPath: "kv/data/creds"
            secretKey: "pwd"
          - objectName: "user"
            secretPath: "kv/data/creds"
            secretKey: "user"
        roleName: nova-test
      secretObjects:
        - data:
            - key: password
              objectName: pwd
            - key: username
              objectName: user
          secretName: example-secret (1)
          type: Opaque
    1. Параметр secretName создаст секрет в Nova Console с указанным именем и данными из секрета в StarVault.

  3. Создайте под, в который будет прокинут секрет из StarVault. Используйте следующий манифест:

    Для повышения безопасности рекомендуется не использовать аннотацию vault.security.banzaicloud.io/vault-skip-verify: true, а применять vault.security.banzaicloud.io/vault-trust-manager-tls-bundle: trusted-ca-bundle. Чтобы эта аннотация работала, в namespace, где запускается под, необходимо добавить метку nova-platform.io/trusted-ca-bundle: enabled. Эта метка подключает ConfigMap trusted-ca-bundle в namespace.

    apiVersion: v1
    kind: Pod
    metadata:
      annotations: (1)
        vault.security.banzaicloud.io/vault-path: nova-kubernetes
        vault.security.banzaicloud.io/vault-role: nova-test
        vault.security.banzaicloud.io/vault-skip-verify: true
      name: example
      namespace: test
    spec:
      containers:
        - name: httpd
          image: 'httpd:latest'
          ports:
            - containerPort: 8080
          env:
            - name: USERNAME
              valueFrom:
                secretKeyRef:
                  name: example-secret (2)
                  key: username
            - name: PASSWORD
              valueFrom:
                secretKeyRef:
                  name: example-secret (2)
                  key: password
          volumeMounts:
            - name: data
              mountPath: /data
            - name: secrets-store-inline
              mountPath: "/mnt/secrets-store"
      serviceAccountName: nova-test
      serviceAccount: nova-test
      volumes:
        - name: data
          emptyDir: {}
        - name: secrets-store-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "nova-test"
    1. Аннотация нужна для указания кластеру, что будет использоваться доступ к StarVault.

    2. Секрет example-secret создавать не нужно. Он создастся автоматически.

  4. Проверьте, что создался секрет. Зайдите в терминал пода и убедитесь, что появились переменные.

3.2. Использование секрета в контейнере БЕЗ копированием секрета из StarVault в Nova Console

  1. Создайте под, в который будет прокинут секрет из StarVault. Используйте следующий манифест:

    Для повышения безопасности рекомендуется не использовать аннотацию vault.security.banzaicloud.io/vault-skip-verify: true, а применять vault.security.banzaicloud.io/vault-trust-manager-tls-bundle: trusted-ca-bundle. Чтобы эта аннотация работала, в namespace, где запускается под, необходимо добавить метку nova-platform.io/trusted-ca-bundle: enabled. Эта метка подключает ConfigMap trusted-ca-bundle в namespace.

    apiVersion: v1
    kind: Pod
    metadata:
      annotations: (1)
        vault.security.banzaicloud.io/vault-path: nova-kubernetes
        vault.security.banzaicloud.io/vault-role: nova-test
        vault.security.banzaicloud.io/vault-skip-verify: true
      name: example
      namespace: test
    spec:
      serviceAccountName: nova-test (2)
      serviceAccount: nova-test (2)
      containers:
      - name: main-container
        image: busybox
        command: [ "sh", "-c", "tail -f /dev/null" ]
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      initContainers: (3)
      - name: init-container
        image: busybox
        command:
          - sh
          - -c
          - 'echo $USERNAME > /etc/config/my-env-file'
        env:
        - name: USERNAME
          value: 'vault:kv/data/creds#user'
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      volumes:
      - name: config-volume
        emptyDir: {}
    1. Аннотация нужна для указания кластеру, что будет использоваться доступ к StarVault.

    2. Параметры serviceAccount и serviceAccountName нужны для доступа пода к секрету в StarVault.

    3. В под автоматически добавится ещё один initContainer copy-vault-env, который копирует секрет из StarVault.

  2. Заёдите в терминал пода и проверьте содержимое файла /etc/config/my-env-file, а также, что данные не хранятся в открытом виде в переменной echo $USERNAME.