Vault - Didacticiels

Déployer Vault

Vault peut être déployé via ITCare depuis la section Sécurité du menu latéral gauche.

Un bouton Créer une instance Vault vous permet d'accéder au formulaire de déploiement.

Chercher et sélectionner le Service Global dans lequel vous allez créer votre nouvelle instance Vault. Cliquer sur Suivant.

A l'étape suivante, fournir les informations suivantes :

  • Le nom de l'instance de Vault

  • Le groupe AD de sécurité pour l'administration

Si la création d'un nouveau groupe AD de sécurité est nécessaire, merci de créer une ticket requête via le formulaire Gestion des groupes AD.

Cliquer sur Suivant, puis sélectionner la Région dans laquelle vous souhaitez effectuer le déploiement.

Enfin, la synthèse de votre demande s'affiche. Vérifier les informations saisies puis soumettre pour lancer la création de votre instance Vault.

Une fois l'instance créée, vous serez notifié par e-mail.

Depuis votre Bastion, accédez ensuite à votre instance Vault : https://<cluster>.vault.cegedim.cloud

Le CLI Vault sur votre bastion

Cette procédure vous explique comment déployer le CLI Vault sur votre bastion.

Télécharger la dernière version de Vault CLI depuis https://www.vaultproject.io/downloads sur votre poste de travail.

Copier le fichier téléchargé "vault_x.x.x_windows_amd64.zip" sur votre Bastion dans C:\temp.

Ouvrir un cmd shell et exécutez la commande ci-dessous :

mkdir %LOCALAPPDATA%\Vault "C:\Program Files\7-Zip\7z.exe" e c:\temp\vault_x.x.x_windows_amd64.zip "*.*" -o"%LOCALAPPDATA%\Vault"

Intégration Kubernetes

Demande de prérequis Vault sur Kubernetes

Cet article décrit comment demander le prérequis de Vault sur les Services de conteneurs de cegedim.cloud.

Un cluster Kubernetes existant est requis pour configurer une intégration avec Vault

Demander le Kubernetes Authorized Endpoint pour Vault + la charte Vault

Pourquoi

Le cluster cegedim Vault a besoin d'accéder directement à l'API Kubernetes (l'accès via Rancher n'est pas pris en charge) et demander l'ajout dans Rancher Apps & Marketplace de la "charte officielle Hashicorp Vaul".

Comment

Utilisez ITCare pour Formuler une demande via le formulaire de demande de support "Toutes autres sollicitations relatives aux Solutions/Outils IT".

  • Objet de votre demande : Créer un K8S Authorized Endpoint pour Vault et ajouter la charte Vault <CCS ccs2-my-cluster>.

  • Commentaires :

    • Merci de configurer sur ce cluster K8S <CCS ccs2-my-cluster>: - Kubernetes API Authorized Endpoint for Vault connexion - Ajouter "Official Hashicorp Vaul Chart" dans Rancher Apps & Marketplace

Après la résolution du ticket, allez dans Rancher Cluster ManagerCluster → Modifier pour vérifier si l'Authorized EndPoint est activé.

À partir de Rancher Cluster ExplorerApps & Marketplace, vérifiez si le graphique de la voûte est disponible.

Configurer Vault Injector sur Kubernetes

Cet article décrit comment configurer l'injecteur Vault sur le service Kubernetes fourni par cegedim.cloud.

Créer un projet et un espace Vault

  • Créer un projet : vault

  • Créer un espace : vault

Déployer Vault Agent Injector

  • Depuis Rancher, allez dans "Apps & Marketplace" → "Charts".

  • Recherchez "vault" et sélectionnez "vault - Official HashiCorp Vault Chart".

  • Sélectionnez l'espace "vault" et nommez votre déploiement "vault-injector"

Allez dans "Values YAML" et recherchez le paramètre "externalVaultAddr" pour définir la valeur avec l'URL de votre cluster de vault : https://<cluster>.vault.cegedim.cloud

Cliquez sur Installer.

