Plugins

Plugins serveur et clients

  • attributes: filtres Jinja personnalisés pour transformer les données

Plugins serveur

  • datasources: connecteur entre un type de source de données et hermes-server
  • messagebus_producers: connecteur entre hermes-server et un type de bus de messages

Plugins clients

  • hermes-client: implémentation d’hermes-client pour propager des données vers une cible spécifique
  • messagebus_consumers: connecteur entre un type de bus de messages et hermes-client

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

Sous-sections de Plugins

plugins d'attribut

  • crypto_RSA_OAEP : chiffrer/déchiffrer des chaînes avec des clés RSA asymétriques, en utilisant PKCS#1 OAEP, un chiffrement asymétrique basé sur RSA et le remplissage OAEP

  • ldapPasswordHash: générer des hachages LDAP de formats spécifiés à partir d’une chaîne contenant un mot de passe en clair

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

Sous-sections de plugins d'attribut

crypto_RSA_OAEP

Description

Ce plugin permet de chiffrer/déchiffrer des chaînes avec des clés RSA asymétriques, en utilisant PKCS#1 OAEP, un chiffrement asymétrique basé sur RSA et le remplissage OAEP.

Configuration

Vous pouvez configurer autant de clés que vous le souhaitez dans les paramètres du plugin. Une clé peut être utilisée pour chiffrer ou déchiffrer, mais pas les deux. Le plugin déterminera s’il s’agit d’une opération de chiffrement ou de déchiffrement en fonction du type de clé : déchiffrement pour les clés privées et chiffrement pour les clés publiques.

hermes:
  plugins:
    attributes:
      crypto_RSA_OAEP:
        settings:
          keys:
            # Nom de la clé, vous pouvez définir ce que vous voulez
            encrypt_to_messagebus:
              # Type de hachage, lors du déchiffrement, vous devez évidemment
              # utiliser la même valeur qui a été utilisée pour le chiffrement
              hash: SHA3_512
              # Clé publique RSA utilisée pour chiffrer
              # ATTENTION - CETTE CLÉ EST FAIBLE ET PUBLIQUE, NE L'UTILISEZ JAMAIS
              rsa_key: |-
                  -----BEGIN PUBLIC KEY-----
                  MCgCIQCy2W1bAPOa1JIeLuV8qq1Qg7h0jxpf8QCik11H9xZcfwIDAQAB
                  -----END PUBLIC KEY-----                  

            # Une autre clé
            decrypt_from_messagebus:
              hash: SHA3_512
              # Clé privée RSA utilisée pour déchiffrer
              # ATTENTION - CETTE CLÉ EST FAIBLE ET PUBLIQUE, NE L'UTILISEZ JAMAIS
              rsa_key: |-
                  -----BEGIN RSA PRIVATE KEY-----
                  MIGrAgEAAiEAstltWwDzmtSSHi7lfKqtUIO4dI8aX/EAopNdR/cWXH8CAwEAAQIh
                  AKfflFjGNOJQwvJX3Io+/juxO+HFd7SRC++zBD9paZqZAhEA5OtjZQUapRrV/aC5
                  NXFsswIRAMgBtgpz+t0FxyEXdzlcTwUCEHU6WZ8M2xU7xePpH49Ps2MCEQC+78s+
                  /WvfNtXcRI+gJfyVAhAjcIWzHC5q4wzgL7psbPGy
                  -----END RSA PRIVATE KEY-----                  

Les valeurs valides pour hash sont :

  • SHA224
  • SHA256
  • SHA384
  • SHA512
  • SHA3_224
  • SHA3_256
  • SHA3_384
  • SHA3_512

Utilisation

crypto_RSA_OAEP(value: bytes | str, keyname: str)  str

Une fois que tout est configuré, vous pouvez chiffrer les données avec la clé encrypt_to_messagebus comme ceci dans un filtre Jinja :

password_encrypted: "{{ PASSWORD_CLEAR | crypto_RSA_OAEP('encrypt_to_messagebus') }}"
password_decrypted: "{{ PASSWORD_ENCRYPTED | crypto_RSA_OAEP('decrypt_from_messagebus') }}"

Vous pouvez même déchiffrer et rechiffrer immédiatement les données avec une autre clé comme ceci :

password_reencrypted: "{{ PASSWORD_ENCRYPTED | crypto_RSA_OAEP('decrypt_from_datasource') | crypto_RSA_OAEP('encrypt_to_messagebus') }}"

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

ldapPasswordHash

Description

Ce plugin permet de générer des hachages LDAP aux formats spécifiés, depuis une chaîne contenant un mot de passe en clair.

Configuration

Vous pouvez configurer une liste facultative de types de hachage par défaut dans les paramètres du plug-in. Cette liste sera utilisée si les types de hachage ne sont pas spécifiés dans les arguments du filtre, sinon les types de hachage spécifiés seront utilisés.

hermes:
  plugins:
    attributes:
      ldapPasswordHash:
        settings:
          default_hash_types:
            - SMD5
            - SSHA
            - SSHA256
            - SSHA512

Les valeurs valides pour default_hash_types sont :

  • MD5
  • SHA
  • SMD5
  • SSHA
  • SSHA256
  • SSHA512

Utilisation

ldapPasswordHash(password: str, hashtypes: None | str | list[str] = None)  list[str]

Une fois que tout est configuré, vous pouvez générer votre liste de hachages comme ceci dans un filtre Jinja :

# Contiendra une liste de hachages de PASSWORD_CLEAR selon les paramètres
# de default_hash_types : SMD5, SSHA, SSHA256, SSHA512
ldap_password_hashes: "{{ PASSWORD_CLEAR | ldapPasswordHash }}"

# Contiendra une liste contenant uniquement le hachage SSHA512 de PASSWORD_CLEAR
ldap_password_hashes: "{{ PASSWORD_CLEAR | ldapPasswordHash('SSHA512') }}"

# Contiendra une liste contenant uniquement les hachages SSHA256
# et SSHA512 de PASSWORD_CLEAR
ldap_password_hashes: "{{ PASSWORD_CLEAR | ldapPasswordHash(['SSHA256', 'SSHA512']) }}"

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

plugins de source de données

  • ldap: utiliser un serveur LDAP comme source de données

  • oracle: utiliser une base de données Oracle comme source de données

  • postgresql: utiliser une base de données PostgreSQL comme source de données

  • sqlite: utiliser une base de données SQLite comme source de données

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

Sous-sections de plugins de source de données

ldap

Description

Ce plugin permet d’utiliser un serveur LDAP comme source de données.

Configuration

Les paramètres de connexion sont requis dans la configuration du plugin.

hermes:
  plugins:
    datasources:
      # Nom de la source. Utilisez ce que vous voulez. Sera utilisé dans le modèle de données
      your_source_name:
        type: ldap
        settings:
          # OBLIGATOIRE : URI du serveur LDAP
          uri: ldaps://ldap.example.com:636
          # OBLIGATOIRE : identifiants de connexion au serveur LDAP
          binddn: cn=account,dc=example,dc=com
          bindpassword: s3cReT_p4s5w0rD
          # OBLIGATOIRE : DN de base LDAP
          basedn: dc=example,dc=com

          ssl: # Facultatif
            # Chemin vers le fichier PEM avec les certificats CA
            cafile: /path/to/INTERNAL-CA-chain.crt # Facultatif
            # Chemin vers le fichier de certificat au format PEM pour l'authentification du certificat client, nécessite de définir keyfile
            certfile: /path/to/client.crt # Facultatif
            # Chemin vers le fichier de clé privée du certificat au format PEM pour l'authentification du certificat client, nécessite de définir certfile
            keyfile: /path/to/client.pem # Facultatif

          # Facultatif. Par défaut : false.
          # Comme le client n'a pas connaissance du schéma LDAP, il ne peut pas savoir si
          # un attribut est à valeur unique ou à valeurs multiples. Par défaut, il
          # s'adapte à la valeur qui lui est renvoyée : si elle est unique, il la renverra
          # dans son type de base, et s'il y en a plusieurs, il la renverra sous forme de liste.
          # Si ce paramètre est activé, toutes les valeurs seront toujours renvoyées dans une liste.
          always_return_values_in_list: true

