Keycloak - Opérations#
Récupération des secrets#
Compte administrateur#
On récupère le compte administrateur de Keycloak via Vault. Le path change en fonction de type de plateforme (Caascad ou NGOT) :
export VAULT_ADDR='https://vault.infra-stg.caascad.com'
export ZONE_NAME='ocb-example'
vault token lookup || vault login -method oidc
vault read secret/zones/fe/${ZONE_NAME}/keycloak-admin
export VAULT_ADDR='https://vault.infra-prd.caascad.com'
export ZONE_NAME='ocb-example'
vault token lookup || vault login -method oidc
vault read secret/zones/fe/${ZONE_NAME}/keycloak-admin
export VAULT_ADDR='https://vault.infra-stg.caascad.com'
export ZONE_NAME='svc-signon-stg'
vault token lookup || vault login -method oidc
vault read secret/zones/fe/${ZONE_NAME}/keycloak/realms/master/users/admin
export VAULT_ADDR='https://vault.infra-prd.caascad.com'
export ZONE_NAME='svc-signon-prd'
vault token lookup || vault login -method oidc
vault read secret/zones/fe/${ZONE_NAME}/keycloak/realms/master/users/admin
Utilisation de la CLI#
Quelques exemples d'usage de la CLI Keycloak :
kswitch svc-signon-stg
kubectl exec keycloak-0 -n keycloak-svc-signon-stg -it -- bash
# Set Admin secret
# /!\ Beginning space is important to not store secret into history!
HISTCONTROL=ignoreboth
export KC_CLI_PASSWORD='ShutSecret'
# Get all realms details
kcadm.sh get realms --no-config --server http://localhost:8080 --realm 'master' --user admin
# Export all realms users information (into JSON, /tmp is writeable)
kcadm.sh get users --no-config --server http://localhost:8080 --realm 'master' --user admin --target-realm 'svc-signon-stg' --offset 0 --limit 1000000 > /tmp/realm_users.json
# Get all realm users with specific fields
kcadm.sh get users --no-config --server http://localhost:8080 --realm 'master' --user admin --target-realm 'svc-signon-stg' --fields 'username,firstName,lastName' --offset 0 --limit 1000000
# Get users details with an id
kcadm.sh get users/020dc674-ee46-44b0-a47d-4582705c6805 --no-config --server http://localhost:8080 --realm 'master' --user admin --target-realm svc-signon-stg
# Get userids from Identity provider links
kcadm.sh get users/020dc674-ee46-44b0-a47d-4582705c6805 --no-config --server http://localhost:8080 --realm 'master' --user admin --target-realm svc-signon-stg --fields 'federatedIdentities(userId)'
# /!\ Security: Unset secret
unset KC_CLI_PASSWORD
Récréer un OTP supprimé par l'utilisateur#
Note
Si l'utilisateur n'a plus accès à son OTP (Ex : Perte du téléphone), il a la possibilité de le regénérer lui-même.
Dans le cas ou un utilisateur aurait supprimé par mégarde l'OTP de son compte, il devra faire appel à l'équipe support de la Product Factory.
Le support devra effectuer les opérations :
- Se connecter avec le compte administrateur sur l'interface d'administration Keycloak Corp
- Se positionner sur le realm corp
- Dans menu
Users, rechercher l'utilisateur concerné et afficher ses détails - Dans l'onglet
Credentials, vérifier les entrées existantes :- Si il existe une entrée de type
otp, alors demander à l'utilisateur de suivre la procédure de réinitialisation du mot de passe ou OTP - Si il n'existe pas d'entrée de type
otp, alors vous devrez :- Dans l'onglet
Details, ajouter comme Required user actionsConfigure OTP - Demander à l'utilisateur de se connecter sur Keycloak Corp
- Dans l'onglet
- Si il existe une entrée de type
Récupération des métadonnées#
Les métadonnées sont des données publiques et généralement utilisé pour interconnecter Keycloak à une autre source d'authentification.
Metadonnée de l'IDentity Provider#
Keycloak ≥ 19.x#
Note
Cela concerne nos plateformes NGOT.
Il est possible de récupérer les métadonnées de l'IDP via l'interface graphique (Se positionner sur le Realm concerné) :
{REALM_NAME} > Identity providers
Choisir l'IDP SAML concerné, puis :
Settings > General settings > Endpoints : SAML 2.0 Service Provider Metadata
Il aussi possible de construire l'URL de la métadonnée via le schéma :
https://<KEYCLOAK_FQDN>/realms/<REALM_NAME>/broker/<BROKER_ALIAS>/endpoint/descriptor
Keycloak < 19.x#
Note
Cela concerne nos plateformes Caascad.
Il est possible de récupérer les métadonnées de l'IDP via l'interface graphique (Se positionner sur le Realm concerné) :
{REALM_NAME} > Identity providers
Choisir l'IDP SAML concerné, puis :
Settings > Endpoints : SAML 2.0 Service Provider Metadata
Il aussi possible de construire l'URL de la métadonnée via le schéma :
https://<KEYCLOAK_FQDN>/auth/realms/<REALM_NAME>/broker/<BROKER_ALIAS>/endpoint/descriptor
Export / Import de données#
Copier les utilisateurs sur un autre Keycloak#
Note
- Cela concerne nos plateformes Caascad.
- Cette procédure a été testée entre 2 instances de Keycloak de même version.
- L'export et l'import nécessite plusieurs redémarrages du composant, mais normalement sans interruption de service.
Warning
L'absence de certains éléments (Groupes, realmRoles, etc.) peut mettre en échec l'import des données. Il faudra soit les créer avant, soit les supprimer dans le fichier d'import.
Contexte de la procédure :
- On souhaite exporter les utilisateurs du realm client de la zone
<SOURCE>vers le Keycloak de la zone<DESTINATION> - Cet export contiendra aussi les secrets (chiffrés) des utilisateurs.
Mettre les silences sur Karma :
- Alertmanager:
<ZONE_NAME_SOURCE> <ZONE_NAME_DESTINATION> - Namespace:
keycloak - Durée: 1h et plus si affinité
- Comment:
PF-xxxx
Créer une branche locale de travail
git switch -c PF-xxxx
Créer une configuration Keycloak spécifique à l'instance qui contient les utilisateurs à exporter via le fichier envs-ng/contexts/keycloak.cue
envs: ["<ZONE_NAME_SOURCE>"]: configurations: ["keycloak"]: helm: values: {
keycloak: extraStartupArgs: "-Dkeycloak.migration.action=export -Dkeycloak.migration.realmName=<ZONE_NAME_SOURCE>-client -Dkeycloak.migration.usersExportStrategy=SAME_FILE -Dkeycloak.migration.provider=dir -Dkeycloak.migration.dir=/tmp/export"
}
Appliquer la configuration
export ZONE_NAME_SOURCE='ocb-example-source'
export ZONE_NAME_DEST='ocb-example-dest'
nix-shell
cd contexts/caascad
trackbone apply -z "${ZONE_NAME_SOURCE}" -c keycloak
Se connecter sur le cluster source
kswitch "${ZONE_NAME_SOURCE}"
Vérifier la présence de l'export
kubectl exec -n keycloak pods/keycloak-0 -- ls -l /tmp/export/
Copier l'export
kubectl cp -n keycloak keycloak-0:/tmp/export/${ZONE_NAME_SOURCE}-client-users-0.json ~/${ZONE_NAME_SOURCE}-client-users-0.json
Remplacer le Realm source par le Realm de destination
sed -i.bak "/\"realm\"/ s/${ZONE_NAME_SOURCE}-client/${ZONE_NAME_DEST}-client/" ~/${ZONE_NAME_SOURCE}-client-users-0.json
Supprimer les groupes si nécessaire (Il est aussi possible de les laisser, mais il faudra les créer manuellement sur le Keycloak de destination avant l'import)
sed -i '/\"groups\"/ s/\[.*\]/\[ \]/' ~/${ZONE_NAME_SOURCE}-client-users-0.json
Supprimer les realmRoles si nécessaire (Il est aussi possible de les laisser, mais il faudra les créer manuellement sur le Keycloak de destination avant l'import)
sed -i '/\"realmRoles\"/ s/\[.*\]/\[ \]/' ~/${ZONE_NAME_SOURCE}-client-users-0.json
Vérifier les changements
sdiff -s ~/${ZONE_NAME_SOURCE}-client-users-0.json.bak ~/${ZONE_NAME_SOURCE}-client-users-0.json
Se connecter sur le cluster de destination
kswitch "${ZONE_NAME_DEST}"
Créer une config map import_users
kubectl create -n keycloak configmap import-users --from-file="${HOME}/${ZONE_NAME_SOURCE}-client-users-0.json"
Créer une configuration Keycloak spécifique à l'instance dans laquelle on veut importer les utilisateurs via le fichier envs-ng/contexts/keycloak.cue
envs: ["<ZONE_NAME_DESTINATION>"]: configurations: ["keycloak"]: helm: values: {
keycloak: {
extraVolumes: [{
name: "import"
configMap: {
name: 'import-users'
}
}]
extraVolumeMounts: [{
name: "import"
mountPath: "/tmp/import"
}]
extraStartupArgs: "-Dkeycloak.migration.action=import -Dkeycloak.migration.provider=singleFile -Dkeycloak.migration.file=/tmp/import/<ZONE_NAME_SOURCE>-client-users-0.json"
}
}
Importer la configuration
trackbone apply -z "${ZONE_NAME_DEST}" -c keycloak
Valider l'import via l'interface Admin (Lister les utilisateurs par ex).
Danger
L'import des données utilisateur dans un realm a pour effet de le dé-configurer. Il est donc nécessaire de re-jouer la conf de ce realm avec trackbone.
Une fois validé, ne pas oublier de supprimer toutes ces données sensibles :
- La branche locale de travail
- Les fichiers d'export stockés sur son poste
- Les exports / imports sur les pods
git checkout master trackbone apply -z "${ZONE_NAME_DEST}" -z "${ZONE_NAME_SOURCE}" -c keycloak
Et pour finir, il faut retirer les silences sur Karma.
Tests fonctionnels#
Note
Chaque test est à réaliser en navigation privée pour éviter les erreurs liées aux cookies, cache, etc.
Les test fonctionnels de Keycloak diffèrent suivant la zone :
Corp#
Template de test Jira :
Tests fonctionnels *Keycloak Corp* :
* (x) Test OIDC depuis corp : [Nextcloud|https://cal.corp.caascad.com], [Rocket.Chat|https://chat.corp.caascad.com]
* (x) Test OIDC depuis ocb-corp : [Harbor|https://harbor.ocb-corp.caascad.com]
* (x) Test OIDC depuis infra-stg : Applications standards [Grafana|https://grafana-infra.infra-stg.caascad.com]
* (x) Test OIDC depuis infra-stg : Applications internes [Portail de Gestion Clients|https://customers-manager.infra-stg.caascad.com]
* (x) Test OIDC depuis infra-prd : Applications standards [Grafana|https://grafana-infra.infra-prd.caascad.com]
* (x) Test OIDC depuis infra-prd : Applications internes [Portail de Gestion Clients|https://customers-manager.infra-prd.caascad.com]
* (x) Test SAML sur applications standard [GitLab corp|https://git.corp.caascad.com]
* (x) Test SAML sur console d'admin FE [OCB0003065 (Staging)|https://auth.prod-cloud-ocb.orange-business.com/authui/federation/websso?domain_id=945d6387027741129ec5fc0760f1de92&idp=caascad-OCB0003065&protocol=saml], [OCB0003148 (Prod)|https://auth.prod-cloud-ocb.orange-business.com/authui/federation/websso?domain_id=06649df00748433497f9a3b1a9c66701&idp=caascad-OCB0003148&protocol=saml], [OCB0003793 (Customer)|https://auth.prod-cloud-ocb.orange-business.com/authui/federation/websso?domain_id=2930aa8be4014b85af7d1e8225936f69&idp=caascad-OCB0003793&protocol=saml], [OCB0005118 (NGOT Staging)|https://auth.prod-cloud-ocb.orange-business.com/authui/federation/websso?domain_id=bcb42e9b13f944358ed8799a267bbdcb&idp=caascad-OCB0005118&protocol=saml] et [OCB0005119 (Prod)|https://auth.prod-cloud-ocb.orange-business.com/authui/federation/websso?domain_id=85a879f256744f09a0b2c52ad8def84c&idp=caascad-OCB0005119&protocol=saml]
NGOT#
Staging#
Template de test Jira :
Tests fonctionnels *Keycloak NGOT Staging* :
* Applications standards [Grafana|https://grafana.obs-corp-stg.csfpriv.com]
** (x) Test OIDC (Choisir `NGOT Administrators`)
** (x) Test SAML (Choisir `SignOn OBS SA`)
* Applications internes [Portail de Gestion Clients|https://customers-manager.obs-ordertobill-stg.csfpriv.com]
** (x) Test OIDC (Choisir `NGOT Administrators`)
** (x) Test SAML (Choisir `SignOn OBS SA`)
Production#
Template de test Jira :
Tests fonctionnels *Keycloak NGOT Production* :
* Applications standards [Grafana|https://grafana.obs-corp-prd.cloudservicesfactory.com]
** (x) Test OIDC (Choisir `NGOT Administrators`)
** (x) Test SAML (Choisir `SignOn OBS SA`)
* Applications internes [Portail de Gestion Clients|https://customers-manager.obs-ordertobill.cloudservicesfactory.com]
** (x) Test OIDC (Choisir `NGOT Administrators`)
** (x) Test SAML (Choisir `SignOn OBS SA`)