Étapes de contrôle

Le déploiement sera créé dans l'espace vault :

ClusterRole :

  • vault-injector-agent-injector-clusterrole

ServiceAccounts :

  • vault-injector : ce compte de service sera utilisé par vault pour se connecter à l'API Kubernetes.

  • vault-injector-agent-injector : ce compte de service est utilisé par le vault-injector-agent-injector

CusterRoleBindings :

  • vault-injector-agent-injector-binding: attache le ClusterRole vault-injector-agent-injector-clusterrole au compte de service vault-injector-agent-injector

  • vault-injector-server-binding : fournit system:auth-delegator au compte de service vault-injector

Déploiement :

  • vault-injector-agent-injector

Configuration de la méthode d'authentification Kubernetes sur cegedim Vault

Cet article décrit comment activer la méthode auth de kubernetes pour s'authentifier sur l'instance Vault cegedim.cloud en utilisant un jeton de compte de service Kubernetes.

Conditions préalables :

  • CLI de Vault

  • Point d'accès autorisé de Kubernetes pour Vault

  • certificat kubernetes

Activer Méthode d'authentification Kubernetes sur votre cegedim.cloud Services de conteneurs Depuis Vault CLI configuré et connecté à votre cegedim.cloud Vault instance cluster.

vault auth enable -path=kubernetes-<ccs-my-cluster> kubernetes

Vous pouvez vérifier avec l'interface utilisateur de Vault la configuration de cette méthode d'authentification dans l'onglet Accès.

Configurer la méthode Auth de Kubernetes

Conditions préalables :

  • jeton_reviewer_jwt: Token à obtenir de Rancher Kubernetes Secret vault-injector-token

  • kubernetes_host: Kubernetes Authorized Endpoint API pour obtenir de la configuration de Rancher Kubernetes Cluster.

  • kubernetes_ca_cert: Utiliser ci-dessous le certificat racine de l'AC de l'API Kubernetes Authorized Endpoint

Il ne s'agit pas de l'AC de Kubernetes car l'API Kubernetes Authorized Endpoint est exposée par cegedim.cloud Load Balancer et par Let's Encrypt.

Copiez/collez le fichier de certificat ci-dessous sur C:\Temp dans votre profil bastion pour permettre l'accès avec Vault CLI.

  • À partir du shell cmd, exécutez la commande ci-dessous avec les valeurs prérequises correctes ci-dessus pour configurer la méthode Auth :

vault write auth/kubernetes-<ccs-my-cluster>/config token_reviewer_jwt="xxxxxxxxxxxxxxxxxx" kubernetes_host="https://<my-ccs-cluster>-api.ccs.cegedim.cloud" kubernetes_ca_cert=@isg_root_x1.cer disable_iss_validation=true

Cas d'usage agents Vault avec Kubernetes

Injecter des secrets dans le chemin du pod /vault/secrets/

Cet article décrit comment déployer la base de données PostgreSQL avec le nom d'utilisateur et le mot de passe stockés dans l'instance Vault.

Conditions préalables :

  • Cluster Kubernetes cegedim.cloud

  • Instance Vault cegedim.cloud

  • CLI de Vault

  • Kubernetes connecté à Vault

  • Kubectl

Connectez-vous à votre Vault

#Skip vault verification
set VAULT_SKIP_VERIFY=True
 
#Set vault address
set VAULT_ADDR="https://<my-vault-cluster>.vault.cegedim.cloud/"
 
#Get vault status
vault status
 
#Login on vault by selecting ldap method
vault login -method=ldap username="adm-<your-login>"

Créer le moteur demopostgres

Il est important de préfixer tout engine path par ce chemin statique secret/ sinon vous ne pourrez pas administrer avec le rôle d'administrateur de votre BU.

#Create Engine on vault
vault secrets enable -path=secret/demopostgres kv-v2

Créez votre nom d'utilisateur et votre mot de passe DB Secret

#Create your secret on vault
vault kv put secret/demopostgres/db username="myusername" password="mysecret"
 