Utilisation

L’utilisation diffère selon le type d’opération spécifié

fetch

Récupérer les entrées depuis le serveur LDAP.

hermes-server:
  datamodel:
    oneDataType:
      sources:
        your_source_name: # 'your_source_name' a été défini dans les paramètres du plugin
          fetch:
            type: fetch
            vars:
              # Facultatif : le basedn à utiliser pour l'opération 'fetch'.
              # Si ce paramètre n'est pas défini, le paramètre basedn de la
              # configuration sera utilisé
              base: "ou=exampleOU,dc=example,dc=com"
              # Facultatif : la portée de l'opération 'fetch'
              # Les valeurs valides sont :
              # - base : pour rechercher l'objet "de base" lui-même
              # - one, onelevel : pour rechercher les enfants immédiats de l'objet "de base"
              # - sub, subtree : pour rechercher l'objet "de base" et tous ses descendants
              # Si non défini, "subtree" sera utilisé
              scope: subtree
              # Facultatif : le filtre LDAP à utiliser pour l'opération 'fetch'
              # Si non défini, "(objectClass=*)" sera utilisé
              filter: "(objectClass=*)"
              # Facultatif : les attributs à récupérer, sous forme de liste de chaînes
              # Si non défini, tous les attributs de chaque entrée sont renvoyés
              attrlist: "{{ REMOTE_ATTRIBUTES }}"

add

Ajouter des entrées au serveur LDAP.

hermes-server:
  datamodel:
    oneDataType:
      sources:
        your_source_name: # 'your_source_name' a été défini dans les paramètres du plugin
          fetch:
            type: add
            vars:
              # Facultatif : une liste d'entrées à ajouter.
              # Si elle n'est pas définie, une liste vide sera utilisée (et rien ne sera ajouté)
              addlist:
                  # OBLIGATOIRE : le DN de l'entrée. S'il n'est pas spécifié, l'entrée
                  # sera silencieusement ignorée
                - dn: uid=newentry1,ou=exampleOU,dc=example,dc=com
                  # Facultatif : les attributs à ajouter à l'entrée
                  add:
                    # Créer l'attribut s'il n'existe pas et lui ajouter la valeur "value"
                    "attrnameToAdd": "value",
                    # Créer l'attribut s'il n'existe pas et lui ajouter les valeurs
                    # "value1" et "value2"
                    "attrnameToAddList": ["value1", "value2"],
                - dn: uid=newentry2,ou=exampleOU,dc=example,dc=com
                  # ...

delete

Supprimer des entrées du serveur LDAP.

hermes-server:
  datamodel:
    oneDataType:
      sources:
        your_source_name: # 'your_source_name' a été défini dans les paramètres du plugin
          fetch:
            type: delete
            vars:
              # Facultatif : une liste d'entrées à supprimer.
              # Si elle n'est pas définie, une liste vide sera utilisée (et rien ne sera supprimé)
              dellist:
                  # OBLIGATOIRE : le DN de l'entrée. S'il n'est pas spécifié, l'entrée
                  # sera silencieusement ignorée
                - dn: uid=entryToDelete1,ou=exampleOU,dc=example,dc=com
                - dn: uid=entryToDelete2,ou=exampleOU,dc=example,dc=com
                  # ...

modify

Modifier des entrées sur le serveur LDAP.

hermes-server:
  datamodel:
    oneDataType:
      sources:
        your_source_name: # 'your_source_name' a été défini dans les paramètres du plugin
          fetch:
            type: modify
            vars:
              # Facultatif : une liste d'entrées à modifier.
              # Si elle n'est pas définie, une liste vide sera utilisée (et rien ne sera modifié)
              modlist:
                  # OBLIGATOIRE : le DN de l'entrée. S'il n'est pas spécifié, l'entrée
                  # sera silencieusement ignorée
                - dn: uid=entryToModify1,ou=exampleOU,dc=example,dc=com

                  # Facultatif : les attributs à ajouter à l'entrée
                  add:
                    # Créer l'attribut s'il n'existe pas et lui ajouter la valeur "value"
                    attrnameToAdd: value
                    # Créer l'attribut s'il n'existe pas et lui ajouter les valeurs
                    # "value1" et "value2"
                    attrnameToAddList: [value1, value2]

                  # Facultatif : les attributs de l'entrée à modifier
                  modify:
                    # Créer l'attribut s'il n'existe pas et remplacer toutes ses valeurs
                    # par la valeur "value"
                    attrnameToModify: newvalue
                    # Créer l'attribut s'il n'existe pas et remplacer toutes ses valeurs
                    # par les valeurs "newvalue1" and "newvalue2"
                    attrnameToModifyList: [newvalue1, newvalue2]

                  # Facultatif: les attributs de l'entrée à supprimer
                  delete:
                    # Supprimer l'attribut spécifié et toutes ses valeurs
                    attrnameToDelete: null
                    # Supprimer la valeur "value" de l'attribut spécifié.
                    # Génère une erreur si la valeur est manquante
                    attrnameToDeleteValue: value
                    # Supprimer les valeurs "value1" et "value2" de l'attribut spécifié.
                    # Génère une erreur si une des valeurs est manquante
                    attrnameToDeleteValueList: [value1, value2]

                - dn: uid=entryToModify2,ou=exampleOU,dc=example,dc=com
                  # ...

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

oracle

Description

Ce plugin permet d’utiliser une base de données Oracle comme source de données.

Configuration

Les paramètres de connexion sont requis dans la configuration du plugin.

hermes:
  plugins:
    datasources:
      # Nom de la source. Utilisez ce que vous voulez. Sera utilisé dans le modèle de données
      your_source_name:
        type: oracle
        settings:
          # OBLIGATOIRE : le nom DNS ou l'adresse IP du serveur de base de données
          server: dummy.example.com
          # OBLIGATOIRE : le port de connexion à la base de données
          port: 1234
          # OBLIGATOIRE : le "service name" de la base de données. Ne peut pas être défini si 'sid' est défini
          service_name: DUMMY.example.com
          # OBLIGATOIRE : le "sid" de la base de données. Ne peut pas être défini si 'service_name' est défini
          sid: DUMMY
          # OBLIGATOIRE : les identifiants de connexion à la base de données
          login: HERMES_DUMMY
          password: "DuMmY_p4s5w0rD"

Utilisation

Spécifiez une requête. Si vous souhaitez utiliser des valeurs provenant du cache, il est possible de les indiquer dans un dictionnaire vars, et y faire référence en spécifiant le nom de variable (clé) préfixé par un double-points : dans la requête : cela nettoiera automatiquement les données dans la requête pour limiter les risques d’injection SQL.

Les noms d’exemple dans vars sont préfixés par sanitized_ pour donner plus de clarté, mais cela n’a rien d’obligatoire.

hermes-server:
  datamodel:
    oneDataType:
      sources:
        your_source_name: # 'your_source_name' a été défini dans les paramètres du plugin
          fetch:
            type: fetch
            query: >-
              SELECT {{ REMOTE_ATTRIBUTES | join(', ') }}
              FROM AN_ORACLE_TABLE              

          commit_one:
            type: modify
            query: >-
              UPDATE AN_ORACLE_TABLE
              SET
                valueToSet = :sanitized_valueToSet
              WHERE pkey = :sanitized_pkey              

            vars:
              sanitized_pkey: "{{ ITEM_FETCHED_VALUES.pkey }}"
              sanitized_valueToSet: "{{ ITEM_FETCHED_VALUES.valueToSet }}"

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

postgresql

Description

Ce plugin permet d’utiliser une base de données PostgreSQL comme source de données.

Configuration

Les paramètres de connexion sont requis dans la configuration du plugin.

hermes:
  plugins:
    datasources:
      # Nom de la source. Utilisez ce que vous voulez. Sera utilisé dans le modèle de données
      your_source_name:
        type: postgresql
        settings:
          # OBLIGATOIRE : le nom DNS ou l'adresse IP du serveur de base de données
          server: dummy.example.com
          # OBLIGATOIRE : le port de connexion à la base de données
          port: 1234
          # MANDATORY: le nom de la base de données
          dbname: DUMMY
          # OBLIGATOIRE : les identifiants de connexion à la base de données
          login: HERMES_DUMMY
          password: "DuMmY_p4s5w0rD"

