L’agent OpenSearch est un service à côté du cluster. Il maintient le contrôle d’accès propre au plug-in de sécurité en phase avec les politiques signées d’un service de données opensearch : un rôle par utilisateur qui contient exactement ce que les politiques lui donnent, associé à ce seul utilisateur, avec sécurité au niveau des champs, champs masqués et sécurité au niveau des documents. OpenSearch vérifie alors lui-même chaque requête, et l’agent ne se place jamais entre les clients et le cluster. La distribution le fournit sous forme de JAR exécutable, agents/opensearch/grantforge-agent-opensearch-<version>.jar, qui requiert Java 17 ou plus récent.
Les tests d’intégration Testcontainers du dépôt exécutent l’agent, et le JAR tel que livré, contre OpenSearch 2.19, 3.3, 3.6 et 3.9 avec le plug-in de sécurité. Cela ne certifie pas toutes les autres versions ; l’agent refuse les clusters antérieurs à 2.19 et les clusters sans plug-in de sécurité. Pour le plug-in de service, voir OpenSearch.
Fonctionnement
- Un rôle par utilisateur contient ce que GrantForge donne. Pour chaque utilisateur à qui les politiques donnent quelque chose, l’agent tient un rôle à son nom,
grantforge_alicepouralice, associé à ce seul utilisateur. Sa description le marque comme celui de l’agent, et l’agent ne prend aucun rôle sans cette marque pour l’un des siens, de sorte qu’il ne modifie aucun autre rôle ni association. - Les motifs d’index restent des motifs. Un motif d’index d’une politique, comme
logs-*, est accordé comme motif partout où toutes les politiques décident de même sur toute son étendue : toute politique de tout type dont les index recoupent le motif le couvre entièrement. L’agent le décide exactement, avec des automates finis des motifs. Les index créés ensuite, comme les journaux de demain, sont alors aussitôt accessibles, y compris quand le premier document écrit les crée. Là où une politique décide autrement à l’intérieur d’un motif, comme un refus delogs-secretdanslogs-*, l’agent accorde chaque index et flux de données du cluster par son nom, et les nouveaux à la synchronisation suivante. - La sécurité au niveau des champs seulement là où quelque chose en dessous se décide autrement. Un index que l’utilisateur peut lire en entier, sans politique qui pourrait lui retirer un champ, est lu sans sécurité au niveau des champs, de sorte que les champs ajoutés plus tard sont lus aussitôt. Sinon l’utilisateur lit les champs qu’une politique autorise, parmi ceux que ses documents ont et ceux que les politiques nomment ; les multi-champs comme
name.keywordsuivent leur champ. - Masques et filtres de lignes sont ceux du plug-in de sécurité. Un masque devient un champ masqué de l’entrée, et un filtre de lignes sa requête de sécurité au niveau des documents. L’API validate d’OpenSearch vérifie chaque requête avant qu’elle soit accordée ; une requête qu’OpenSearch n’exécuterait pas ne montre aucun document à l’utilisateur, et elle est journalisée. Un masque que le plug-in de sécurité ne connaît pas cache le champ à la place.
- Une entrée par ensemble de permissions. Les index et motifs aux mêmes permissions partagent une entrée ; les entrées ne se recoupent jamais, car le plug-in de sécurité combine la sécurité au niveau des champs et des documents des entrées qui se recoupent.
- Les opérations composites du cluster viennent avec la lecture et l’écriture. La lecture apporte
cluster_composite_ops_ro, pour multi-search, multi-get et le défilement, et l’écriturecluster_composite_ops, pour bulk. - Les changements sont un correctif. L’agent écrit ses rôles et associations comme correctifs JSON, que le plug-in de sécurité applique d’un coup dans tout le cluster : les rôles avant les associations qui les nomment, les associations avant les rôles qu’elles nomment et qui sont retirés. Un correctif que le plug-in de sécurité refuse est appliqué changement par changement, de sorte qu’un rôle défectueux échoue seul.
- Les politiques du moment présent. Chaque synchronisation planifie selon les politiques telles qu’elles s’appliquent à ce moment, de sorte que les périodes de validité commencent et finissent à l’heure.
- Les rôles backend sont des groupes. Une politique pour un groupe s’applique aux utilisateurs internes qui ont un rôle backend de ce nom, ainsi qu’aux groupes dans lesquels GrantForge place les utilisateurs.
- Les changements faits à la main sont annulés. L’agent compare à chaque synchronisation ses rôles et associations avec ce que détient le plug-in de sécurité ; ce qui diffère est réécrit. Quand rien n’a changé, l’agent n’envoie rien.
- Les rôles hors de GrantForge sont signalés. OpenSearch accorde ce que donne n’importe lequel des rôles d’un utilisateur, l’agent ne peut donc pas retirer ce qu’un autre rôle associé à l’utilisateur donne. Il avertit une fois de chaque rôle de ce genre qui donne ce qu’une politique refuse, en nommant le rôle, l’utilisateur, l’accès, l’index et la politique, ainsi que des utilisateurs associés à
all_access, qu’aucun rôle ne lie. - Les accès viennent du journal d’audit. L’agent lit le journal d’audit du plug-in de sécurité dans les index où il l’écrit,
security-auditlog-*: ce qu’il a refusé, commeMISSING_PRIVILEGES, et ce qu’il a autorisé, commeGRANTED_PRIVILEGESlorsque la configuration d’audit les journalise. Chaque événement nomme l’utilisateur, le type d’accès, chaque index ou flux de données atteint, ou le cluster, et dit si GrantForge l’a décidé ou si un rôle hors de GrantForge l’a autorisé.
| Action | Événement d’accès |
|---|---|
indices:data/read/* : recherche, lecture, comptage |
read sur chaque index ou flux de données |
indices:data/write/index, update, bulk |
index |
indices:data/write/delete |
delete |
indices:admin/create, auto_create, data_stream/create |
create_index |
indices:admin/aliases*, indices:monitor/* |
manage_aliases, monitor |
Autres indices:admin/* |
manage |
cluster:monitor/*, cluster:admin/snapshot/* et repository/* |
cluster_monitor, manage_snapshots sur le cluster |
| Modèles d’index et de composants, pipelines d’ingestion | manage_templates, manage_pipelines sur le cluster |
Déploiement
-
Ajoutez un service de données
opensearchet configurez ses politiques. Ouvrez Autorisations sur les données → Agents, sélectionnez le service et émettez un jeton d’agent. Il n’est affiché qu’une fois ; conservez-le dans un fichier que seul le compte de l’agent peut lire. -
Donnez à l’agent un utilisateur qui peut modifier la configuration du plug-in de sécurité : un utilisateur associé à
all_accesstant queplugins.security.restapi.roles_enabledle liste, ou le certificat d’administration que nommeplugins.security.authcz.admin_dn. Les tests exécutent l’agent avec l’adminde la configuration de démonstration, et avec son certificat d’administration. -
Pour signaler les accès, gardez le journal d’audit dans le cluster (
plugins.security.audit.type: internal_opensearch). Pour ce qu’OpenSearch a autorisé, retirez aussiGRANTED_PRIVILEGESdes catégories désactivées de la configuration d’audit ; les refus sont journalisés par défaut. -
Écrivez le fichier de paramètres en remplaçant les adresses, chemins et noms d’exemple :
grantforge.server.url=https://grantforge.example.com grantforge.token.file=/etc/grantforge/opensearch-agent.token grantforge.instance=opensearch-agent-1 grantforge.cache.dir=/var/lib/grantforge/opensearch-agent grantforge.opensearch.hosts=https://opensearch1.internal:9200,https://opensearch2.internal:9200 grantforge.opensearch.user=grantforge grantforge.opensearch.password.file=/etc/grantforge/opensearch-agent.password grantforge.opensearch.tls.ca=/etc/grantforge/opensearch-ca.pemCes chemins sont sur la machine de l’agent, et le répertoire de cache doit être accessible en écriture. Les fichiers de mot de passe sont lus en UTF-8 et rognés.
-
Démarrez l’agent, par exemple comme service systemd :
java -jar agents/opensearch/grantforge-agent-opensearch-<version>.jar /etc/grantforge/opensearch-agent.propertiesRemplacez
<version>par la version de la distribution. Les paramètres fournis sous la formejava -Dgrantforge.…=… -jar …remplacent ceux du fichier. L’agent s’arrête proprement sur SIGTERM et envoie ou met en file les événements en attente ; OpenSearch garde ce qu’il a reçu. -
Transférer les rôles existants dans des politiques : les rôles associés aux utilisateurs hors de GrantForge continuent de s’appliquer à côté de ceux de l’agent. Créez les politiques correspondantes, puis supprimez ces associations ; les avertissements de l’agent nomment les rôles qui donnent ce qu’une politique refuse.
| Paramètre | Rôle |
|---|---|
grantforge.server.url, grantforge.token.file, grantforge.instance, grantforge.cache.dir |
Obligatoires : le serveur GrantForge, le fichier du jeton d’agent, un nom pour cet agent et un répertoire accessible en écriture pour l’instantané signé, les événements en file et la position de lecture du journal d’audit |
grantforge.signing.key.file |
Fichier facultatif qui fixe la clé de signature des instantanés ; copiez la clé publique X.509 Ed25519 encodée en Base64 depuis la page Agents. S’il est omis, la clé est récupérée auprès du serveur au premier contact |
grantforge.opensearch.hosts |
Obligatoire : les nœuds sous forme d’URL, essayés tour à tour lorsqu’un nœud est injoignable ; sans schéma, un nœud est https, et le port par défaut est 9200 |
grantforge.opensearch.user, grantforge.opensearch.password.file |
L’utilisateur de l’agent et le fichier de son mot de passe |
grantforge.opensearch.tls.cert, grantforge.opensearch.tls.key |
À la place : certificat client PEM et sa clé privée, ensemble, pour se connecter avec un certificat ; grantforge.opensearch.tls.key.passphrase.file contient la phrase secrète d’une clé chiffrée |
grantforge.opensearch.ssl.verification.mode |
full (par défaut) vérifie les certificats et les noms des nœuds, certificate leurs certificats seulement, none rien |
grantforge.opensearch.tls.ca |
Certificats d’AC PEM qui vérifient les nœuds ; vide fait confiance à ce à quoi Java fait confiance |
grantforge.opensearch.timeout.ms |
Durée permise pour la connexion et une requête, par défaut 30000, plage 1..600000 millisecondes |
grantforge.opensearch.role.prefix |
Le début des noms des rôles de l’agent, par défaut grantforge_ ; lettres minuscules, chiffres, traits d’union et tirets bas, terminé par un tiret bas, au plus 32 caractères. L’agent possède les rôles qu’il a marqués dont le nom commence par lui |
grantforge.opensearch.unmanaged.users |
Utilisateurs que l’agent laisse tranquilles, séparés par des virgules, comme des comptes de service ; il laisse toujours tranquilles son propre utilisateur et les utilisateurs associés à all_access |
grantforge.sync.interval.ms |
Fréquence à laquelle l’agent met OpenSearch en phase, par défaut 10000, plage 1000..3600000 millisecondes |
grantforge.audit.log |
Par défaut true ; false ne lit pas de journal d’audit et ne signale aucun accès |
grantforge.audit.log.index, grantforge.audit.log.interval.ms, grantforge.audit.log.max.documents |
Les index du journal d’audit, par défaut security-auditlog-* ; la fréquence de lecture, par défaut 5000 millisecondes ; et le nombre maximal de documents par lecture, par défaut 1000, de sorte qu’un arriéré soit lu en plusieurs fois |
grantforge.connect.timeout.ms, grantforge.read.timeout.ms |
Délais de connexion et de lecture vers GrantForge, par défaut 5000 / 8000 millisecondes |
grantforge.refresh.interval.ms |
Fréquence à laquelle l’agent demande de nouvelles politiques, par défaut 30000, au moins 1000 millisecondes |
grantforge.audit.batch.size, grantforge.audit.queue.capacity, grantforge.audit.flush.interval.ms, grantforge.audit.spool.limit.bytes |
Événements d’accès : taille de lot (par défaut 500), taille de file (par défaut 10000), intervalle d’envoi (par défaut 5000 millisecondes) et limite de file sur disque (par défaut 64 Mio) |
grantforge.audit.fold.window.ms |
Durée pendant laquelle des accès autorisés identiques sont regroupés en un événement, par défaut 10000, jusqu’à 3600000 millisecondes ; 0 envoie chacun |
Utilisateurs, groupes et rôles
Les politiques nomment les utilisateurs d’OpenSearch tels que le plug-in de sécurité les connaît. L’agent tient des rôles pour les utilisateurs internes, pour les utilisateurs que nomment les politiques, qui peuvent se connecter par un annuaire comme LDAP ou SAML, et pour les utilisateurs dont il tenait déjà des rôles ; les utilisateurs réservés et cachés du plug-in de sécurité, comme kibanaserver, sont laissés tranquilles. Les groupes sont les rôles backend d’un utilisateur interne ainsi que les groupes dans lesquels GrantForge place l’utilisateur ; l’agent ne connaît pas les rôles backend qu’un annuaire donne à la connexion, donnez donc à ces utilisateurs leurs groupes dans GrantForge. Les rôles sont ceux que GrantForge donne à l’utilisateur.
Décisions et limites
- Sans instantané, l’agent ne change rien. Un service inutilisé, ou un jeton lié à un service dont le type n’est pas
opensearch, n’accorde rien : l’agent retire ses rôles et associations, et les rôles propres du plug-in de sécurité s’appliquent. - Tant que l’agent ne tourne pas, OpenSearch garde ce qu’il a reçu en dernier ; les changements de politiques l’attendent. Un changement atteint OpenSearch dans l’intervalle de rafraîchissement et l’intervalle de synchronisation.
- Les index accordés par leur nom, et non par un motif, reçoivent leurs permissions à la synchronisation suivante.
- Les alias atteignent les index qui les composent : rechercher dans un alias demande des permissions sur chacun de ses index, donc les politiques nomment des index et des flux de données, pas des alias.
- Un filtre de lignes ne peut tester que les champs que l’utilisateur peut lire, et un masque s’applique aux valeurs des champs text et keyword.
- Les index dont le nom commence par un point ne sont atteints que par des motifs de politique qui commencent par un point.
- L’agent ne gère pas les tenants du plug-in de sécurité pour OpenSearch Dashboards.