#Check secret
vault kv get secret/demopostgres/db

Créer le fichier de politique de lecture JSON C:\Temp\policy_demopostgres.json

path "secret/demopostgres/data/db"
{
  capabilities = ["read"]
}

Créer une politique

#Create policy
vault policy write policy_demopostgres c:\Temp\policy_demopostgres.json
 
#Check policy creation
vault policy read policy_demopostgres

Appliquer la politique sur le secret

Cette action connecte le compte de service Kubernetes sa-demopostgres, de l'espace de noms vault-demopostgres avec la politique Vault policy_demopostgres.

Le jeton renvoyé après l'authentification est valide pendant 24 heures.

#Apply policy on secret
vault write auth/kubernetes-<ccs-my-cluster>/role/demopostgres bound_service_account_names=sa-demopostgres bound_service_account_namespaces=vault-demopostgres policies=policy_demopostgres ttl=24h

Créer un espace de nom

#Create Namespace
kubectl create namespace vault-demopostgres

Créer un compte de service Kubernetes

#Create Kubernetes Service Account
kubectl create serviceaccount sa-demopostgres --namespace vault-demopostgres
 
# Verify that the service account has been created
kubectl get serviceaccounts --namespace vault-demopostgres

Créer le fichier de déploiement vault_demopostgres.yaml

vault_demopostgres.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: db-postgres
  name: db-postgres
spec:
  selector:
    matchLabels:
      app: db-postgres
  replicas: 1
  template:
    metadata:
      labels:
        app: db-postgres
      annotations:
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/role: "demopostgres"
        vault.hashicorp.com/agent-inject-status: "update"
        vault.hashicorp.com/agent-cache-enable: "true"
        vault.hashicorp.com/auth-path: auth/kubernetes-ccs2-rd-shared
        vault.hashicorp.com/agent-inject-secret-db-username: secret/demopostgres/db
        vault.hashicorp.com/agent-inject-template-db-username: |
          {{ with secret "secret/demopostgres/db" -}}
          {{ .Data.data.username }}
          {{- end }}
        vault.hashicorp.com/agent-inject-secret-db-password: secret/demopostgres/db
        vault.hashicorp.com/agent-inject-template-db-password: |
          {{ with secret "secret/demopostgres/db" -}}
          {{ .Data.data.password }}
          {{- end }}
    spec:
      serviceAccountName: sa-demopostgres
      containers:
      - name: db-postgres
        image: postgres
        imagePullPolicy: "IfNotPresent"
        env:
        - name: POSTGRES_USER_FILE
          value: /vault/secrets/db-username
        - name: POSTGRES_PASSWORD_FILE
          value: /vault/secrets/db-password
        - name: POSTGRES_HOST_AUTH_METHOD
          value: "scram-sha-256"
        - name: POSTGRES_INITDB_ARGS
          value: --auth-host=scram-sha-256
        ports:
        - containerPort: 5432
        resources:
          requests:
            memory: "200Mi"
            cpu: "100m"
          limits:
            memory: "1Gi"
            cpu: "500m"
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgresql-data
      volumes:
      - name: postgresql-data
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: db-postgres
spec:
  selector:
    app: db-postgres
  ports:
  - protocol: TCP
    port: 5432

Déploiement de Vault Postgres Demo

kubectl apply -f vault_demopostgres.yaml --namespace vault-demopostgres

Étapes de contrôle

  • Vérifiez votre déploiement dans Rancher

Injecter des Secrets dans un pod avec Configmap

Cet article décrit comment déployer SonarQube une application avec une base de données PostgreSQL dont le nom d'utilisateur et le mot de passe sont stockés dans l'instance Vault de cegedim.cloud.

Conditions préalables :

  • Cluster Kubernetes cegedim.cloud

  • Instance Vault cegedim.cloud

  • CLI de Vault

  • Kubernetes connecté à Vault

  • Kubectl

Connectez-vous à votre Vault