Utilisation

Spécifiez une requête. Si vous souhaitez utiliser des valeurs provenant du cache, il est possible de les indiquer dans un dictionnaire vars, et y faire référence en spécifiant le nom de variable (clé) entouré par %()s dans la requête : cela nettoiera automatiquement les données dans la requête pour limiter les risques d’injection SQL. Voir l’exemple ci-dessous.

Les noms d’exemple dans vars sont préfixés par sanitized_ pour donner plus de clarté, mais cela n’a rien d’obligatoire.

hermes-server:
  datamodel:
    oneDataType:
      sources:
        your_source_name: # 'your_source_name' a été défini dans les paramètres du plugin
          fetch:
            type: fetch
            query: >-
              SELECT {{ REMOTE_ATTRIBUTES | join(', ') }}
              FROM A_POSTGRESQL_TABLE              

          commit_one:
            type: modify
            query: >-
              UPDATE A_POSTGRESQL_TABLE
              SET
                valueToSet = %(sanitized_valueToSet)s
              WHERE pkey = %(sanitized_pkey)s              

            vars:
              sanitized_pkey: "{{ ITEM_FETCHED_VALUES.pkey }}"
              sanitized_valueToSet: "{{ ITEM_FETCHED_VALUES.valueToSet }}"

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

sqlite

Description

Ce plugin permet d’utiliser une base de données SQLite comme source de données.

Configuration

Les paramètres de connexion sont requis dans la configuration du plugin.

hermes:
  plugins:
    datasources:
      # Nom de la source. Utilisez ce que vous voulez. Sera utilisé dans le modèle de données
      your_source_name:
        type: sqlite
        settings:
          # OBLIGATOIRE : le chemin vers le fichier de base de données
          uri: /path/to/sqlite.db

Utilisation

Spécifiez une requête. Si vous souhaitez utiliser des valeurs provenant du cache, il est possible de les indiquer dans un dictionnaire vars, et y faire référence en spécifiant le nom de variable (clé) préfixé par un double-points : dans la requête : cela nettoiera automatiquement les données dans la requête pour limiter les risques d’injection SQL.

Les noms d’exemple dans vars sont préfixés par sanitized_ pour donner plus de clarté, mais cela n’a rien d’obligatoire.

hermes-server:
  datamodel:
    oneDataType:
      sources:
        your_source_name: # 'your_source_name' a été défini dans les paramètres du plugin
          fetch:
            type: fetch
            query: >-
              SELECT {{ REMOTE_ATTRIBUTES | join(', ') }}
              FROM AN_SQLITE_TABLE              

          commit_one:
            type: modify
            query: >-
              UPDATE AN_SQLITE_TABLE
              SET
                valueToSet = :sanitized_valueToSet
              WHERE pkey = :sanitized_pkey              

            vars:
              sanitized_pkey: "{{ ITEM_FETCHED_VALUES.pkey }}"
              sanitized_valueToSet: "{{ ITEM_FETCHED_VALUES.valueToSet }}"

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

plugins producteur de bus de messages

  • kafka: Envoyer les événements produits vers un serveur Apache Kafka

  • sqlite: Envoyer les événements produits vers une base de données SQLite

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

Sous-sections de plugins producteur de bus de messages

kafka

Description

Ce plugin permet à hermes-server d’envoyer les événements produits vers un serveur Apache Kafka.

Configuration

Il est possible de se connecter au serveur Kafka sans authentification, ou avec une authentification SSL (TLS).

hermes:
  plugins:
    messagebus:
      kafka:
        settings:
          # OBLIGATOIRE : la liste des serveurs Kafka pouvant être utilisés
          servers:
            - dummy.example.com:9093

          # Facultatif : quelle version de l'API Kafka utiliser. Si elle n'est
          # pas définie, la version de l'API sera détectée au démarrage et
          # indiquée dans les fichiers log.
          # Ne définissez pas cette directive à moins que vous ne rencontriez
          # des erreurs "kafka.errors.NoBrokersAvailable : NoBrokersAvailable"
          # générées par un appel "self.check_version()".
          api_version: [2, 6, 0]

          # Facultatif : limite stricte de la taille d'un message envoyé à Kafka.
          # Vous devez définir une valeur plus élevée si vos messages Kafka sont
          # susceptibles de dépasser la valeur par défaut de 1 Mo ou si vous
          # rencontrez l'erreur
          #   "MessageSizeTooLargeError: The message is xxx bytes when
          #    serialized which is larger than the maximum request size you
          #    have configured with the max_request_size configuration".
          # Par défaut : 1048576.
          max_request_size: 1048576

          # Facultatif : active l'authentification SSL. Si active, les 3 options
          # ci-dessous doivent être définies
          ssl:
            # OBLIGATOIRE : fichier de certificat hermes-server qui sera
            # utilisé pour l'authentification
            certfile: /path/to/.hermes/dummy.crt
            # OBLIGATOIRE : Chemin vers le fichier de clé privée du certificat
            # hermes-server
            keyfile: /path/to/.hermes/dummy.pem
            # OBLIGATOIRE : le certificat CA de la PKI
            cafile: /path/to/.hermes/INTERNAL-CA-chain.crt

          # OBLIGATOIRE : le sujet sur lequel publier les événements
          topic: hermes

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

sqlite

Description

Ce plugin permet à hermes-server d’envoyer les événements produits vers une base de données SQLite.

Configuration

Pour imiter le comportement d’autres bus de messages qui suppriment les messages une fois certaines conditions remplies, retention_in_days peut être définie. Les messages plus anciens que le nombre de jours spécifié seront automatiquement supprimés.

hermes:
  plugins:
    messagebus:
      sqlite:
        settings:
          # OBLIGATOIRE :
          uri: /path/to/.hermes/bus.sqlite
          retention_in_days: 1

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

plugins hermes-client

Les plugins clients sont regroupés par catégories servant le même objectif sur différents types de cibles. Il n’existe actuellement qu’une seule catégorie de plugins :

  • usersgroups : gérer les utilisateurs, les groupes, les mots de passe des utilisateurs et l’appartenance des utilisateurs aux groupes

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

Sous-sections de plugins hermes-client

usergroups

Gère les utilisateurs, les groupes, les mots de passe des utilisateurs et l’appartenance des utilisateurs aux groupes.

Les clients disponibles sont :

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

Sous-sections de usergroups

adpypsrp

Description

Ce client traite les événements de type Users, Groups et UserPasswords, et stocke les données dans un Active Directory via des commandes Powershell sur pypsrp.

La liste des paramètres standardAttributes contient les paramètres des cmdlet utilisées pour les utilisateurs (New-ADUser / Set-ADUser) et les groupes (New-ADGroup / Set-ADGroup). La liste de paramètres otherAttributes peut contenir des noms d’attributs LDAP (ldapDisplayName) disponibles pour gérer ceux qui ne sont pas représentés par les paramètres de cmdlet pour les utilisateurs et les groupes.

Les clés du modèle de données local DOIVENT exister dans standardAttributes ou otherAttributes, et seront utilisées comme paramètres de cmdlet avec leurs valeurs associées, permettant de gérer tous les attributs AD.

GroupsMembers associera uniquement un User à un Group. SubGroupsMembers associera uniquement un Group à un Group, permettant ainsi de gérer les groupes imbriqués.

Pour éviter les problèmes de sécurité et les cas particuliers avec la corbeille, un mot de passe aléatoire complexe est défini lors de la création de l’utilisateur. Ce mot de passe inconnu sera écrasé par le prochain événement UserPassword de User. Cela évite d’avoir un compte activé sans mot de passe.

La corbeille ne fait que désactiver le compte.

Configuration

