Mise en service
Cette section contient tout ce dont vous avez besoin pour installer, configurer et exécuter Hermes.
Cette section contient tout ce dont vous avez besoin pour installer, configurer et exécuter Hermes.
Identifiez vos prérequis :
Installez Hermes en suivant la section Installation
Configurez hermes-server en suivant les sections suivantes :
Exécutez hermes-server en suivant la section Exécution et une fois qu’il a effectué avec succès sa première collecte de données, générez une séquence initsync à l’aide de la CLI hermes-server, comme expliqué dans la section Exécution
Configurez un premier client hermes en suivant les sections suivantes :
Exécutez le client hermes approprié en suivant la section Exécution
reset_venv
Télécharger et extraire l’archive de la dernière version d’hermes
(Facultatif) Si vous souhaitez réduire l’empreinte de l’installation, vous pouvez supprimer le répertoire tests
, le fichier tox.ini
et tous les plugins inutiles en supprimant leurs répertoires dans :
plugins/attributes/
plugins/clients/
plugins/datasources/
plugins/messagebus_consumers/
plugins/messagebus_producers/
Si votre installation est destinée à exécuter hermes-server uniquement (sans clients), vous pouvez supprimer les répertoires suivants :
clients
plugins/clients/
plugins/messagebus_consumers
Si votre installation est destinée à exécuter un ou plusieurs hermes-client uniquement (sans serveur), vous pouvez supprimer les répertoires suivants :
server
plugins/datasources
plugins/messagebus_producers
Configurer un venv et installer tous les pré-requis
./reset_venv
cat "requirements.txt" "plugins/"*/*"/requirements.txt" > all_requirements.txt 2>/dev/null
pip3 install -r all_requirements.txt
Une application hermes recherchera son fichier de configuration YAML dans le répertoire de travail courant.
Le fichier de configuration doit être nommé APPNAME-config.yml, e.g. :
hermes-server-config.yml
pour server et server-clihermes-client-usersgroups_null-config.yml
pour client-usersgroups_null et client-usersgroups_null-cliLes paramètres sont séparés en plusieurs sections YAML :
Pour des raisons de sécurité, il peut être souhaitable d’autoriser certains utilisateurs à utiliser la CLI sans leur accorder un accès en lecture au fichier de configuration. Pour ce faire, il suffit simplement de créer un fichier de configuration CLI facultatif nommé APPNAME-cli-config.yml, e.g. :
hermes-server-cli-config.yml
pour server-clihermes-client-usersgroups_null-cli-config.yml
pour client-usersgroups_null-cliCe fichier ne doit contenir que les directives suivantes :
hermes:
cli_socket:
path: /path/to/cli/sockfile.sock
Paramètres partagés par le serveur et tous les clients.
Sous-sections principales :
0
.Section obligatoire pour définir les paramètres du cache.
true
, tous les fichiers cache seront compressés avec gzip.true
Active le socket CLI qui permet la communication entre l’application et sa CLI.
true
true
0
.true
LISTEN_FDS
est définie sur 1
, et échouera dans le cas contraire.false
Section obligatoire pour définir les paramètres des fichiers log.
null
pour désactiver cette fonctionnalité et toujours afficher l’intégralité de la chaîne dans les journaux.null
Section obligatoire pour définir les paramètres de messagerie (e-mail) permettant à Hermes de notifier les erreurs aux administrateurs.
Les e-mails contiendront 3 pièces jointes lorsque cela est possible : previous.txt
, current.txt
et diff.txt
, contenant l’état précédent, l’état actuel et la différence entre les états précédent et actuel.
Nom d'utilisateur <nom@example.com>
true
Section obligatoire pour déclarer quels plugins doivent être chargés, avec leurs paramètres.
Elle est divisée en sous-sections par type de plugin.
Section facultative pour déclarer les plugins d’attributs à charger, ainsi que leurs paramètres.
Elle doit contenir une sous-section nommée avec le nom du plugin contenant elle-même une sous-section facultative settings
avec les paramètres du plugin, à renseigner selon la documentation du plugin.
Exemple avec le plugin ldapPasswordHash
:
hermes:
# (...)
plugins:
attributes:
ldapPasswordHash:
settings:
default_hash_types:
- SMD5
- SSHA
- SSHA256
- SSHA512
# (...)
Section obligatoire pour hermes-server
pour déclarer la ou les sources de données et leurs paramètres. Si elle est définie sur un hermes-client
, elle sera ignorée silencieusement.
Un même plugin de source de données peut être utilisé pour interroger plusieurs sources de données, donc pour chaque source de données souhaitée, vous devez déclarer une sous-section avec le nom souhaité de la source de données (qui sera utilisé dans le modèle de données), contenant deux entrées obligatoires :
type
(string) : le plugin de source de données à utiliser pour cette source de données.settings
(subsection) : les paramètres du plugin de source de données pour cette source de données selon la documentation du plugin.Exemple :
hermes:
# (...)
plugins:
datasources:
my_oracle1_datasource:
type: oracle
settings:
login: HERMES_DUMMY
password: "DuMmY_p4s5w0rD"
port: 1234
server: dummy.example.com
sid: DUMMY
my_oracle2_datasource:
type: oracle
settings:
login: HERMES_DUMMY2
password: "DuMmY2_p4s5w0rD"
port: 1234
server: dummy.example.com
sid: DUMMY2
my_ldap_datasource:
type: ldap
settings:
uri: ldaps://dummy.example.com:636
binddn: cn=binddn,dc=example,dc=com
bindpassword: DuMmY_p4s5w0rD
basedn: dc=example,dc=com
# (...)
Section obligatoire pour déclarer le plugin de bus de messages à charger, ainsi que ses paramètres. Évidemment, vous devez configurer exactement un plugin de bus de messages.
hermes-server
, il recherchera le plugin producteur de bus de messages dans le répertoire plugins/messagebus_producers/
.hermes-client
, il recherchera le plugin consommateur de bus de messages dans le répertoire plugins/messagebus_consumers/
.Elle doit contenir une sous-section nommée avec le nom du plugin contenant une sous-section facultative settings
avec les paramètres du plugin à définir selon la documentation du plugin producteur de bus de messages ou consommateur de bus de messages.
Exemple avec le plugin producteur sqlite
:
hermes:
# (...)
plugins:
messagebus:
sqlite:
settings:
uri: /path/to/hermes/sqlite/message/bus.sqlite
retention_in_days: 30
# (...)
Paramètres du serveur.
Sous-sections principales :
Sous-section obligatoire utilisée pour configurer le modèle de données serveur.
Pour chaque type de données requis, une sous-section avec le nom souhaité du type de données doit être créée et configurée. Le nom du type de données DOIT commencer par un caractère alphanumérique.
Bien évidemment, au moins un type de données doit être configuré.
L’ordre de déclaration des types de données est important pour garantir l’intégrité des données :
Vous devez donc d’abord déclarer les types de données qui ne dépendent d’aucun autre type, puis les types qui ont des dépendances (clés étrangères) à ceux déclarés au dessus.
keep_first_value
: utilise la première valeur rencontrée dans l’ordre de déclaration des sources.use_cached_entry
: ignore les données récupérées et continue à utiliser l’entrée en cache jusqu’à ce que le conflit soit résolu.Description : Permet de déclarer des clés étrangères dans un type de données, que les clients utiliseront pour appliquer leur politique de clés étrangères. Voir Clés étrangères pour plus de détails.
Le paramètre est un dictionnaire avec la clé primaire du type de données actuel comme clé, un dictionnaire avec deux entrées comme valeur, faisant référence au type de données parent from_objtype
et à sa clé primaire from_attr
.
Bien que cela puisse sembler intuitif, la déclaration de clés étrangères ne créera aucune règle de contrainte d’intégrité automatiquement.
Que ce soit pour le type de données courant ou pour le parent, les attributs doivent être des clés primaires de leurs types respectifs.
De plus, la clé primaire du parent ne peut pas être multivaluée (un tuple).
Ces contraintes pourraient éventuellement être assouplies un jour, mais pour l’instant aucun cas d’utilisation pertinent n’en justifie le besoin.
Exemple :
foreignkeys:
group_id:
from_objtype: SRVGroups
from_attr: gid
user_id:
from_objtype: SRVUsers
from_attr: uid
Obligatoire : Non
Type : dict[string, dict[string, string]]
Valeur par défaut : {}
Description : Contraintes d’intégrité entre les types de données, en Jinja.
ATTENTION : cela peut être affreusement lent, vous devriez donc essayer de faire au plus simple et idéalement vous limiter aux clés primaires.
Les variables Jinja disponibles sont :
Exemple :
integrity_constraints:
- "{{ _SELF.pkey_attr in OTHERDataType_pkeys }}"
Obligatoire : Non
Type : string[]
Valeur par défaut : []
Sous-section obligatoire listant les sources de données à utiliser pour récupérer les données du type de données courant.
Pour chaque source de données utilisée, une sous-section portant son nom doit être définie et configurée.
Évidemment, au moins une source de données doit être configurée.
L’ordre de déclaration des sources de données est important pour la fusion des données si hermes-server.datamodel.data-type-name.on_merge_conflict est défini sur keep_first_value
, ou si hermes-server.datamodel.data-type-name.sources.datasource-name.pkey_merge_constraint est utilisé.
Sous-section obligatoire pour configurer la requête utilisée pour récupérer les données.
Selon le plugin de source de données utilisé, query et vars peuvent être facultatifs : configurez-les selon la documentation du plugin de source de données.
fetch
.fetch
: Indique que le plugin doit récupérer des données, sans modifier le jeu de données.add
: Indique que le plugin doit ajouter des données au jeu de données.delete
: Indique que le plugin doit supprimer des données du jeu de données.modify
: Indique que le plugin doit modifier des données dans le jeu de données.Description : La requête à envoyer à la source de données. Peut être un template Jinja.
Les variables Jinja disponibles sont :
attrsmapping
. Peut être utile pour générer des requêtes SQL avec les données requises sans utiliser de wildcards ni saisir manuellement la liste d’attributs.Obligatoire : Non
Type : string
Sous-section facultative contenant certaines variables à transmettre au plugin de source de données.
Le nom de la variable comme clé et sa valeur comme valeur. Chaque valeur peut être un template Jinja.
Les variables Jinja disponibles sont :
attrsmapping
. Peut être utile pour générer des requêtes SQL avec les données requises sans utiliser de wildcards ni saisir manuellement la liste d’attributs.Sous-section facultative permettant de configurer une requête à exécuter à chaque fois qu’une entrée a été traitée sans erreur.
Selon le plugin de source de données utilisé, query et vars peuvent être facultatifs : configurez-les selon la documentation du plugin de source de données.
commit_one et commit_all s’excluent mutuellement : vous pouvez définir aucun ou l’un d’entre eux, mais pas les deux en même temps.
fetch
: Indique que le plugin doit récupérer des données, sans modifier le jeu de données.add
: Indique que le plugin doit ajouter des données au jeu de données.delete
: Indique que le plugin doit supprimer des données du jeu de données.modify
: Indique que le plugin doit modifier des données dans le jeu de données.Description : La requête à envoyer à la source de données. Peut être un template Jinja.
Les variables Jinja disponibles sont :
attrsmapping
. Peut être utile pour générer des requêtes SQL avec les données requises sans utiliser de wildcards ni saisir manuellement la liste d’attributs.Obligatoire : Non
Type : string
Sous-section facultative contenant certaines variables à transmettre au plugin de source de données.
Le nom de la variable comme clé et sa valeur comme valeur. Chaque valeur peut être un template Jinja.
Les variables Jinja disponibles sont :
attrsmapping
. Peut être utile pour générer des requêtes SQL avec les données requises sans utiliser de wildcards ni saisir manuellement la liste d’attributs.Sous-section facultative permettant de configurer une requête à exécuter une fois que toutes les données ont été traitées sans erreur.
Selon le plugin de source de données utilisé, query et vars peuvent être facultatifs : configurez-les selon la documentation du plugin de source de données.
commit_all et commit_one s’excluent mutuellement : vous pouvez définir aucun ou l’un d’entre eux, mais pas les deux en même temps.
fetch
: Indique que le plugin doit récupérer des données, sans modifier le jeu de données.add
: Indique que le plugin doit ajouter des données au jeu de données.delete
: Indique que le plugin doit supprimer des données du jeu de données.modify
: Indique que le plugin doit modifier des données dans le jeu de données.Description : La requête à envoyer à la source de données. Peut être un template Jinja.
Les variables Jinja disponibles sont :
attrsmapping
. Peut être utile pour générer des requêtes SQL avec les données requises sans utiliser de wildcards ni saisir manuellement la liste d’attributs.Obligatoire : Non
Type : string
Sous-section facultative contenant certaines variables à transmettre au plugin de source de données.
Le nom de la variable comme clé et sa valeur comme valeur. Chaque valeur peut être un template Jinja.
Les variables Jinja disponibles sont :
attrsmapping
. Peut être utile pour générer des requêtes SQL avec les données requises sans utiliser de wildcards ni saisir manuellement la liste d’attributs.Sous-section obligatoire pour configurer le mapping d’attributs. Les attributs HERMES comme clés, les attributs DISTANTS (sur la source de données) comme valeurs.
Une liste de plusieurs attributs distants peut être définie pour plus de commodité, leurs valeurs non-NULL
seront combinées dans une liste.
Les valeurs NULL
et les listes vides ne seront pas chargées.
Un template Jinja peut être défini comme valeur. Si vous le faites, la valeur entière doit être un
template. Vous ne pouvez pas définir "{{ ATTRIBUTE.split('separator') }} SOME_NON_JINJA_ATTR"
.
Ceci est indispensable pour permettre à l’application d’identifier les REMOTE_ATTRIBUTES
Les variables Jinja disponibles sont :
NULL
et n’est pas une liste vide.pkey_merge_constraint
de la deuxième. Ensuite, les données résultantes seront fusionnées avec les données sources de la troisième source conformément à la pkey_merge_constraint
de la troisième, etc.noConstraint
noConstraint
: n’applique aucune contrainte de fusionmustNotExist
: la clé primaire de la source actuelle ne doit pas exister dans la précédente (dans l’ordre de déclaration des sources de données), sinon les données de la source actuelle seront suppriméesmustAlreadyExist
: la clé primaire de la source actuelle doit déjà exister dans la précédente (dans l’ordre de déclaration des sources de données), sinon les données de la source actuelle seront suppriméesmustExistInBoth
: la clé primaire de la source actuelle doit déjà exister dans la précédente (dans l’ordre de déclaration des sources de données), sinon les données des deux sources seront suppriméesHorriblement lent, évitez au maximum de les utiliser.
si pkey_merge_constraint est défini, il sera appliqué avant merge_constraints
, et les variables Jinja contiendront les valeurs résultantes.
Paramètres partagés par tous les clients.
Sous-sections principales :
L’activation de cette fonctionnalité peut modifier l’ordre de traitement normal des événements : si vos types de données ne sont liés que par des clés primaires, cela ne devrait pas poser de problème, mais si les liens entre eux sont plus complexes, vous devriez vraiment réfléchir à ce qui pourrait mal se passer avant de l’activer.
e.g. avec la politique maximum
et la corbeille activée, l’auto remédiation supprimera les deux événements lorsqu’un événement added
sera suivi d’un événement removed
. Sans erreur, l’objet aurait été créé puis stocké dans la corbeille, mais dans ce cas, il ne sera jamais créé.
Voir comment fonctionne l’auto remédiation pour plus de détails.
disabled
disabled
: pas d’auto remédiation, les événements sont empilés tels quels (par défaut).conservative
: fusionne uniquement les événements added
et modified
entre eux.
added
avec un événement modified
suivant.modified
successifs.maximum
: fusionne tous les événements qui peuvent être fusionnés.
added
avec un événement modified
suivant.modified
successifs.added
est suivi d’un événement removed
.removed
suivi d’un événement added
dans un événement modified
.modified
lorsqu’il est suivi d’un événement removed
.on_remove_event
disabled
: Aucun événement, la politique est désactivée.on_remove_event
: Uniquement sur les événements removed.on_every_event
: Tous les types d’événements (added, modified, removed)0
/unset
0
/unset
désactive la corbeille : les données seront immédiatement supprimées.true
, le client utilisera la première (plus ancienne) séquence initsync disponible sur le bus de messages. Si false
, la dernière (plus récente) sera utilisée.false
Sous-section obligatoire utilisée pour configurer le modèle de données client.
Pour chaque type de données requis, une sous-section avec le nom souhaité du type de données doit être créée et configurée. Le nom du type de données DOIT commencer par un caractère alphanumérique.
Bien évidemment, au moins un type de données doit être configuré.
hermes-server
.Sous-section pour configurer le mapping d’attributs. Les attributs CLIENT comme clés, les attributs DISTANTS (identifiés comme des attributs HERMES sur le serveur hermes) comme valeurs.
Un template Jinja peut être défini comme valeur. Dans ce cas, toute valeur en dehors du template sera utilisée comme chaîne brute et non comme un nom d’attribut distant.
Les variables Jinja disponibles sont :
NULL
et n’est pas une liste vide.Si vous n’utilisez pas leur valeur, il n’est pas nécessaire de déclarer un mapping pour les clés primaires. Pour certains types de données, vous pouvez omettre le mapping d’attributs, ce qui équivaut à définir un modèle de données vide : il ne contiendra donc que sa ou ses clés primaires.
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
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.
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 :
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') }}"
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.
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 :
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']) }}"
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
Ce plugin permet d’utiliser un serveur LDAP comme source de données.
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
L’utilisation diffère selon le type d’opération spécifié
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 }}"
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
# ...
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
# ...
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
# ...
Ce plugin permet d’utiliser une base de données Oracle comme source de données.
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"
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 }}"
Ce plugin permet d’utiliser une base de données PostgreSQL comme source de données.
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"
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 }}"
Ce plugin permet d’utiliser une base de données SQLite comme source de données.
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
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 }}"
Ce plugin permet à hermes-server d’envoyer les événements produits vers un serveur Apache Kafka.
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
Ce plugin permet à hermes-server d’envoyer les événements produits vers une base de données SQLite.
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
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 :
Gère les utilisateurs, les groupes, les mots de passe des utilisateurs et l’appartenance des utilisateurs aux groupes.
Les clients disponibles sont :
pypsrp
.Groups
, contenant les adresses e-mail de ses membres (une par ligne).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.
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: "!@#$%^&*"
Les types de données suivants peuvent être configurés :
Users
: nécessite que l’attribut SamAccountName
soit définiUserPasswords
: 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ésGroups
: nécessite que l’attribut SamAccountName
soit définiGroupsMembers
: 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ésSubGroupsMembers
: 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
# ...
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.
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: "!@#$%^&*"
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.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.
É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.
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
Ce client génére un fichier txt plat par Groups
, contenant les adresses e-mail de ses membres (une par ligne).
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
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’utilisateurmail
: l’adresse e-mail de l’utilisateurGroups
, nécessite les noms d’attribut suivants :
group_pkey
: la clé primaire du groupename
: 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’utilisateurgroup_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
Ce client traite les événements de type Users
and UserPassword
et stocke les données sur un serveur Kerberos Heimdal.
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: "!@#$%^&*"
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 principalUserPasswords
, 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
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
.
Si vous devez générer des hachages de mots de passe LDAP, vous devriez regarder le plugin d’attribut ldapPasswordHash.
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
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
# ...
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.
Rien à configurer pour le plugin.
hermes-client-usersgroups_null:
Les types de données suivants peuvent être configurés, sans contrainte particulière puisque rien ne sera traité.
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
# ...
Ce plugin permet à hermes-client de recevoir des événements depuis un serveur Apache Kafka.
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
Ce plugin permet à hermes-client de recevoir des événements depuis une base de données SQLite.
hermes:
plugins:
messagebus:
sqlite:
settings:
# OBLIGATOIRE :
uri: /path/to/.hermes/bus.sqlite
Vous pouvez démarrer n’importe quelle application Hermes (server, server-cli, client, client-cli) directement avec le lanceur hermes.py
, en spécifiant le nom de l’application comme premier argument, ou par un lien symbolique.
Dans les deux cas, la configuration sera recherchée dans le répertoire de travail courant.
# Server
/path/to/hermes.py server
# Server CLI
/path/to/hermes.py server-cli
# Client usersgroups_null
/path/to/hermes.py client-usersgroups_null
# Client usersgroups_null CLI
/path/to/hermes.py client-usersgroups_null-cli
Si vous souhaitez éviter de spécifier le nom de l’application hermes comme premier argument, il est possible de créer un lien symbolique de hermes.py
vers hermes-
appname, e.g.:
ln -s hermes.py hermes-server
ln -s hermes.py hermes-server-cli
ln -s hermes.py hermes-client-usersgroups_null
ln -s hermes.py hermes-client-usersgroups_null-cli
# ...
et de l’exécuter ainsi :
# Server
/path/to/hermes-server
# Server CLI
/path/to/hermes-server-cli
# Client usersgroups_null
/path/to/hermes-client-usersgroups_null
# Client usersgroups_null CLI
/path/to/hermes-client-usersgroups_null-cli
Le serveur et les clients n’acceptent aucun argument, car ils sont conçus pour être contrôlés via la CLI.
Une fois le serveur ou le client démarré, vous pouvez demander la liste des commandes CLI disponibles avec l’option -h
ou --help
.
Pour le serveur :
$ ./hermes.py server-cli -h
usage: hermes-server-cli [-h] {initsync,update,quit,pause,resume,status} ...
Hermes Server CLI
positional arguments:
{initsync,update,quit,pause,resume,status}
Sub-commands
initsync Send specific init message containing all data but passwords. Useful to fill new client
update Force update now, ignoring updateInterval
quit Stop server
pause Pause processing until 'resume' command is sent
resume Resume processing that has been paused with 'pause'
status Show server status
options:
-h, --help show this help message and exit
Pour un client :
$ ./hermes.py client-usersgroups_null-cli -h
usage: hermes-client-usersgroups_null-cli [-h] {quit,pause,resume,status} ...
Hermes client hermes-client-usersgroups_null CLI
positional arguments:
{quit,pause,resume,status}
Sub-commands
quit Stop hermes-client-usersgroups_null
pause Pause processing until 'resume' command is sent
resume Resume processing that has been paused with 'pause'
status Show hermes-client-usersgroups_null status
options:
-h, --help show this help message and exit