Skip to main content

Integrando Vault com Kubernetes

ATENÇÃO, ESTE FLUXO É EXCLUSIVAMENTE PARA REALIZAR A INTEGRAÇÃO MANUALMENTE.
UTILIZE PREFERENCIALMENTE O BOT DO DISCORD PARA CRIAR OS PROJETOS E INTEGRAR O VAULT AUTOMATICAMENTE. ESTE FLUXO É APENAS UM ÚLTIMA INSTÂNCIA!

No terminal do droplet do Vault você precisará rodar inicialmente o seguinte comando:

export VAULT_ADDR=https://hashicorp-vault.digitalsys.app 

Com isso você conseguirá utilizar os comandos do Vault utilizado pela empresa

Dito isso, as etapas são:

## 1. Habilitar AppRole
vault auth enable approle

## 2. Criar um arquivo de policy com a nomenclatura "nome-da-policy.hcl" e estutura abaixo
path "kv/data/apps/<ambiente>//*" {
capabilities = ["read", "list"]
}
path "kv/metadata/apps/<ambiente>//*" {
capabilities = ["list"]
}
## 3. Aplicar a policy
vault policy write <nome-da-policy> <nome-da-policy>.hcl
## 4. Criar role
vault write auth/approle/role/<nome-da-role> \
token_policies="<nome-da-policy>" \
token_ttl=1h \
token_max_ttl=4h

Obs.: note que <nome-da-policy> foi definido na etapa 3

## 5. Obtenha o valor de Role ID e Secret ID para utilizar no passo 6
vault read auth/approle/role/&lt;nome-da-role>/role-id ## OBTÉM O ROLE ID
vault write -f auth/approle/role/&lt;nome-da-role>/secret-id. ## OBTÉM O SECRET ID

## 6. Criar o secret no namespace. O exemplo abaixo foi gerado via kubectl, porém pode ser feito com outra ferramenta que te permita criar um secret

kubectl create secret generic &lt;nome-do-secret> \
-n &lt;namespace> \
--from-literal=roleId=&lt;ROLE_ID> \
--from-literal=secretId=&lt;SECRET_ID>
## 7. Crie um arquivo de SecretStore (&lt;nome-do-arquivo>.yml), com a estrutura abaixo
apiVersion: external-secrets.io/v1
kind: ClusterSecretStore
metadata:
name: &lt;nome da store>
spec:
provider:
vault:
server: &lt;URL do vault>
path: kv
version: v2
auth:
appRole:
path: approle
roleRef:
name: &lt;nome-do-secret>
key: roleId
secretRef:
name: &lt;nome-do-secret>
key: secretId
## 8. Aplique esse SecretStore no seu cluster
kubectl apply -f &lt;nome-do-arquivo>.yaml
## 9. Crie o arquivo de ExternalSecret (&lt;nome-do-arquivo>.yml)
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: esus-api-secret
namespace: &lt;namespace a aplicar>
spec:
secretStoreRef:
name: &lt;nome da store> # 👈 exatamente o nome SecretStore, da etapa 7
kind: SecretStore
target:
name: &lt;nome da secret que será criado p/ salvar as informacoes>
creationPolicy: Owner
dataFrom:
- extract:
key: kv/data/apps/dev/esus/api #apenas um exemplo, aqui é o caminho que você criou no frontend do Vault
## 10. Aplique o arquivo de ExternalSecret
kubectl apply -f &lt;nome do arquivo>

Agora é possível utilizar o secret no deploy do kubernetes, conforme exemplo abaixo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.esusWeb.appName }}
  namespace: {{ .Values.namespace }}
  labels:
    app: {{ .Values.esusWeb.appName }}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ .Values.esusWeb.appName }}
  template:
    metadata:
      labels:
        app: {{ .Values.esusWeb.appName }}
    spec:
      containers:
        - name: {{ .Values.esusWeb.appName }}
          image: {{ .Values.esusWeb.image }}
          ports:
            - containerPort: {{ .Values.esusWeb.ports | first }}
          envFrom:
            - secretRef:
                name: esus-web-env # <--- aqui vai o nome do secret , o mesmo que foi criado em target.name no item 7

Obs.: Caso dê erro ao dar apply no ExternalSecret, usar os comandos abaixo para habilitar o External Secret:

##### **🔧 1. Adicionar o repositório Helm:**
helm repo add external-secrets https://charts.external-secrets.io
helm repo update

##### **🔧 2. Instalar o ESO no cluster:**
helm upgrade --install external-secrets external-secrets/external-secrets \
-n external-secrets \
--create-namespace