hermes-client-usersgroups_adpypsrp:
  WinRM:  # Pour plus de détails sur les options, vous pouvez consulter https://pypi.org/project/pypsrp/ - "Connection"
    # OBLIGATOIRE : URI et port du serveur AD
    host: radon1.in.insa-strasbourg.fr
    port: 5986
    # OBLIGATOIRE : identifiants de connexion au serveur AD
    login: administrator
    password: "s3cReT_p4s5w0rD"
    # Par défaut : true
    ssl: true
    # Par défaut : true
    ssl_cert_validation: false
    # Par défaut : true
    credssp_disable_tlsv1_2: true
    # Par défaut : "auto". Les valeurs valides sont [auto, always, never]
    encryption: always
    # Par défaut : "wsman"
    path: "wsman"
    # Par défaut : "negotiate". Les valeurs valides sont [basic, certificate, negotiate, ntlm, kerberos, credssp]
    auth: kerberos
    # Par défaut : "WSMAN". Permet de définir la partie service du SPN calculé, utilisée lors de l'authentification au serveur.
    # Ceci n'est valide que si l'authentification négociée est Kerberos, ou si Kerberos a été explicitement choisi.
    # Si vous obtenez l'erreur "Server not found in Kerberos database", vous pouvez essayer de définir "HTTP" ici.
    negotiate_service: WSMAN

  AD_domain:
    # OBLIGATOIRE : nom de domaine AD et DN
    name: in.insa-strasbourg.fr
    dn: DC=in,DC=insa-strasbourg,DC=fr
    # OBLIGATOIRE : OUs où les utilisateurs et les groupes seront stockés
    users_ou: OU=INSA,OU=People,DC=in,DC=insa-strasbourg,DC=fr
    groups_ou: OU=INSA,OU=Groups,DC=in,DC=insa-strasbourg,DC=fr

  # Facultatif, permet de forcer l'ajout de chaque utilisateur à la liste de groupes spécifiée
  # L'ajout de l'appartenance au groupe se fait uniquement à la création de l'utilisateur : tout
  # changement de valeur de ce paramètre n'impactera que les utilisateurs qui seront créés ultérieurement
  Users_mandatory_groups:
    - MandatoryGroup1
    - MandatoryGroup2

  # Définit les paramètres de cmdlet qui peuvent être définis et le type valide de la valeur qui leur est associée
  # Vous devriez vraiment le définir tel quel.
  standardAttributes:
    Users:
      AccountExpirationDate: "<DateTime>"
      AccountNotDelegated: "<Boolean>"
      AllowReversiblePasswordEncryption: "<Boolean>"
      AuthenticationPolicy: "<ADAuthenticationPolicy>"
      AuthenticationPolicySilo: "<ADAuthenticationPolicySilo>"
      AuthType: "<ADAuthType>"
      CannotChangePassword: "<Boolean>"
      ChangePasswordAtLogon: "<Boolean>"
      City: "<String>"
      Company: "<String>"
      CompoundIdentitySupported: "<Boolean>"
      Country: "<String>"
      # Credential: "<PSCredential>" # Inutile : spécifie les identifiants de connexion du compte utilisateur à utiliser pour effectuer cette tâche
      Department: "<String>"
      Description: "<String>"
      DisplayName: "<String>"
      Division: "<String>"
      EmailAddress: "<String>"
      EmployeeID: "<String>"
      EmployeeNumber: "<String>"
      Enabled: "<Boolean>"
      Fax: "<String>"
      GivenName: "<String>"
      HomeDirectory: "<String>"
      HomeDrive: "<String>"
      HomePage: "<String>"
      HomePhone: "<String>"
      KerberosEncryptionType: "<ADKerberosEncryptionType>"
      LogonWorkstations: "<String>"
      Manager: "<ADUser>"
      MobilePhone: "<String>"
      Office: "<String>"
      OfficePhone: "<String>"
      Organization: "<String>"
      OtherName: "<String>"
      PasswordNeverExpires: "<Boolean>"
      PasswordNotRequired: "<Boolean>"
      POBox: "<String>"
      PostalCode: "<String>"
      # PrincipalsAllowedToDelegateToAccount: "<ADPrincipal[]>" # Ne sera pas défini
      ProfilePath: "<String>"
      SamAccountName: "<String>"
      ScriptPath: "<String>"
      # Server: "<String>" # Inutile : spécifie l'instance de service de domaine Active Directory à laquelle se connecter
      SmartcardLogonRequired: "<Boolean>"
      State: "<String>"
      StreetAddress: "<String>"
      Surname: "<String>"
      Title: "<String>"
      # TrustedForDelegation: "<Boolean>" # Ne sera pas défini
      UserPrincipalName: "<String>"

    Groups:
      AuthType: "<ADAuthType>"
      # Credential: "<PSCredential>" # Inutile : spécifie les identifiants de connexion du compte utilisateur à utiliser pour effectuer cette tâche
      Description: "<String>"
      DisplayName: "<String>"
      GroupCategory: "<ADGroupCategory>"
      GroupScope: "<ADGroupScope>"
      HomePage: "<String>"
      ManagedBy: "<ADPrincipal>"
      SamAccountName: "<String>"
      # Server: "<String>" # Inutile : spécifie l'instance de service de domaine Active Directory à laquelle se connecter

  # Définit les attributs LDAP (ldapDisplayName) à gérer, qui ne sont pas gérés par les attributs standard.
  # Vous pouvez définir les valeurs souhaitées. Les valeurs ci-dessous sont données à titre d'exemple.
  otherAttributes:
    Users:
      otherMobile: "<String[]>"
      otherTelephone: "<String[]>"
      url: "<String[]>"

  # Paramètres de génération de mot de passe aléatoire facultatifs. Par défaut : les valeurs spécifiées ci-dessous
  # Un mot de passe aléatoire est généré pour initialiser un utilisateur dont le mot de passe n'est pas encore disponible
  random_passwords:
    # Longueur du mot de passe
    length: 32
    # Si true, le mot de passe généré peut contenir des lettres majuscules
    with_upper_letters: true
    # Le mot de passe généré contiendra au moins ce nombre de lettres majuscules
    minimum_number_of_upper_letters: 1
    # Si true, le mot de passe généré peut contenir des lettres minuscules
    with_lower_letters: true
    # Le mot de passe généré contiendra au moins ce nombre de lettres minuscules
    minimum_number_of_lower_letters: 1
    # Si true, le mot de passe généré peut contenir des chiffres
    with_numbers: true
    # Le mot de passe généré contiendra au moins ce nombre de chiffres
    minimum_number_of_numbers: 1
    # Si true, le mot de passe généré peut contenir des caractères spéciaux
    with_special_chars: true
    # Le mot de passe généré contiendra au moins ce nombre de caractères spéciaux
    minimum_number_of_special_chars: 1
    # Si true, le mot de passe généré ne contiendra pas les caractères spécifiés dans 'ambigous_chars_dictionary'
    avoid_ambigous_chars: false
    # Le dictionnaire des caractères ambigus (sensibles à la casse) qui peuvent être interdits dans le mot de passe, même si certains sont présents dans d'autres dictionnaires
    ambigous_chars_dictionary: "lIO01"
    # Le dictionnaire des lettres (insensibles à la casse) autorisées dans le mot de passe
    letters_dictionary: "abcdefghijklmnopqrstuvwxyz"
    # Le dictionnaire des caractères spéciaux autorisés dans le mot de passe
    special_chars_dictionary: "!@#$%^&*"

Datamodel

