Elastic Stack (ELK)
Elasticsearch (recherche, agrégations, documents), envoi vers Logstash et alertes Kibana.
Intégration maintenue par Orkyvo pour Elastic Stack, avec des opérations séparées par composant. Elasticsearch : recherche Query DSL avec pagination (from/size, search_after) et limites, agrégations, lecture, indexation et mise à jour de documents, avec une clé d'API. Logstash : envoi d'un événement JSON vers une entrée HTTP que vous configurez côté Logstash (exemple de pipeline fourni). Kibana : réception des notifications d'alerte envoyées par un connecteur Webhook. Fonctionne avec Elastic Cloud et les déploiements autohébergés (autorité de certification interne acceptée).
Opérations
| Opération | Type | Description |
|---|---|---|
| Elasticsearch · Rechercher | action | Recherche Query DSL avec tri, pagination (from/size ou search_after) et limite de 1 000 résultats par appel. |
| Elasticsearch · Agrégations | action | Exécute des agrégations (sans documents) sur une requête. |
| Elasticsearch · Obtenir un document | action | Lit un document par index et identifiant. |
| Elasticsearch · Indexer un documenteffet externe : demande une confirmation avant une exécution manuelle | action | Crée ou remplace un document. Sans identifiant, un identifiant déterministe est dérivé de l'étape : une nouvelle tentative ne crée pas de doublon. |
| Elasticsearch · Mettre à jour un documenteffet externe : demande une confirmation avant une exécution manuelle | action | Mise à jour partielle (doc), création possible si absent (upsert), 3 essais en cas de conflit de version. |
| Elasticsearch · Lister les index | action | Index, état de santé, nombre de documents et taille (privilège monitor). |
| Logstash · Envoyer un événementeffet externe : demande une confirmation avant une exécution manuelle | action | Envoie un événement JSON à l'entrée HTTP configurée côté Logstash (plugin http). Un identifiant orkyvo.event_id permet le dédoublonnage en aval. |
| Kibana · Alerte reçue | déclencheur | Démarre le workflow à chaque notification d'une règle d'alerte Kibana envoyée par un connecteur Webhook (en-tête secret vérifié, doublons écartés). |
Connexion
Renseignez les composants utilisés : Elasticsearch (URL et clé d'API à privilèges limités) et/ou l'entrée HTTP Logstash. Les alertes Kibana arrivent par webhook et ne nécessitent pas d'identifiants ici.
Documentation
Elastic Stack (ELK)
Intégration maintenue par Orkyvo (non certifiée par Elastic N.V.) pour Elasticsearch, Logstash et Kibana 8.x (Elastic Cloud ou autohébergé). Chaque opération porte le nom de son composant : rien n'est supposé d'un composant à l'autre.
Connexion
| Champ | Composant | Description |
|---|---|---|
| URL d'Elasticsearch | Elasticsearch | Point de terminaison du cluster (Elastic Cloud : *Copy endpoint*). |
| Clé d'API (encodée) | Elasticsearch | Valeur encoded d'une clé d'API, envoyée en Authorization: ApiKey …. |
| URL de l'entrée HTTP | Logstash | Adresse de l'entrée http de votre pipeline. |
| Utilisateur / mot de passe | Logstash | Si l'entrée http est protégée (user, password). |
| Autorité de certification | Elasticsearch, Logstash | PEM d'une autorité interne ; la vérification TLS reste active. |
Les secrets sont chiffrés et masqués dans l'interface, les journaux, les erreurs et les exports. Une adresse privée (cluster sur site) doit être autorisée par un administrateur de la plateforme pour cette connexion ; l'entrée HTTP Logstash sans TLS n'est acceptée que si la règle l'autorise explicitement.
Clé d'API aux privilèges limités (exemple, à créer par POST /_security/api_key) :
{"name": "orkyvo","expiration": "365d","role_descriptors": {"orkyvo": {"cluster": ["monitor"],"indices": [{ "names": ["logs-*"], "privileges": ["read", "view_index_metadata"] },{ "names": ["incidents"], "privileges": ["read", "create_doc", "index", "write"] }]}}}
« Tester la connexion » lit GET / et GET /_security/_authenticate ; l'entrée Logstash n'est pas contactée (un envoi est une écriture).
Elasticsearch
| Opération | API | Limites |
|---|---|---|
| Rechercher | POST /{index}/_search (Query DSL) | 1 000 résultats par appel ; from + size ≤ 10 000 ; au-delà, search_after (renvoyé dans nextSearchAfter, tri obligatoire). Total compté jusqu'à 10 000 (exact en option). |
| Agrégations | POST /{index}/_search avec size: 0 | Agrégations libres (terms, date_histogram, avg…). |
| Obtenir un document | GET /{index}/_doc/{id} | |
| Indexer un document | PUT /{index}/_doc/{id} ou PUT /{index}/_create/{id} | Sans identifiant : identifiant déterministe dérivé de l'étape et création seule → pas de doublon en cas de nouvelle tentative (existing: true). |
| Mettre à jour un document | POST /{index}/_update/{id} | Mise à jour partielle, doc_as_upsert en option, retry_on_conflict: 3. |
| Lister les index | GET /_cat/indices?format=json | Privilège monitor. |
Le sélecteur d'index propose les index ouverts et des motifs (logs-api*) ; la saisie manuelle et les données des étapes précédentes restent possibles.
Logstash : entrée HTTP
Orkyvo envoie des événements à Logstash ; Logstash ne propose pas de recherche de journaux (la recherche se fait dans Elasticsearch). L'entrée HTTP doit exister côté Logstash avant tout envoi : sans elle, l'étape échoue (connexion refusée ou 404).
Exemple de pipeline (/etc/logstash/conf.d/orkyvo.conf) :
input {http {port => 8080ssl_enabled => truessl_certificate => "/etc/logstash/certs/logstash.crt"ssl_key => "/etc/logstash/certs/logstash.key"user => "orkyvo"password => "${ORKYVO_HTTP_PASSWORD}"additional_codecs => { "application/json" => "json" }}}filter {# Dédoublonnage : un même orkyvo.event_id produit le même document.fingerprint { source => ["[orkyvo][event_id]"] target => "[@metadata][fingerprint]" method => "SHA256" }mutate { remove_field => ["[http][request][headers][authorization]"] }}output {elasticsearch {hosts => ["https://es.example.com:9200"]api_key => "${ES_API_KEY}"index => "orkyvo-events"document_id => "%{[@metadata][fingerprint]}"}}
Logstash répond 200 ok dès réception. Chaque événement reçoit orkyvo.event_id (saisi, ou dérivé de l'étape et stable en cas de nouvelle tentative). Un envoi n'est jamais relancé automatiquement après une réponse réseau perdue (« Résultat incertain ») ; avec document_id ci-dessus, un renvoi manuel ne crée pas de doublon.
Kibana : alertes reçues par webhook
Prérequis :
- Licence : le connecteur *Webhook* est disponible sur Elastic Cloud et, en autohébergé, à partir de la licence Gold (ou en période d'essai).
- Kibana doit pouvoir joindre l'URL publique d'Orkyvo en HTTPS. En autohébergé, l'hôte peut devoir figurer dans
xpack.actions.allowedHosts.
Mise en place :
- Ajoutez le déclencheur « Kibana · Alerte reçue » et publiez le workflow : l'URL du webhook et le secret s'affichent dans l'éditeur (« Afficher le secret »).
- Dans Kibana : *Stack Management → Connectors → Webhook*. Méthode
POST, URL du workflow, en-têteX-Orkyvo-Token: <secret>, en-têteContent-Type: application/json. - Dans la règle d'alerte, ajoutez une action avec ce connecteur et le corps suivant (variables disponibles selon le type de règle) :
{"rule": { "id": "{{rule.id}}", "name": "{{rule.name}}", "url": "{{rule.url}}", "tags": "{{rule.tags}}" },"alert": { "id": "{{alert.id}}", "uuid": "{{alert.uuid}}", "actionGroup": "{{alert.actionGroup}}", "actionGroupName": "{{alert.actionGroupName}}", "flapping": "{{alert.flapping}}" },"context": { "reason": "{{context.reason}}", "value": "{{context.value}}", "conditions": "{{context.conditions}}", "link": "{{context.link}}" },"date": "{{date}}","kibanaBaseUrl": "{{kibanaBaseUrl}}"}
Chaque appel est vérifié (en-tête secret, comparaison à temps constant, jamais enregistré). Les nouvelles tentatives de Kibana pour une même notification sont dédoublonnées (règle, alerte, groupe d'action et date). Le workflow reçoit rule, alert, recovered (groupe recovered), context, date et kibanaBaseUrl.
Erreurs
401 clé d'API invalide ou expirée · 403 privilège manquant sur l'index · 404 index ou document introuvable · 409 document déjà existant (création) ou conflit de version · 429 / 5xx temporaires (lectures relancées selon Retry-After). Certificat refusé : ajoutez l'autorité interne.
Limites
- Tests automatisés sur API simulées ; test réel sur un déploiement d'essai Elastic Cloud ou
docker composelocal :docs/INTEGRATIONS.md.