Aller au contenu

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 :

  1. Se connecter avec le compte administrateur sur l'interface d'administration Keycloak Corp
  2. Se positionner sur le realm corp
  3. Dans menu Users, rechercher l'utilisateur concerné et afficher ses détails
  4. 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 :
      1. Dans l'onglet Details, ajouter comme Required user actions Configure OTP
      2. Demander à l'utilisateur de se connecter sur Keycloak Corp

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`)