Les types de données suivants peuvent être configurés :

  • Users : nécessite que l’attribut SamAccountName soit défini
  • UserPasswords : nécessite évidemment Users, et que l’attribut user_pkey corresponde aux clés primaires de Users, et nécessite l’attribut password. Tous les autres attributs seront ignorés
  • Groups : nécessite que l’attribut SamAccountName soit défini
  • GroupsMembers : nécessite évidemment Users et Groups, et nécessite que les attributs user_pkey et group_pkey correspondent aux clés primaires de Users et Groups. Tous les autres attributs seront ignorés
  • SubGroupsMembers : nécessite évidemment Groups, et nécessite que les attributs subgroup_pkey et group_pkey correspondent respectivement à la clé primaire du sous-groupe à affecter, et à celle du groupe d’affectation. Tous les autres attributs seront ignorés
  datamodel:
    Users:
      hermesType: your_server_Users_type_name
      attrsmapping:
        user_pkey: user_primary_key_on_server
        SamAccountName: login_on_server
        UserPrincipalName: "{{ login_on_server ~ '@YOU.AD.DOMAIN.TLD' }}"
        # Pas obligatoire, juste présent pour exemple :
        MobilePhone: "{{ (mobile | default([None]))[0] }}" # <String>
        otherMobile: "{{ (mobile | default([]))[1:]  }}" # <String[]>
        # ...

    UserPasswords:
      hermesType: your_server_UserPasswords_type_name
      attrsmapping:
        user_pkey: user_primary_key_on_server
        password: cleartext_password_on_server
        # ...

    Groups:
      hermesType: your_server_Groups_type_name
      attrsmapping:
        group_pkey: group_primary_key_on_server
        SamAccountName: group_name_on_server
        # ...

    GroupsMembers:
      hermesType: your_server_GroupsMembers_type_name
      attrsmapping:
        user_pkey: user_primary_key_on_server
        group_pkey: group_primary_key_on_server
        # ...

    SubGroupsMembers:
      hermesType: your_server_SubGroupsMembers_type_name
      attrsmapping:
        subgroup_pkey: subgroup_primary_key_on_server
        group_pkey: group_primary_key_on_server
        # ...

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

bsspartage

Description

Ce client traite les évènements de type Users, UserPasswords, Groups, GroupsMembers, GroupsSenders et Ressources, et stocke les données dans le tableau de bord de PARTAGE via son API, gérée par libPythonBssApi.

Pour éviter les problèmes de sécurité, si aucun hash n’est disponible à la création de l’utilisateur, un mot de passe aléatoire complexe sera défini. Ce mot de passe inconnu sera modifié lorsqu’un attribut userPassword sera défini sur User ou sur UserPassword. Cela évite d’avoir un compte activé sans mot de passe.

La corbeille ne fait que désactiver le compte.

Configuration

Vous devez configurer un mapping d’authentification authentication contenant tous les domaines gérés par ce client en tant que clés et leur clé API en tant que valeurs.

hermes-client-usersgroups_bsspartage:
  authentication:
    example.com: "Secret_API_key_of_example.com"
    subdomain.example.com: "Secret_API_key_of_subdomain.example.com"
  
  # Lorsqu'un attribut n'a plus de valeur, le comportement par défaut est de conserver sa dernière valeur en place.
  # Ce paramètre permet de remplacer ce comportement pour les attributs spécifiés, avec des valeurs de remplacement.
  # Veuillez noter qu'il est interdit de définir Users.userPassword, car le comportement par défaut est de générer un nouveau mot de passe aléatoire.
  # Il est également interdit de définir des valeurs nulles, car cela revient au comportement par défaut. Dans ce cas, supprimez simplement l'attribut concerné de cette liste.
  #
  # Les valeurs définies ci-dessous sont les valeurs par défaut utilisées si default_removed_values ​​n'est pas défini
  default_removed_values:
    Users:
      co: ""
      company: ""
      description: ""
      displayName: ""
      facsimileTelephoneNumber: ""
      givenName: ""
      homePhone: ""
      initials: ""
      l: ""
      mobile: ""
      name: ""
      pager: ""
      postalCode: ""
      st: ""
      street: ""
      telephoneNumber: ""
      title: ""
      zimbraNotes: ""
      zimbraPrefMailForwardingAddress: ""
      zimbraMailCanonicalAddress: ""
      zimbraPrefFromDisplay: ""
      zimbraMailQuota: 0
    Groups:
      # Ces valeurs devraient être définies comme des chaînes vides, mais un bug dans l'API les ignore.
      # Ce bug a été signalé à l'équipe de PARTAGE.
      description: "-" 
      displayName: "-"
      zimbraNotes: "-"
    Resources:
      co: ""
      description: ""
      l: ""
      postalCode: ""
      st: ""
      street: ""
      zimbraCalResBuilding: ""
      zimbraCalResContactEmail: ""
      zimbraCalResContactName: ""
      zimbraCalResContactPhone: ""
      zimbraCalResFloor: ""
      zimbraCalResLocationDisplayName: ""
      zimbraCalResRoom: ""
      zimbraCalResSite: ""
      zimbraNotes: ""
      zimbraCalResCapacity: "-1"

  # Paramètres de génération de mot de passe aléatoire facultatifs. Par défaut : les valeurs spécifiées ci-dessous
  # Un mot de passe aléatoire est généré pour initialiser un utilisateur dont le mot de passe n'est pas encore disponible
  random_passwords:
    # Longueur du mot de passe
    length: 32
    # Si true, le mot de passe généré peut contenir des lettres majuscules
    with_upper_letters: true
    # Le mot de passe généré contiendra au moins ce nombre de lettres majuscules
    minimum_number_of_upper_letters: 1
    # Si true, le mot de passe généré peut contenir des lettres minuscules
    with_lower_letters: true
    # Le mot de passe généré contiendra au moins ce nombre de lettres minuscules
    minimum_number_of_lower_letters: 1
    # Si true, le mot de passe généré peut contenir des chiffres
    with_numbers: true
    # Le mot de passe généré contiendra au moins ce nombre de chiffres
    minimum_number_of_numbers: 1
    # Si true, le mot de passe généré peut contenir des caractères spéciaux
    with_special_chars: true
    # Le mot de passe généré contiendra au moins ce nombre de caractères spéciaux
    minimum_number_of_special_chars: 1
    # Si true, le mot de passe généré ne contiendra pas les caractères spécifiés dans 'ambigous_chars_dictionary'
    avoid_ambigous_chars: false
    # Le dictionnaire des caractères ambigus (sensibles à la casse) qui peuvent être interdits dans le mot de passe, même si certains sont présents dans d'autres dictionnaires
    ambigous_chars_dictionary: "lIO01"
    # Le dictionnaire des lettres (insensibles à la casse) autorisées dans le mot de passe
    letters_dictionary: "abcdefghijklmnopqrstuvwxyz"
    # Le dictionnaire des caractères spéciaux autorisés dans le mot de passe
    special_chars_dictionary: "!@#$%^&*"

Datamodel

Les types de données suivants peuvent être configurés :

  • Users : pour les comptes utilisateurs. Nécessite la définition des attributs name et sn, un attribut facultatif aliases peut être défini, et les autres sont des attributs tels que définis et utilisés par libPythonBssApi et sont facultatifs. Notez que les attributs zimbraAllowFromAddress, zimbraFeatureContactsEnabled et zimbraMailForwardingAddress ne sont pas pris en charge par libPythonBssApi.
  • UserPasswords : nécessite évidemment Users et que ses clés primaires correspondent aux clés primaires de Users, et nécessite l’attribut userPassword qui doit contenir un hash LDAP valide. Tous les autres attributs seront ignorés. Comme l’attribut userPassword peut également être géré par Users, vous devez choisir : soit vous le gérez par Users, soit par UserPasswords, mais pour des raisons évidentes vous ne devez en aucun cas utiliser les deux en même temps.
  • Groups : pour les groupes et les listes de distribution. Nécessite que les attributs name et zimbraMailStatus soient définis, un attribut facultatif aliases peut être défini, et les autres sont des attributs tels que définis et utilisés par libPythonBssApi et sont facultatifs.
  • GroupsMembers : pour ajouter des utilisateurs en tant que membres du groupe. Nécessite évidemment Users et Groups, et nécessite les attributs user_pkey et group_pkey correspondant aux clés primaires de Users et Groups. Tous les autres attributs seront ignorés.
  • GroupsSenders : pour ajouter des utilisateurs en tant qu’expéditeurs du groupe. Nécessite évidemment Users et Groups, et nécessite les attributs user_pkey et group_pkey correspondant aux clés primaires de Users et Groups. Tous les autres attributs seront ignorés.
  • Resources : pour les ressources. Nécessite que les attributs name, zimbraCalResType et displayName soient définis, et les autres sont des attributs tels que définis et utilisés par libPythonBssApi et sont facultatifs.
Avertissement

Si vous définissez Users.zimbraCOSId, vous devriez éviter de définir des attributs gérés par la COS dans votre modèle de données, car le remplacement de la valeur par défaut de la COS peut entraîner des comportements inattendus.