#Skip vault verification
set VAULT_SKIP_VERIFY=True
 
#Set vault address
set VAULT_ADDR="https://<my-vault-cluster>.vault.cegedim.cloud/"
 
#Get vault status
vault status
 
#Login on vault by selecting ldap method
vault login -method=ldap username="adm-<your-login>"

Créer le moteur demopostgres

Il est important de préfixer tout engine path par ce chemin statique secret/ sinon vous ne pourrez pas administrer avec le rôle d'administrateur de votre BU.

#Create Engine on vault
vault secrets enable -path=secret/demopostgres kv-v2

Créez votre nom d'utilisateur et votre mot de passe DB Secret (ou réutiliser le DB Secret créé précédemment)

#Create your secret on vault
vault kv put secret/demopostgres/db username="myusername" password="mysecret"
 
#Check secret
vault kv get secret/demopostgres/db

Créer le fichier de politique de lecture JSON C:\Temp\policy_demopostgres.json

path "secret/demopostgres/data/db" { capabilities = ["read"] }

Créer une politique

#Create policy
vault policy write policy_demopostgres c:\Temp\policy_demopostgres.json
 
#Check policy creation
vault policy read policy_demopostgres

Appliquer la politique sur le secret

Cette action connecte le compte de service Kubernetes sa-demopostgres, de l'espace de noms vault-demopostgres avec la politique Vault policy_demopostgres.

Le jeton renvoyé après l'authentification est valide pendant 24 heures.

#Apply policy on secret
vault write auth/kubernetes-<ccs-my-cluster>/role/demopostgres bound_service_account_names=sa-demopostgres bound_service_account_namespaces=vault-demopostgres policies=policy_demopostgres ttl=24h

Créer un espace de nom (ou réutiliser un Namespace créé précédemment)

#Create Namespace
kubectl create namespace vault-demopostgres

Créer un compte de service Kubernetes (ou réutiliser le compte de service créé précédemment)

#Create Kubernetes Service Account
kubectl create serviceaccount sa-demopostgres --namespace vault-demopostgres
 
# Verify that the service account has been created
kubectl get serviceaccounts --namespace vault-demopostgres

Créer le fichier de déploiement vault_demosonarqube.yaml

vault_demosonarqube.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: db-sonarqube
  name: db-sonarqube
spec:
  selector:
    matchLabels:
      app: db-sonarqube
  replicas: 1
  template:
    metadata:
      labels:
        app: db-sonarqube
      annotations:
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/role: "demopostgres"
        vault.hashicorp.com/agent-inject-status: "update"
        vault.hashicorp.com/agent-cache-enable: "true"
        vault.hashicorp.com/auth-path: auth/kubernetes-ccs2-rd-shared
        vault.hashicorp.com/agent-inject-secret-db-username: secret/demopostgres/db
        vault.hashicorp.com/agent-inject-template-db-username: |
          {{ with secret "secret/demopostgres/db" -}}
          {{ .Data.data.username }}
          {{- end }}
        vault.hashicorp.com/agent-inject-secret-db-password: secret/demopostgres/db
        vault.hashicorp.com/agent-inject-template-db-password: |
          {{ with secret "secret/demopostgres/db" -}}
          {{ .Data.data.password }}
          {{- end }}
    spec:
      serviceAccountName: sa-demopostgres
      containers:
      - name: db-sonarqube
        image: postgres
        imagePullPolicy: "IfNotPresent"
        env:
        - name: POSTGRES_USER_FILE
          value: /vault/secrets/db-username
        - name: POSTGRES_PASSWORD_FILE
          value: /vault/secrets/db-password
        - name: POSTGRES_HOST_AUTH_METHOD
          value: "scram-sha-256"
        - name: POSTGRES_INITDB_ARGS
          value: --auth-host=scram-sha-256
        ports:
        - containerPort: 5432
        resources:
          requests:
            memory: "200Mi"
            cpu: "100m"
          limits:
            memory: "1Gi"
            cpu: "500m"
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgresql-data
      volumes:
      - name: postgresql-data
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: db-sonarqube
spec:
  selector:
    app: db-sonarqube
  ports:
  - protocol: TCP
    port: 5432
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: app-sonarqube
  name: app-sonarqube
