Déploiement d’une image Docker personnalisée d’Apereo CAS sous Kubernetes via Helm (LDAP, OIDC, OAuth2)

Découvrez comment déployer efficacement un serveur Apereo CAS personnalisé avec Kubernetes en utilisant Helm. Cet article vous guide étape par étape vers un déploiement réussi intégrant notamment LDAP, OpenID Connect (OIDC) et OAuth2.


🔷 Objectifs de ce guide :

  • Déployer une image Docker d’Apereo CAS personnalisée.
  • Utiliser un fichier values.yaml complet pour configurer CAS.
  • Gérer les configurations des services via ConfigMap.
  • Activer les authentifications LDAP, OAuth2 et OIDC.
  • Garantir la sécurité et la confidentialité du déploiement.

✅ Prérequis techniques

  • Cluster Kubernetes
  • Helm installé
  • Registre Docker privé avec l’image CAS prête
  • Secrets et certificats SSL correctement gérés via Kubernetes

Préparer l’image Docker d’Apereo CAS

Avant de déployer, il est nécessaire de construire et publier une image Docker d’Apereo CAS adaptée à vos besoins.
Si ce n’est pas encore fait, suivez ce guide de construction d’une image Docker Apereo CAS personnalisée.

Exemple attendu d’image :

  • Registry : votre-registre-docker.example.org
  • Repository : devops/images/cas/cas-server
  • Tag : v6.6.7

Cloner le chart Helm officiel d’Apereo CAS

Le chart officiel est disponible ici :
👉 apereo/cas-initializr/tree/master/app/src/main/resources/overlay/helmcharts/helm/cas-server

Clonez-le :

git clone https://github.com/apereo/cas-initializr.git
cd cas-initializr/app/src/main/resources/overlay/helmcharts/helm/cas-server

🛠️ Extrait du fichier values.yaml

Voici un extrait du fichier values.yaml incluant les parties essentielles à configurer :

casServerName: cas.example.org
casMgmtServerName: cas-mgmt.example.org

image:
  registry: "votre-registre-docker.example.org"
  repository: "devops/images/cas/cas-server"
  tag: "v6.6.7"

imagePullSecrets:
  - name: regcred

keystorePVC:
  claimName: cas-jwks-pvc

casServerContainer:
  jvm:
    extraOpts: >
      -Djavax.net.ssl.trustStore=/etc/cas/truststore
      -Djavax.net.ssl.trustStorePassword=changeit
    maxHeapOpt: "-Xmx2G"
    newHeapOpt: "-Xms600M"

  extraVolumeMounts:
    - name: truststore
      mountPath: /etc/cas/truststore
      subPath: truststore
    - name: cas-services-config
      mountPath: /etc/cas/services
    - name: cas-jwks
      mountPath: /etc/cas/config/jwks

  extraVolumes:
    - name: truststore
      configMap:
        name: cas-truststore
    - name: cas-services-config
      configMap:
        name: cas-server-services
    - name: cas-jwks
      persistentVolumeClaim:
        claimName: "{{ .Values.keystorePVC.claimName }}"

casConfigMounts:
  - 'cas.yaml'

casConfig:
  cas.yaml: |-
    cas:
      server:
        name: https://{{ .Values.casServerName }}
        prefix: ${cas.server.name}/cas

      serviceRegistry:
        json:
          location: file:/etc/cas/services

      authn:
        ldap:
          - order: 0
            ldap-url: ldaps://ldap.example.org:636
            base-dn: DC=example,DC=org
            search-filter: (&(objectClass=person)(|(sAMAccountName={user})(mail={user})))
            principal-attribute-id: sAMAccountName
            principal-attribute-list: sn,givenName,memberOf,cn,mail,displayname,sAMAccountName:uid,mail:email,cn:name
            allow-multiple-principal-attribute-values: true

        oidc:
          core:
            issuer: ${cas.server.prefix}/oidc
          jwks:
            file-system:
              jwks-file: file:/etc/cas/config/jwks/keystore.jwks

Remarque :
Cet extrait est un exemple type. Pensez à adapter les URLs, passwords et autres valeurs sensibles à votre contexte réel en les stockant dans des secrets Kubernetes ou HashiCorp Vault.


📌 Configuration des services CAS via ConfigMap

La gestion des services dans Apereo CAS se fait via des fichiers JSON. Voici une ConfigMap complète pour déclarer différents services :

apiVersion: v1
kind: ConfigMap
metadata:
  name: cas-server-services
  namespace: cas
data:
  HTTPandHTTPS-10000002.json: |-
    {
      "@class" : "org.apereo.cas.services.CasRegisteredService",
      "serviceId" : "^(http|https)://.*(example.org|localhost)(:.*|/|).*",
      "name" : "Exemple SSO Service",
      "id" : 10000002,
      "proxyPolicy" : {
        "@class" : "org.apereo.cas.services.RegexMatchingRegisteredServiceProxyPolicy",
        "useServiceId": true,
        "exactMatch": false
      },
      "attributeReleasePolicy" : {
        "@class" : "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"
      }
    }
  
  OAuth-10000007.json: |-
    {
      "@class": "org.apereo.cas.support.oauth.services.OAuthRegisteredService",
      "clientId": "xxxxxxxxxxx",
      "clientSecret": "xxxxxxxxxxxxxxxxxx",
      "serviceId" : "^(http|https)://.*(example.org|localhost)(:.*|/|).*",
      "name" : "OAuth Service",
      "id": 10000007,
      "attributeReleasePolicy" : {
        "@class" : "org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy",
        "allowedAttributes" : [ "java.util.ArrayList", ["cn","mail","sn","givenName","memberOf"] ]
      }
    }

  OIDC-10000009.json: |-
    {
      "@class": "org.apereo.cas.services.OidcRegisteredService",
      "clientId": "test-client",
      "clientSecret": "xxxxxxxxxxxxxxxxxx",
      "serviceId": "^https://chat\\.dev\\.kube\\.test\\.fr/oauth/oidc/callback(\\?.*)?$",
      "name": "OIDC Service",
      "id": 10000009,
      "description": "OpenID Connect client pour OpenWebUI",
      "scopes": ["java.util.HashSet", ["openid","profile","email"]],
      "bypassApprovalPrompt": true,
      "generateRefreshToken": true,
      "userProfileViewType": "FLAT",
      "includeClaimsInIdToken": true,
      "scopes": [ "java.util.HashSet", [ "openid", "profile", "email" ] ],
      "supportedGrantTypes": [ "java.util.HashSet", [ "authorization_code", "refresh_token" ] ]
    }

Conseil : Mappez cette ConfigMap dans votre déploiement via le volume cas-services-config pour charger dynamiquement vos services CAS.


🚀 Déploiement via Helm

Avec votre fichier values.yaml prêt et votre ConfigMap en place, lancez l’installation :

helm upgrade --install cas-server . -n cas --create-namespace -f values.yaml

🧪 Vérifications et tests

Après déploiement, vérifiez votre instance CAS :

  • URL principale :
    https://cas.example.org/cas
  • URL de statut (health) :
    https://cas.example.org/cas/actuator/health

🔐 Recommandations de sécurité

  • Toutes les informations sensibles (mots de passe, secrets OAuth, clés privées) doivent être placées dans des secrets Kubernetes.
  • Gérez vos certificats SSL via Cert-manager et Let’s Encrypt.

Avec cet article complet et détaillé, vous avez toutes les clés en main pour un déploiement professionnel d’Apereo CAS sous Kubernetes avec LDAP, OAuth2 et OpenID Connect.