Aller au contenu principal
Sommaire de la formation

Authentification de l'agent injector sur vault server

coolibra289 vues

Configuration :

  • Authentification au cluster (via auth/kubernetes)
  • Activer l'auth kubernetes et créer un role pour l'injector sur vault server
  • Configurer des policies

Activer l'auth kubernetes et créer un role pour l'injector sur vault server

  • auth kubernetes

Sur l'ui dans Acess > authentication methods  > enable new method > kubernetes

    • Renseigner le nom du cluster et activer. Ce nom doit être identique à celui renseigné dans values-injector.yaml injector.authPath

 

 

  • Récurperer les informations de configuration
KUBE_HOST=$(kubectl config view --raw --minify --flatten --output='jsonpath={.clusters[].cluster.server}')

kubectl config view --raw --minify --flatten --output 'jsonpath={.clusters[0].cluster.certificate-authority-data}' | base64 --decode

# remplacer bien le namespace et le nom de secret
TOKEN_REVIEW_JWT=$(kubectl -n vault-operator get secret vault-injector-token --output='go-template={{ .data.token }}' | base64 --decode)

 

 

Copier chaque valeur et les renseigner dans l'ui de vault comme si dessous.

 

  • Créer le kv kv-app-crm

Depuis l'ui vault, Secrets engines  > enable new engine > kv puis renseigner le path kv-app-crm et valider

 

Ajouter les 03  secrets(pg_user, pg_password, api_key) dans le path crm/dev.

Aussi pour ces 03  secrets(pg_user, pg_password, api_key) dans le path crm/prod.

 

  • Créer une une policy qui donne que les droits read et list au kv-app-crm/crm/dev uniquement

Depuis l'ui vault, Policies > create ACL policy

Faire attention à la casse et au nom du path

 

  • Créer un role vault pour auth/kubernetes et le lier à la policy crm-dev-policy

Depuis l'ui vault,  Access > k8s-gke-sd-dev > create role

 

Faire attention à la casse et au nom de la policy.

A present, agent injector et vault server peuvent communiquer en sécurité.

 

Test avec une application

 

  • Créer un namespace
kubectl create namespace crm-app-dev

 

  • Déployer une application qui aura en variable d'environnement les sercret pg_user, pg_password et api_key
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: crm-app-dev
  namespace: crm-app-dev
  labels:
    app: crm-app-dev
spec:
  selector:
    matchLabels:
      app: crm-app-dev
  replicas: 1
  template:
    metadata:
      annotations:
        vault.hashicorp.com/agent-inject: 'true'
        vault.hashicorp.com/role: 'gke-sd-dev-role'
        vault.hashicorp.com/agent-inject-secret-config.ini: 'kv-app-crm/data/crm/dev'
        vault.hashicorp.com/agent-inject-template-config: |
          {{- with secret "kv-app-crm/data/crm/dev" -}}
            export pg_password="{{ .Data.data.pg_password }}"
            export pg_user="{{ .Data.data.pg_user }}"
            export api_key="{{ .Data.data.api_key }}"
          {{- end }}
      labels:
        app: crm-app-dev
    spec:
      containers:
        - name: demo-app
          image: python:3.12
          command:
            - /bin/sh
          args:
            - "-c"
            - |
              # afficher les variables d'environnement
              env
              tail -f /dev/null
          resources:
            requests:
              memory: "64Mi"
              cpu: "250m"
            limits:
              memory: "128Mi"
              cpu: "500m"
EOF

 

  • Vérifier les logs 
kubectl -n crm-app-dev logs deploy/crm-app-dev

 

 

On voit bien que l'injector a bien réussi à recuperer les secrets depuis vault et les injecter dans le pod. L'injector à en réalité créé le fichier /vault/secrets/config qui contient les secret. C'est fichier qui a été sourcé. Pour le voir:

kubectl -n crm-app-dev exec -it po/crm-app-dev-66b5c497f6-l8sgn -- bash

cat /vault/secrets/config

 

 

  • Pour avoir un fichier json
        vault.hashicorp.com/agent-inject-secret-config.json: 'kv-app-crm/data/crm/dev'
        vault.hashicorp.com/agent-inject-template-config.json: |
          {{- with secret "kv-app-crm/data/crm/dev" -}}
            export pg_password="{{ .Data.data.pg_password }}"
            export pg_user="{{ .Data.data.pg_user }}"
            export api_key="{{ .Data.data.api_key }}"
          {{- end }}

Commentaires

Connectez-vous pour rejoindre la discussion.

Aucun commentaire pour le moment.