Управление секретами в ArgoCD при помощи argocd-vault-plugin с Kubernetes auth

от автора

Теоретическая часть

Для начала стоит отметить, что в ArgoCD по умолчанию нет возможности скрытно управлять credentials (логинами, паролями, токенами, etc). В документации по ArgoCD приведён список возможных решений по управлению credentials. По моему мнению, наиболее близок к нативному — вариант работы с секретами посредством argocd-vault-plugin (AVP) с использованием Kubernetes auth в Vault. Схема получается следующей: argocd-repo-server авторизуется в Vault про помощи Service Account token, в манифесте Secret в < … > подставляет небходимое значение, и создаёт секрет.

Практическая часть

Настройка ArgoCD

Ниже будут преведены примеры необходимых дополнительных настроек для инсталяции ArgoCD при помощи официального helm chart.

Настройка argocd-server

Настройка конфига приложения argocd-server, для подключения плагина:

  # -- [General Argo CD configuration]   # @default -- See [values.yaml]   config:     configManagementPlugins: |       - name: argocd-vault-plugin         generate:           command: ["argocd-vault-plugin"]           args: ["generate", "./"]

Создание приложение main, которое будет являться app of app, и будет создавать остальные Application:

  # -- Deploy ArgoCD Applications within this helm release   # @default -- `[]` (See [values.yaml])   ## Ref: https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/   additionalApplications:     - name: main       namespace: argocd       additionalLabels: {}       additionalAnnotations: {}       project: default       source:         repoURL: https://github.com/dmitrii-dmnk/argocd-vault-plugin-demo.git         targetRevision: master         path: apps         helm:           valueFiles:             - values.yaml       destination:         server: https://kubernetes.default.svc         namespace: argocd       syncPolicy:         automated:           prune: true           selfHeal: true

Настройка argocd-repo-server

Существует возможность подключать AVP несколькими способами, но самый простой и менее затратный по времени вариант — при помощи initContainer. Схема получается следующей: на старте приложения argocd-repo-server, initContainer скачивает требуемый плагин. При помощи volume типа emptyDir, монтируем скаченный плагин в argocd-repo-server.

Настройка volume и volumeMounts в argocd-repo-server:

  # -- Additional volumeMounts to the repo server main container   volumeMounts:     - name: custom-tools       mountPath: /usr/local/bin/argocd-vault-plugin       subPath: argocd-vault-plugin    # -- Additional volumes to the repo server pod   volumes:     - name: custom-tools       emptyDir: {}

Ранее уже упоминалось, что запросы на получение секретов из Vault будет делать приложение argocd-repo-server, поэтому ему необходимо настроить serviceAccount:

  ## Repo server service account   ## If create is set to true, make sure to uncomment the name and update the rbac section below   serviceAccount:     # -- Create repo server service account     create: true     # -- Repo server service account name     name: argocd-repo-server

Настройка initContainer для скачивания плагина:

  # -- Init containers to add to the repo server pods   initContainers:     - name: download-tools       image: alpine:3.8       command: [ sh, -c ]       args:         - wget -O argocd-vault-plugin           https://github.com/argoproj-labs/argocd-vault-plugin/releases/download/v1.6.0/argocd-vault-plugin_1.6.0_linux_amd64 &&           chmod +x argocd-vault-plugin && mv argocd-vault-plugin /custom-tools       volumeMounts:         - mountPath: /custom-tools           name: custom-tools

Все настройки описанные выше собраны в одном файле argrocd-values.yaml, и их можно посмотреть на github.

Применение вышеописанных настроек в ArgoCD

В демонстративных целях можно воспользоваться готовой конфигурацией argocd-values.yaml, и выполнить развертывание ArgoCD, например, в minikube.

Клонируем репозиторий с настройками:

git clone git@github.com:dmitrii-dmnk/argocd-vault-plugin-demo.git; cd  argocd-vault-plugin-demo/helpers

Применяем параметры при помощи helm:

helm upgrade -i argocd argo/argo-cd \     --atomic \     --create-namespace -n argocd \     -f argocd-values.yaml \     --version=3.29.5

На этом этапе настройка ArgoCD завершена.

Настройка Vault

Если в Vault ещё не включена Kubernetes auth, её можно включить следующей командой:

vault auth enable kubernetes

В случае, если Kubernetes auth была только что подключена командой выше, необходимо настроить дополнительные параметры следующей командой:

vault write auth/kubernetes/config \   issuer="https://kubernetes.default.svc.cluster.local" \   token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \   kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443" \   kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

Стоит обратить внимание на параметр issuer=»https://kubernetes.default.svc.cluster.local», который необходим для Vault 1.9.0 и Kubernetes 1.20 и выше версий. Настоятельно рекомендуется ознакомиться подробнее с официальной документацией Vault с разделом Kubernetes auth method.

Для демонстрации добавим дополнительное KV хранилище 2-й версии, и поместим в него test секрет:

vault secrets enable -path=avp -version=2 kv vault kv put avp/test sample=secret

Создаём и применяем файл с policy для argocd-repo-server:

cat << EOF > /tmp/policy.hcl  path "avp/data/test" { capabilities = ["read"] }  EOF vault policy write argocd-repo-server /tmp/policy.hcl

В Kubernetes auth создаём роль для argocd-repo-server:

vault write auth/kubernetes/role/argocd-repo-server \ bound_service_account_names=argocd-repo-server \   bound_service_account_namespaces=argocd policies=argocd-repo-server

Создание App of secrets

Чтобы придерживаться GitOps подхода, необходимо добавить Application в основном git-репозиторий на который опирается ArgoCD. Добавленный Application должен создать Secret с параметрами из Vault. Ниже привдён пример Application с параметрами env для AVP:

apiVersion: argoproj.io/v1alpha1 kind: Application metadata:   name: app-of-secrets   namespace: argocd spec:   destination:     namespace: argocd     server: https://kubernetes.default.svc   project: default   syncPolicy:     automated:       prune: true       selfHeal: true   source:     path: apps/secrets     plugin:       env:         - name: AVP_TYPE           value: vault         - name: AVP_AUTH_TYPE           value: k8s         - name: AVP_K8S_ROLE           value: argocd-repo-server         - name: VAULT_ADDR           value: http://vault.vault:8200       name: argocd-vault-plugin     repoURL: https://github.com/dmitrii-dmnk/argocd-vault-plugin-demo.git     targetRevision: master

Secret манифест для Application app-of-secrets. Стоит обратить внимание на AVP аннотацию, указывающую путь к секрету в Vault. Полный список аннотаций для плагина доступен по ссылке argocd-vault-plugin.readthedocs.io

kind: Secret apiVersion: v1 metadata:   name: example-secret   namespace: default   annotations:     avp.kubernetes.io/path: "avp/data/test" type: Opaque stringData:   sample-secret: <sample>

На данном этапе секрет в дефолтном неймспейсе должен иметь значение из Vault. Возможно, необходимо будет сделать hard refresh в ArgoCD UI, либо выполнить команду:

argocd app sync --force app-of-secrets

Итог

Настройка ArgoCD сводится к: подкладыванию бинарного файла AVP, создание Application с env параметрами и создание Secret со stringData и аннотацией. В качестве бонуса был написан небольшой скрипт на баше, который автоматизирует развёртывание ArgoCD и Vault в minikube. Приветсвуется критика, пожелания, предложения.

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

@melpomane

Дизайнер


ссылка на оригинал статьи https://habr.com/ru/post/645773/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *