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.
Table of Contents
🔷 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.