Avertissement

Étant donné que l’API ne permet pas de renommer des Groups et Resources, cette opération est effectuée en supprimant l’ancienne instance et en recréant la nouvelle dans la foulée. Cependant, cela peut entraîner des pertes de liens et d’informations (par exemple, des calendriers de ressources), et il est probablement préférable d’éviter ces renommages.

Astuce

Pour gérer Users.zimbraCOSId, il est probable que votre source de données fournisse un nom plutôt que le COSId. Il est possible de déclarer une table de correspondance en Jinja directement dans votre configuration :

  datamodel:
    Users:
      hermesType: your_server_Users_type_name
      attrsmapping:
        # ...
        zimbraCOSId: >-
          {{
              {
                'name_of_cos1': '11111111-1111-1111-1111-111111111111',
                'name_of_cos2': '22222222-2222-2222-2222-222222222222',
                'name_of_cos3': '33333333-3333-3333-3333-333333333333',
              }[zimbraCOSName_value_from_server | default('name_of_cos1') | lower]
              | default('11111111-1111-1111-1111-111111111111')
          }}          
        # ...
  datamodel:
    Users:
      hermesType: your_server_Users_type_name
      attrsmapping:
        # Adresse mail principale de l’utilisateur <Adresse mail valide>
        name: name_value_from_server
        # Nom de famille de l'utilisateur <String>
        sn: sn_value_from_server

        # Liste des alias de cet utilisateur <String[]>
        aliases: aliases_value_from_server
        # Numéro EPPN de l’utilisateur <String>
        carLicense: carLicense_value_from_server
        # Nom du pays <String>
        co: co_value_from_server
        # Nom de la société ou de l'établissement <String>
        company: company_value_from_server
        # Description du compte <String>
        description: description_value_from_server
        # Nom affiché dans les emails <String>
        displayName: displayName_value_from_server
        # Fax de l'utilisateur <String>
        facsimileTelephoneNumber: facsimileTelephoneNumber_value_from_server
        # Prénom de l'utilisateur <String>
        givenName: givenName_value_from_server
        # Téléphone domicile de l'utilisateur <String>
        homePhone: homePhone_value_from_server
        # Initiales (M. ou Mme) <String>
        initials: initials_value_from_server
        # Ville de l'utilisateur <String>
        l: l_value_from_server
        # Numéro de mobile de l'utilisateur <String>
        mobile: mobile_value_from_server
        # Numéro raccourci de l'utilisateur <String>
        pager: pager_value_from_server
        # Code postal <String>
        postalCode: postalCode_value_from_server
        # État de l'utilisateur <String>
        st: st_value_from_server
        # Rue de l'utilisateur <String>
        street: street_value_from_server
        # Téléphone de l'utilisateur <String>
        telephoneNumber: telephoneNumber_value_from_server
        # Fonction de l'utilisateur <String>
        title: title_value_from_server
        # Empreinte du mot de passe <String>
        userPassword: userPassword_value_from_server
        # État du compte (défaut active) <String(active, closed, locked)>
        zimbraAccountStatus: zimbraAccountStatus_value_from_server
        # Id de la classe de service <String>
        zimbraCOSId: zimbraCOSId_value_from_server
        # Onglet porte document <String (TRUE, FALSE)>
        zimbraFeatureBriefcasesEnabled: zimbraFeatureBriefcasesEnabled_value_from_server
        # Onglet calendrier <String (TRUE, FALSE)>
        zimbraFeatureCalendarEnabled: zimbraFeatureCalendarEnabled_value_from_server
        # Onglet mail <String (TRUE, FALSE)>
        zimbraFeatureMailEnabled: zimbraFeatureMailEnabled_value_from_server
        # Permettre à l’utilisateur d’indiquer une adresse de redirection <String (TRUE, FALSE)>
        zimbraFeatureMailForwardingEnabled: zimbraFeatureMailForwardingEnabled_value_from_server
        # Onglet préférences <String (TRUE, FALSE)>
        zimbraFeatureOptionsEnabled: zimbraFeatureOptionsEnabled_value_from_server
        # Onglet tâche <String (TRUE, FALSE)>
        zimbraFeatureTasksEnabled: zimbraFeatureTasksEnabled_value_from_server
        # Masquer dans la GAL <String (TRUE, FALSE)>
        zimbraHideInGal: zimbraHideInGal_value_from_server
        # 0=illimité <Integer (octet)>
        zimbraMailQuota: zimbraMailQuota_value_from_server
        # Notes libres <String>
        zimbraNotes: zimbraNotes_value_from_server
        # Doit changer son mot de passe à la prochaine connexion <String (TRUE, FALSE)>
        zimbraPasswordMustChange: zimbraPasswordMustChange_value_from_server
        # Adresse de redirection saisie par l’utilisateur <Adresse mail valide>
        zimbraPrefMailForwardingAddress: zimbraPrefMailForwardingAddress_value_from_server
        # Ne pas conserver de copie des mails sur le client local <String (TRUE, FALSE)>
        zimbraPrefMailLocalDeliveryDisabled: zimbraPrefMailLocalDeliveryDisabled_value_from_server
        # Adresse email visible pour les messages sortants <String>
        zimbraMailCanonicalAddress: zimbraMailCanonicalAddress_value_from_server
        # Nom affiché visible pour les messages sortants <String>
        zimbraPrefFromDisplay: zimbraPrefFromDisplay_value_from_server

    UserPasswords:
      hermesType: your_server_UserPasswords_type_name
      attrsmapping:
        # Empreinte du mot de passe <String>
        userPassword: userPassword_value_from_server

    Groups:
      hermesType: your_server_Groups_type_name
      attrsmapping:
        # Adresse mail principale du groupe <Adresse mail valide>
        name: name_value_from_server
        # Discriminant liste de distribution / groupe <String (enabled, disabled)>
        zimbraMailStatus: zimbraMailStatus_value_from_server
        
        # Liste des alias de ce groupe <String[]>
        aliases: aliases_value_from_server
        # Description du groupe <String>
        description: description_value_from_server
        # Nom affiché <String>
        displayName: displayName_value_from_server
        # Signaler les partages disponibles aux nouveaux membres <String (TRUE, FALSE)>
        zimbraDistributionListSendShareMessageToNewMembers: zimbraDistributionListSendShareMessageToNewMembers_value_from_server
        # Masquer le groupe dans la liste GAL <String (TRUE, FALSE)>
        zimbraHideInGal: zimbraHideInGal_value_from_server
        # Notes libres <String>
        zimbraNotes: zimbraNotes_value_from_server

    GroupsMembers:
      hermesType: your_server_GroupsMembers_type_name
      attrsmapping:
        user_pkey: user_pkey_value_from_server
        group_pkey: group_pkey_value_from_server

    GroupsSenders:
      hermesType: your_server_GroupsSenders_type_name
      attrsmapping:
        user_pkey: user_pkey_value_from_server
        group_pkey: group_pkey_value_from_server
    
    Resources:
      hermesType: your_server_Resources_type_name
      attrsmapping:
        # Adresse mail principale de la ressource <Adresse mail valide>
        name: name_value_from_server
        # Nom affiché <String>
        displayName: displayName_value_from_server
        # Type de la ressource <String (Location, Equipment)>
        zimbraCalResType: zimbraCalResType_value_from_server
        
        # Nom du pays <String>
        co: co_value_from_server
        # Description <String>
        description: description_value_from_server
        # Ville de la ressource <String>
        l: l_value_from_server
        # Code postal <String>
        postalCode: postalCode_value_from_server
        # État de la ressource <String>
        st: st_value_from_server
        # Rue de la ressource <String>
        street: street_value_from_server
        # empreinte du mot de passe <String>
        userPassword: userPassword_value_from_server
        # État de la ressource (défaut active) <String (active, closed)>
        zimbraAccountStatus: zimbraAccountStatus_value_from_server
        # Accepte ou décline automatiquement les invitations <String (TRUE, FALSE)>
        zimbraCalResAutoAcceptDecline: zimbraCalResAutoAcceptDecline_value_from_server
        # Décline automatiquement les invitations si risque de conflit <String (TRUE, FALSE)>
        zimbraCalResAutoDeclineIfBusy: zimbraCalResAutoDeclineIfBusy_value_from_server
        # Décline automatiquement les invitations récurrente <String (TRUE, FALSE)>
        zimbraCalResAutoDeclineRecurring: zimbraCalResAutoDeclineRecurring_value_from_server
        # Bâtiment <String>
        zimbraCalResBuilding: zimbraCalResBuilding_value_from_server
        # Capacité <Integer>
        zimbraCalResCapacity: zimbraCalResCapacity_value_from_server
        # Adresse mail du contact <String>
        zimbraCalResContactEmail: zimbraCalResContactEmail_value_from_server
        # Nom du contact <String>
        zimbraCalResContactName: zimbraCalResContactName_value_from_server
        # Téléphone du contact <String>
        zimbraCalResContactPhone: zimbraCalResContactPhone_value_from_server
        # Etage <String>
        zimbraCalResFloor: zimbraCalResFloor_value_from_server
        # Nom du lieu affiché <String>
        zimbraCalResLocationDisplayName: zimbraCalResLocationDisplayName_value_from_server
        # Salle <String>
        zimbraCalResRoom: zimbraCalResRoom_value_from_server
        # Lieu <String>
        zimbraCalResSite: zimbraCalResSite_value_from_server
        # Notes libres <String>
        zimbraNotes: zimbraNotes_value_from_server
        # Faire suivre les invitations de calendrier à cette adresse <Array>
        zimbraPrefCalendarForwardInvitesTo: zimbraPrefCalendarForwardInvitesTo_value_from_server

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

