Использование секрета из StarVault
1. Добавление секрета и настройка доступа в StarVault
-
Зайдите в StarVault с root token.
-
Перейдите на страницу Secrets и нажмите на Enable new engine +, чтобы создать новое хранилище секретов.
-
Выберите хранилище Key-Value.
-
В новом хранилище нажмите на Create secret +, чтобы создать секрет.
-
Укажите название для обращения к секрету и пары ключ-значение. Сохраните созданный секрет.
-
Перейдите на вкладку Policies для настройки правил доступа и нажмите на Create ACL policy +.
-
В этой политике указываются права на созданный ранее секрет.
Пример правила:path "kv/data/creds" { capabilities = [ "read" ] }
-
Теперь перейдите на вкладку Access для настройки доступа к секрету используя созданную в прошлом пункте политику.
-
Перейдите в Auth Methods → nova-kubernetes и нажмите на Create role +.
-
Заполните поля с соответствующими значениями:
Name: nova-test (1) Bound service account names: nova-test (2) Bound service account namespaces: test (3) Generated Tokens Policies: nova-test (4)-
Имя роли. Может быть любым.
-
Имя сервисного аккаунта, который будет создан в Nova Console для доступа к секрету.
-
Пространство имён в Nova Console, откуда можно обращаться к секрету.
-
Созданная ранее политика доступа к секрету.
-
2. Настройка доступа со стороны Nova Console
-
Перейдите на страницу Nova Console и создайте новое пространство имён. Перейдите на вкладку Home → Namespaces и нажмите на Создать Namespace.
-
Создайте сервисный аккаунт в новом пространстве имён, который будет иметь доступ к созданному нами секрету в StarVault.
Перейдите на вкладку RBAC Management → ServiceAccounts и нажмите на Создать Сервисная учётная запись.
Далее представлен пример манифеста для сервисного аккаунта. Нужно учитывать, что имя сервисного аккаунта должно совпадать с именем, которое было указано при настройке доступа в StarVault.
apiVersion: v1 kind: ServiceAccount metadata: name: nova-test namespace: test -
Создайте привязку к уже существующей роли. Перейдите на вкладку RBAC Management → ClusterRoleBindings и нажмите Создать привязку.
-
При создании Role Binding указываются следующие параметры:
-
привязка нужна для всего кластера;
-
роль для привязки -
system:auth-delegator -
созданный ранее сервисный аккаунт в пространстве имён
test
-
3. Использование секрета в контейнере
3.1. Использование секрета в контейнере с копированием секрета из StarVault в Nova Console
-
Перейдите на страницу Nova Console на вкладку Administration → CustomResourceDefinitions, найдите SecretProviderClass и зайдите в него.
-
Перейдите на вкладку Экземпляры, нажмите Создать 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-
Параметр
secretNameсоздаст секрет в Nova Console с указанным именем и данными из секрета в StarVault.
-
-
Создайте под, в который будет прокинут секрет из 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"-
Аннотация нужна для указания кластеру, что будет использоваться доступ к StarVault.
-
Секрет
example-secretсоздавать не нужно. Он создастся автоматически.
-
-
Проверьте, что создался секрет. Зайдите в терминал пода и убедитесь, что появились переменные.
3.2. Использование секрета в контейнере БЕЗ копированием секрета из StarVault в Nova Console
-
Создайте под, в который будет прокинут секрет из 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: {}-
Аннотация нужна для указания кластеру, что будет использоваться доступ к StarVault.
-
Параметры
serviceAccountиserviceAccountNameнужны для доступа пода к секрету в StarVault. -
В под автоматически добавится ещё один initContainer
copy-vault-env, который копирует секрет из StarVault.
-
-
Заёдите в терминал пода и проверьте содержимое файла
/etc/config/my-env-file, а также, что данные не хранятся в открытом виде в переменнойecho $USERNAME.