spec:
  selector:
    matchLabels:
      app: app-sonarqube
  replicas: 1
  template:
    metadata:
      annotations:
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/role: "demopostgres"
        vault.hashicorp.com/agent-inject-status: "update"
        vault.hashicorp.com/agent-cache-enable: "true"
        vault.hashicorp.com/agent-cache-use-auto-auth-token: "force"
        vault.hashicorp.com/auth-path: auth/kubernetes-ccs2-rd-shared
        vault.hashicorp.com/agent-inject-secret-sonar.properties: secret/demopostgres/db
        vault.hashicorp.com/secret-volume-path-sonar.properties: "/opt/sonarqube/conf/"
        vault.hashicorp.com/agent-inject-file-sonar.properties: "sonar.properties"
        vault.hashicorp.com/agent-inject-template-file-sonar.properties: /tmp/sonar.properties.tmpl
        vault.hashicorp.com/agent-copy-volume-mounts: app-sonarqube
      labels:
        app: app-sonarqube
    spec:
      serviceAccountName: sa-demopostgres
      containers:
        - name: app-sonarqube
          image: sonarqube:lts-community
          imagePullPolicy: "IfNotPresent"
          resources:
            requests:
              memory: "1200Mi"
              cpu: "100m"
            limits:
              memory: "2500Mi"
              cpu: "500m"
          volumeMounts:
          - mountPath: /opt/sonarqube/data/
            name: sonar-data
          - mountPath: /opt/sonarqube/extensions/
            name: sonar-extensions
          - mountPath: /opt/sonarqube/logs
            name: sonar-logs
          - mountPath: /opt/sonarqube/temp
            name: sonar-temp
          - name: properties
            mountPath: /tmp/sonar.properties.tmpl
            subPath: sonar.properties.tmpl
          ports:
          - containerPort: 9000
            protocol: TCP
      volumes:
      - name: sonar-data
        emptyDir: {}
      - name: sonar-extensions
        emptyDir: {}
      - name: sonar-logs
        emptyDir: {}
      - name: sonar-temp
        emptyDir: {}
      - name: properties
        configMap:
          name: app-sonarqube
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-sonarqube
data:
  sonar.properties.tmpl: |
    {{- with secret "secret/demopostgres/db" -}}
    ldap.url: {{ .Data.data.url }}
    ldap.bindDn: CN=sa_rd_automation,OU=Service Accounts,OU=Cegedim R&D,OU=BOU,OU=FR,OU=EMEA,DC=emea,DC=cegedim,DC=grp
    ldap.bindPassword: {{.Data.data.binddn }}
    ldap.group.baseDn: OU=EMEA,DC=emea,DC=cegedim,DC=grp
    ldap.user.baseDn: OU=EMEA,DC=emea,DC=cegedim,DC=grp
    ldap.user.request: (&(objectClass=user)(UserPrincipalName={login}))
    sonar.security.realm: LDAP
    sonar.jdbc.password: {{ .Data.data.password }}
    sonar.jdbc.url: jdbc:postgresql://db-sonarqube:5432/{{ .Data.data.username }}
    sonar.jdbc.username: {{ .Data.data.username }}
    {{- end }}
---
apiVersion: v1
kind: Service
metadata:
  name: app-sonarqube
spec:
  selector:
    app: app-sonarqube
  ports:
  - protocol: TCP
    port: 9000
    targetPort: 9000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-sonarqube
spec:
  rules:
  - host: sonardemo.ccs2-rd-shared.ccs.cegedim.cloud
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: app-sonarqube
            port:
              number: 9000

Déployer la démo de Vault SonarQube

kubectl apply -f vault_demosonarqube.yaml --namespace vault-demopostgres

Étapes de contrôle

Dernière mise à jour