Pular para o conteúdo principal

Argo CD Config Management Plugin

A partir da v4.5, o CipherVault tem CLI cv-argocd-cmp que se integra ao Argo CD como Config Management Plugin (CMP). Resolve placeholders {{cv:vault/path}} nos manifests Kubernetes antes do Argo aplicar no cluster.

Resultado: GitOps puro sem secret estático no repo nem no Argo CD — manifests no Git têm placeholders, plugin injeta valores no momento do sync.

Instalação como sidecar do Argo

# argocd-cmp-server-cv.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cv-cmp-plugin
namespace: argocd
data:
plugin.yaml: |
apiVersion: argoproj.io/v1alpha1
kind: ConfigManagementPlugin
metadata:
name: ciphervault
spec:
version: v1.0
generate:
command: ["cv-argocd-cmp"]
args: ["render", "--manifests-dir", "."]
discover:
find:
command: ["sh", "-c", "find . -name '*.yaml' | xargs grep -l '{{cv:' || true"]

Patch o ConfigMap argocd-repo-server para incluir o sidecar:

spec:
template:
spec:
containers:
- name: cv-cmp
image: ghcr.io/martinez1991/ciphervault-argocd-cmp:v4.5.0
env:
- name: CV_URL
value: https://cv.acme.com.br
- name: CV_CLIENT_ID
valueFrom: { secretKeyRef: { name: cv-cmp-creds, key: client_id } }
- name: CV_CLIENT_SECRET
valueFrom: { secretKeyRef: { name: cv-cmp-creds, key: client_secret } }

Uso nos manifests

apiVersion: v1
kind: Secret
metadata:
name: stripe
namespace: billing
stringData:
STRIPE_KEY: "{{cv:producao/api/stripe/secret_key}}"
WEBHOOK_SECRET: "{{cv:producao/api/stripe/webhook_secret}}"

Argo CD chama cv-argocd-cmp render que:

  1. Lê todos os YAMLs do diretório
  2. Detecta padrões {{cv:vault/path}}
  3. Busca no CV via mTLS
  4. Substitui e devolve YAML resolvido para Argo CD aplicar

Segurança

  • mTLS entre Argo CMP sidecar e CV
  • Audit log registra cada chamada com source: "argocd-cmp"
  • Não cacheia valores entre renders — cada sync busca fresh
  • Filesystem isolado do sidecar — manifests resolvidos ficam só em memória
  • Falha-soft — placeholder não encontrado → render falha (não aplica manifest incompleto)

Limitações

  • Sem suporte a Helm templating — apenas plain YAML (use Helm + CMP separados em sequência)
  • Sem suporte a Kustomize patches com placeholders — apenas base + overlays
  • Sem suporte a Dynamic Secrets lease — apenas leitura de secrets persistentes

Boas práticas

  • Placeholders só em K8s Secret — não use em ConfigMap (acaba commitado por engano)
  • Audit alertas em volume incomum de argocd-cmp source — pode indicar comprometimento do Argo
  • Rotacionar credenciais do CMP a cada 3 meses