flatfiles_emails_of_groups

Description

Ce client génére un fichier txt plat par Groups, contenant les adresses e-mail de ses membres (une par ligne).

Configuration

hermes-client-usersgroups_flatfiles_emails_of_groups:
  # OBLIGATOIRE
  destDir: "/path/where/files/are/stored"

  # Facultatif : si défini, générera un fichier uniquement pour les noms de groupe spécifiés dans cette liste
  onlyTheseGroups:
    - group1
    - group2

Datamodel

Les types de données suivants doivent être configurés :

  • Users, nécessite les noms d’attribut suivants :
    • user_pkey : la clé primaire de l’utilisateur
    • mail : l’adresse e-mail de l’utilisateur
  • Groups, nécessite les noms d’attribut suivants :
    • group_pkey : la clé primaire du groupe
    • name : le nom du groupe, qui sera comparé à ceux de onlyTheseGroups, et utilisé pour nommer le fichier de destination “groupName.txt”
  • GroupsMembers, nécessite les noms d’attribut suivants :
    • user_pkey : la clé primaire de l’utilisateur
    • group_pkey : la clé primaire du groupe
  datamodel:
    Users:
      hermesType: your_server_Users_type_name
      attrsmapping:
        user_pkey: user_pkey_on_server
        mail: mail_on_server

    Groups:
      hermesType: your_server_Groups_type_name
      attrsmapping:
        group_pkey: group_pkey_on_server
        name: group_name_on_server

    GroupsMembers:
      hermesType: your_server_GroupsMembers_type_name
      attrsmapping:
        user_pkey: user_pkey_on_server
        group_pkey: group_pkey_on_server

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

kadmin_heimdal

Description

Ce client traite les événements de type Users and UserPassword et stocke les données sur un serveur Kerberos Heimdal.

Configuration

hermes-client-usersgroups_kadmin_heimdal:
  # OBLIGATOIRE : Principal disposant des droits requis pour gérer les utilisateurs et les mots de passe dans kadmin
  kadmin_login: root/admin
  # OBLIGATOIRE : Mot de passe du principal ci-dessus
  kadmin_password: "s3cReT_p4s5w0rD"
  # OBLIGATOIRE : nom du domaine Kerberos
  kadmin_realm: KERBEROS_REALM

  # Nom du principal de service pour lequel obtenir un ticket. Par défaut : kadmin/admin
  kinit_spn: kadmin/admin
  # Commande kinit à utiliser. Par défaut : kinit.heimdal
  kinit_cmd: kinit.heimdal
  # Commande kadmin à utiliser. Par défaut : kadmin.heimdal
  kadmin_cmd: kadmin.heimdal
  # Commande kdestroy à utiliser. Par défaut : kdestroy.heimdal
  kdestroy_cmd: kdestroy.heimdal

  # Paramètre kadmin supplémentaires à utiliser lors de l'ajout d'un utilisateur. Doit être une liste de chaînes. Valeur par défaut :
  #   - "--max-ticket-life=1 day"
  #   - "--max-renewable-life=1 week"
  #   - "--attributes="
  #   - "--expiration-time=never"
  #   - "--policy=default"
  #   - "--pw-expiration-time=never"
  kadmin_user_add_additional_options:
    - "--max-ticket-life=1 day"
    - "--max-renewable-life=1 week"
    - "--attributes="
    - "--expiration-time=never"
    - "--policy=default"
    - "--pw-expiration-time=never"
  
  # Définir à true pour démarrer avec une base de données Kerberos déjà remplie. Valeur par défaut : false
  dont_fail_on_existing_user: false

  # Paramètres de génération de mot de passe aléatoire facultatifs. Par défaut : les valeurs spécifiées ci-dessous
  # Un mot de passe aléatoire est généré pour initialiser un utilisateur dont le mot de passe n'est pas encore disponible
  random_passwords:
    # Longueur du mot de passe
    length: 32
    # Si true, le mot de passe généré peut contenir des lettres majuscules
    with_upper_letters: true
    # Le mot de passe généré contiendra au moins ce nombre de lettres majuscules
    minimum_number_of_upper_letters: 1
    # Si true, le mot de passe généré peut contenir des lettres minuscules
    with_lower_letters: true
    # Le mot de passe généré contiendra au moins ce nombre de lettres minuscules
    minimum_number_of_lower_letters: 1
    # Si true, le mot de passe généré peut contenir des chiffres
    with_numbers: true
    # Le mot de passe généré contiendra au moins ce nombre de chiffres
    minimum_number_of_numbers: 1
    # Si true, le mot de passe généré peut contenir des caractères spéciaux
    with_special_chars: true
    # Le mot de passe généré contiendra au moins ce nombre de caractères spéciaux
    minimum_number_of_special_chars: 1
    # Si true, le mot de passe généré ne contiendra pas les caractères spécifiés dans 'ambigous_chars_dictionary'
    avoid_ambigous_chars: false
    # Le dictionnaire des caractères ambigus (sensibles à la casse) qui peuvent être interdits dans le mot de passe, même si certains sont présents dans d'autres dictionnaires
    ambigous_chars_dictionary: "lIO01"
    # Le dictionnaire des lettres (insensibles à la casse) autorisées dans le mot de passe
    letters_dictionary: "abcdefghijklmnopqrstuvwxyz"
    # Le dictionnaire des caractères spéciaux autorisés dans le mot de passe
    special_chars_dictionary: "!@#$%^&*"

Datamodel

Les types de données suivants doivent être configurés :

  • Users, nécessite les noms d’attribut suivants :
    • login : le login de l’utilisateur qui sera utilisé comme principal
  • UserPasswords, nécessite les noms d’attribut suivants :
    • password : le mot de passe de l’utilisateur

Évidemment, les clés primaires de Users et UserPasswords doivent correspondre pour pouvoir lier le login au mot de passe.

  datamodel:
    Users:
      hermesType: your_server_Users_type_name
      attrsmapping:
        login: login_on_server

    UserPasswords:
      hermesType: your_server_UserPasswords_type_name
      attrsmapping:
        password: password_on_server

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

ldap

Description

Ce client traite les événements de type Users, Groups et UserPasswords, et stocke les données dans un annuaire LDAP.

Les clés du modèle de données local seront utilisées comme noms d’attributs LDAP, sans aucune contrainte, et il est possible de spécifier avec le paramètre attributesToIgnore certaines clés du modèle de données à ignorer (généralement les clés primaires) qui ne seront pas stockées dans l’annuaire LDAP.

