# Secretos de Kubernetes con Hashicorp Vault & External Secrets Operator.

En entradas anteriores vimos como manejar secretos de manera [dinamica](https://safernandez666.hashnode.dev/centralizando-secretos-dinamicos-con-hashicorp-vault) y [estatica](https://safernandez666.hashnode.dev/centralizando-secretos-con-hashicorp-vault). En esta nueva entrada vamos a jugar con [External Secrets Operator](https://external-secrets.io/v0.5.1/) o ESO, para manejar secretos contra [Hashicorp Vault](https://www.vaultproject.io/). Una buena practica para que los desarrolladores no dejen los secretos en texto claro.

Este operador es capaz de conectarse a varias bóvedas de contraseñas, solo resta leer la documentación.

Este es un esquema que resumen lo que vamos a realizar. Para ello vamos a usar un cluster en **minikube**.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707403889560/ba4535f1-b000-48e0-b555-fa61e8f5f694.png align="center")

## Instalación de Hashicorp Vault

Vamos a usar Helm Charts para la instalación y luego configuramos el cliente para agregar una key value. [Aca](https://github.com/safernandez666/ExternalSecretsOperator.git) les dejo el repositorio con los archivos de configuración necesarios.

```bash
helm repo add hashicorp https://helm.releases.hashicorp.com 
helm install vault hashicorp/vault --namespace vault --create-namespace -f hashicorp-vault/values.yaml
```

Si revisamos **values.yaml** vamos a ver que el entorno es Dev con un *Token* para la conexión. Lo ideal es que este token sea desplegado por nuestro pipeline, esto es meramente para el PoC.

```bash
kubectl port-forward vault-0 8200:8200 -n vault
```

Una vez realizado el comando hacemos el login y agregamos la entrada.

```bash
export VAULT_TOKEN="root"
export VAULT_ADDR='http://127.0.0.1:8200'

vault login -address=http://127.0.0.1:8200 -tls-skip-verify

vault kv put secret/dev/app username="admin" password="p4ssw0d"
```

Aca la entrada en UI.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707404090243/e3945f42-0fed-4e66-aa2e-0fb371d475fe.png align="center")

Ahora instalamos **External Secrets Operator**.

```bash
helm repo add external-secrets https://charts.external-secrets.io

helm install external-secrets 
external-secrets/external-secrets 
--namespace external-secrets 
--create-namespace 
--set installCRDs=true
```

Ya una vez desplegado Vault y ESO, desplegamos el Secret para autenticar contra Vault y sumamos la dirección del pod, de Vault, en **ClusterSecretStore**.

```yaml
---
apiVersion: v1
kind: Secret
metadata:
  name: vault-token-global
  namespace: external-secrets
stringData:
  # Solo para prueba, no usar en ambientes productivos.
  token: root
```

Actualizamos la dirección ip del ClusterIP.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707404112184/3a31fd8f-278f-413b-89a7-3f90b41a8a02.png align="center")

Cambiamos el server a la dirección del pod vualt-0.

```yaml
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
  name: vault-backend-global
spec:
  provider:
    vault:
      server: "http://172.17.0.3:8200"
      path: secret
      version: v2
      auth:
        # Puntero al Secreto Token para accesar a Vault
        # https://www.vaultproject.io/docs/auth/token
        tokenSecretRef:
          name: "vault-token-global"
          key: "token"
          namespace: external-secrets
```

Ahora creamos un namespace app para desplegar el External Secret.

```solidity
kubectl create ns app
namespace/app created

kubectl apply -f basic-secret.yaml -n app
externalsecret.external-secrets.io/basic-credentials created
```

El basic-secret.yaml contiene los siguientes campos.

```yaml
apiVersion: external-secrets.io/v1alpha1
kind: ExternalSecret
metadata:
  name: basic-credentials
spec:
  refreshInterval: "15s" # Intervalo de Refresco
  secretStoreRef: # Accesso a la Boveda
    name: vault-backend-global
    kind: ClusterSecretStore
  target:
    name: basic-credentials
  data:
  - secretKey: password
    remoteRef:
      key: dev/app
      property: password

  - secretKey: username
    remoteRef:
      key: dev/app
      property: username
```

Revisamos...

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707404140034/57dfede5-548b-408f-9029-ebc5b6117b3e.png align="center")

Ahora podemos revisar como se genero el Secret para ser usado.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707404148331/cd721d04-a928-42d7-ab4f-99063d3a613e.png align="center")

¡Ya tenemos ESO trabajando con Vault, para tener nuestros secretos de Kubernetes protegidos! Ahora a probarlo.