GroupMembers stockera uniquement les données (généralement l’attribut LDAP member) dans les entrées LDAP des groupes puisqu’il est possible d’utiliser des overlays LDAP (dynlist ou le désormais obsolète memberOf) pour générer dynamiquement les données correspondantes dans les entrées utilisateur. Vous devriez envisager de lire la documentation du paramètre propagateUserDNChangeOnGroupMember.

Génération de hachages de mots de passe LDAP

Si vous devez générer des hachages de mots de passe LDAP, vous devriez regarder le plugin d’attribut ldapPasswordHash.

Configuration

hermes-client-usersgroups_ldap:
    # OBLIGATOIRE : URI du serveur LDAP
    uri: ldaps://ldap.example.com:636
    # OBLIGATOIRE : identifiants de connexion au serveur LDAP
    binddn: cn=account,dc=example,dc=com
    bindpassword: s3cReT_p4s5w0rD
    # OBLIGATOIRE : DN de base LDAP
    basedn: dc=example,dc=com
    users_ou: ou=users,dc=example,dc=com
    groups_ou: ou=groups,dc=example,dc=com

    ssl: # Facultatif
      # Chemin vers le fichier PEM avec les certificats CA
      cafile: /path/to/INTERNAL-CA-chain.crt # Facultatif
      # Chemin vers le fichier de certificat au format PEM pour l'authentification du certificat client, nécessite de définir keyfile
      certfile: /path/to/client.crt # Facultatif
      # Chemin vers le fichier de clé privée du certificat au format PEM pour l'authentification du certificat client, nécessite de définir certfile
      keyfile: /path/to/client.pem # Facultatif

    # OBLIGATOIRE : nom de l'attribut DN pour les utilisateurs, les mots de passe utilisateur et les groupes
    # Vous devez définir des valeurs pour les trois, même si vous n'utilisez pas certains d'entre eux
    dnAttributes:
      Users: uid
      UserPasswords: uid
      Groups: cn

    # En fonction des paramètres de groupe et d'appartenance au groupe du serveur LDAP,
    # vous pourriez utiliser un autre attribut que l'attribut par défaut 'member' pour
    # stocker le DN du membre du groupe
    # Facultatif. Valeur par défaut : "member"
    groupMemberAttribute: member

    # En fonction des paramètres de groupe et d'appartenance au groupe du serveur LDAP,
    # vous pourriez vouloir propager un changement de DN d'utilisateur vers les
    # attributs d'appartenance au groupe. Mais dans certains cas, c'est géré par un
    # overlay, par exemple avec l'overlay memberOf et son paramètre
    # memberof-refint/olcMemberOfRefint à TRUE
    # Si 'propagateUserDNChangeOnGroupMember' est définie à true, il faudra également
    # définir 'groupsObjectclass'
    # Facultatif. Valeur par défaut : true
    propagateUserDNChangeOnGroupMember: true

    # Si vous avez défini 'propagateUserDNChangeOnGroupMember' à true,
    # vous DEVEZ indiquer l'objectClass sera utilisé pour rechercher
    # vos entrées de groupes
    # Obligatoire uniquement si 'propagateUserDNChangeOnGroupMember' est vrai
    groupsObjectclass: groupOfNames

    # Il est possible de définir une valeur par défaut pour certains attributs pour les Users, UserPasswords et Groups
    # La valeur par défaut sera appliquée lors du traitements des événements added et modified, si l'attribut local n'a pas de valeur
    defaultValues:
      Groups:
        member: "" # Hack pour permettre la création d'un groupe vide, néessaire à cause du "MUST member" dans le schéma

    # Les attributs locaux répertoriés ici ne seront pas stockés dans LDAP pour les types Users, UserPasswords and Groups
    attributesToIgnore:
      Users:
        - user_pkey
      UserPasswords:
        - user_pkey
      Groups:
        - group_pkey

Datamodel

Les types de données suivants peuvent être configurés :

  • Users
  • UserPasswords : nécessite évidemment Users et nécessite l’attribut user_pkey correspondant aux clés primaires de Users
  • Groups
  • GroupsMembers : nécessite évidemment Users et Groups et nécessite les attributs user_pkey et group_pkey correspondant aux clés primaires de Users et Groups
  datamodel:
    Users:
      hermesType: your_server_Users_type_name
      attrsmapping:
        user_pkey:  user_primary_key_on_server
        uid: login_on_server
        # ...

    UserPasswords:
      hermesType: your_server_UserPasswords_type_name
      attrsmapping:
        user_pkey:  user_primary_key_on_server
        userPassword:  ldap_pwd_hash_list_on_server
        # ...

    Groups:
      hermesType: your_server_Groups_type_name
      attrsmapping:
        group_pkey:  group_primary_key_on_server
        cn:  group_name_on_server
        # ...

    GroupsMembers:
      hermesType: your_server_GroupsMembers_type_name
      attrsmapping:
        user_pkey:  user_primary_key_on_server
        group_pkey:  group_primary_key_on_server
        # ...

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

null

Description

Ce client traite les événements de type Users, Groups and UserPasswords, mais ne fait rien d’autre que de générer des logs.

Configuration

Rien à configurer pour le plugin.

hermes-client-usersgroups_null:

Datamodel

Les types de données suivants peuvent être configurés, sans contrainte particulière puisque rien ne sera traité.

  • Users
  • UserPasswords
  • Groups
  • GroupsMembers
  datamodel:
    Users:
      hermesType: your_server_Users_type_name
      attrsmapping:
        attr1_client:  attr1_server
        # ...

    UserPasswords:
      hermesType: your_server_UserPasswords_type_name
      attrsmapping:
        attr1_client:  attr1_server
        # ...

    Groups:
      hermesType: your_server_Groups_type_name
      attrsmapping:
        attr1_client:  attr1_server
        # ...

    GroupsMembers:
      hermesType: your_server_GroupsMembers_type_name
      attrsmapping:
        attr1_client:  attr1_server
        # ...

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

plugins consommateur de bus de messages

  • kafka: Reçoit des événements depuis un serveur Apache Kafka

  • sqlite: Reçoit des événements depuis une base de données SQLite

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

Sous-sections de plugins consommateur de bus de messages

kafka

Description

Ce plugin permet à hermes-client de recevoir des événements depuis un serveur Apache Kafka.

Configuration

Il est possible de se connecter au serveur Kafka sans authentification, ou avec une authentification SSL (TLS).

hermes:
  plugins:
    messagebus:
      kafka:
        settings:
          # OBLIGATOIRE : la liste des serveurs Kafka pouvant être utilisés
          servers:
            - dummy.example.com:9093

          # Facultatif : quelle version de l'API Kafka utiliser. Si elle n'est
          # pas définie, la version de l'API sera détectée au démarrage et
          # indiquée dans les fichiers log.
          # Ne définissez pas cette directive à moins que vous ne rencontriez
          # des erreurs "kafka.errors.NoBrokersAvailable : NoBrokersAvailable"
          # générées par un appel "self.check_version()".
          api_version: [2, 6, 0]

          # Facultatif : active l'authentification SSL. Si active, les 3 options
          # ci-dessous doivent être définies
          ssl:
            # OBLIGATOIRE : fichier de certificat hermes-server qui sera
            # utilisé pour l'authentification
            certfile: /path/to/.hermes/dummy.crt
            # OBLIGATOIRE : Chemin vers le fichier de clé privée du certificat
            # hermes-server
            keyfile: /path/to/.hermes/dummy.pem
            # OBLIGATOIRE : le certificat CA de la PKI
            cafile: /path/to/.hermes/INTERNAL-CA-chain.crt

          # OBLIGATOIRE : le sujet sur lequel retrouver les événements
          topic: hermes
          # OBLIGATOIRE : le group_id auquel rattacher le client. Définissez ce que vous voulez ici.
          group_id: hermes-grp

Boris Lechner 2025-05-05 e022507882f1c7d53ec4dc72b08922261dfdd25f

sqlite

Description

Ce plugin permet à hermes-client de recevoir des événements depuis une base de données SQLite.

Configuration

hermes:
  plugins:
    messagebus:
      sqlite:
        settings:
          # OBLIGATOIRE :
          uri: /path/to/.hermes/bus.sqlite