Préambule
Les organisations qui utilisent des indicateurs ou des observables de menaces consomment, créent et/ou (idéalement) publient des données sur les menaces. Ces données peuvent être utilisées en interne ou en externe comme informations ou renseignements pour éclairer la prise de décision et la hiérarchisation des événements.
Bien qu'il existe plusieurs formats pour structurer ces informations, la norme industrielle de facto est l'expression structurée des informations sur les menaces (STIX). STIX est géré par le comité technique OASIS Cyber Threat Intelligence et permet aux organisations de partager des données sur les menaces dans un format standard et lisible par machine.
Chez Elastic, nous avons développé l'Elastic Common Schema (ECS) en tant que capacité de normalisation des données. "ECS] est une spécification open source, développée avec le soutien de la communauté des utilisateurs d'Elastic. ECS définit un ensemble commun de champs pour le stockage des données d'événements dans Elasticsearch, telles que les journaux et les mesures". En avril 2023, Elastic a contribué à l'OpenTelemetry Semantic Conventions (OTel) en tant qu'engagement pour le développement conjoint d'un schéma ouvert.
La communauté de la sécurité partage des données sur les menaces au format STIX. Pour stocker ces données dans Elasticsearch à des fins d'analyse et de détection des menaces[1][2][3][4], nous avons créé un outil qui convertit les documents STIX en ECS et produit les données sur les menaces sous forme de fichier ou directement dans des index Elasticsearch. Si c'était un défi pour nous, c'était aussi un défi pour d'autres - c'est pourquoi nous avons décidé de publier une version de l'outil.
Cet outil utilise la licence Elastic 2.0 et peut être téléchargé ici.
Premiers pas
Ce projet prend un document JSON formaté par STIX 2.x et crée une version ECS. Il existe trois options de sortie : STDOUT en JSON, un fichier NDJSON, et/ou directement vers un cluster Elasticsearch.
Produits requis
Le projet STIX 2 ECS nécessite Python 3.10+ et les modules stix2, Elasticsearch et getpass.
Si vous exportez vers Elasticsearch, vous aurez besoin des informations sur l'hôte et des informations d'authentification. L'authentification de l'API n'est pas encore mise en œuvre.
Configuration
Créez un environnement virtuel et installez les prérequis nécessaires.
git clone https://github.com/elastic/labs-releases.git
cd tools/stix2ecs
python -m venv /path/to/virtual/environments/stix2ecs
source /path/to/virtual/environments/stix2ecs/bin/activate
python -m pip install -r requirements.txt
Fonctionnement
L'entrée est un document JSON STIX 2.x (ou un dossier de documents JSON) ; la sortie est par défaut STDOUT, avec une option pour créer un fichier NDJSON et/ou l'envoyer à un cluster Elasticsearch.
stix_to_ecs.py [-h] -i INPUT [-o OUTPUT] [-e] [--index INDEX] [--url URL] \
[--user USER] [-p PROVIDER] [-r]
Par défaut, le fichier ECS porte le même nom que le fichier d'entrée STIX, mais avec .ecs.ndjson
en annexe.
Arguments
Le script a plusieurs arguments, le seul champ obligatoire est -i
pour l'entrée. Par défaut, le script produira le document NDJSON sur STDOUT.
Option | Description |
---|---|
-h | affiche le menu d'aide |
-i | spécifie le document STIX d'entrée (obligatoire) |
-o | spécifie le document ECS de sortie (facultatif) |
-p | définit le champ du fournisseur ECS (facultatif) |
-r | mode récursif pour convertir plusieurs documents STIX (optionnel) |
-e | spécifie le mode de sortie d'Elasticsearch (optionnel) |
--index | définit l'index Elasticsearch, nécessite -e (optionnel) |
--url | définit l'URL Elasticsearch, nécessite -e (optionnel) |
--utilisateur | définit le nom d'utilisateur Elasticsearch, nécessite -e (optionnel) |
Exemples
Deux fichiers d'exemple se trouvent dans le répertoire test-inputs/
. L'une d'entre elles provient de CISA (Cybersecurity & Infrastructure Security Agency), et l'autre d'OpenCTI (une plateforme de renseignement sur les menaces en libre accès).
Entrée du fichier STIX dans STDOUT
Le document STIX sera envoyé à STDOUT au format ECS.
python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json | jq
[
{
"threat": {
"indicator": {
"file": {
"name": "123.ps1",
"hash": {
"sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
}
},
"type": "file",
"description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
"first_seen": "2023-11-21T18:57:25.000Z",
"provider": "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
"modified_at": "2023-11-21T18:57:25.000Z",
"marking": {
"tlp": "clear"
}
}
}
},
...
Entrée d'un fichier STIX et sortie d'un fichier ECS
Cela créera un dossier appelé ecs
dans le répertoire actuel et y écrira le fichier ECS.
python python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -o ecs
cat ecs/cisa_sample_stix.ecs.ndjson | jq
{
"threat": {
"indicator": {
"file": {
"name": "123.ps1",
"hash": {
"sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
}
},
"type": "file",
"description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
"first_seen": "2023-11-21T18:57:25.000Z",
"provider": "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
"modified_at": "2023-11-21T18:57:25.000Z",
"marking": {
"tlp": "clear"
}
}
}
}
...
Entrée du fichier STIX vers la sortie du fichier ECS, en définissant le champ "fournisseur".
Le champ fournisseur est généralement un GUID dans le document STIX. Pour plus de convivialité, vous pouvez utiliser l'argument -p
pour définir le champ threat.indicator.provider
.
python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -o ecs -p "Elastic Security Labs"
cat ecs/cisa_sample_stix.ecs.ndjson | jq
{
"threat": {
"indicator": {
"file": {
"name": "123.ps1",
"hash": {
"sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
}
},
"type": "file",
"description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
"first_seen": "2023-11-21T18:57:25.000Z",
"provider": "Elastic Security Labs",
"modified_at": "2023-11-21T18:57:25.000Z",
"marking": {
"tlp": "clear"
}
}
}
}
...
Entrée du répertoire STIX vers les sorties du fichier ECS
Si vous disposez d'un répertoire de documents STIX, vous pouvez utiliser l'argument -r
pour effectuer une recherche récursive dans le répertoire et écrire les documents ECS dans le répertoire de sortie.
python stix_to_ecs.py -ri test-inputs -o ecs
Fichier STIX en entrée vers Elasticsearch en sortie
Pour envoyer des données à Elasticsearch, vous pouvez utiliser Elastic Cloud ou une instance locale. Elasticsearch local utilisera le port 9200
et Elastic Cloud utilisera le port 443
. Par défaut, une session TLS valide vers Elasticsearch est requise.
Tout d'abord, créez un index si vous n'en avez pas déjà un. Dans cet exemple, nous créons un index appelé stix2ecs
, mais le nom de l'index n'est pas pertinent.
curl -u {username} -X PUT "https://elasticsearch:port/stix2ecs?pretty"
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "stix2ecs"
}
Ensuite, définissez les options de sortie d'Elasticsearch.
python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -e --url https://elasticsearch:port --user username --index stix2ecs
Si vous stockez les données dans Elasticsearch pour les utiliser dans une autre plateforme, vous pouvez visualiser les indicateurs à l'aide de cURL.
curl -u {username} https://elasticsearch:port/stix2ecs/_search?pretty
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "stix2ecs",
"_id" : "n2lt8IwBahlUtp0hzm9i",
"_score" : 1.0,
"_source" : {
"threat" : {
"indicator" : {
"file" : {
"name" : "123.ps1",
"hash" : {
"sha256" : "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
}
},
"type" : "file",
"description" : "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
"first_seen" : "2023-11-21T18:57:25.000Z",
"provider" : "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
"modified_at" : "2023-11-21T18:57:25.000Z",
"marking" : {
"tlp" : "clear"
}
}
}
}
}
...
Si vous utilisez Kibana, vous pouvez créer une vue de données pour votre index stix2ecs
afin d'afficher les indicateurs ingérés.
Enfin, vous pouvez l'utiliser comme source d'indicateurs pour les règles de correspondance des indicateurs.
Résumé
Nous espérons que ce projet aidera votre organisation à analyser et à rendre opérationnelles vos données sur les menaces. Si vous ne connaissez pas encore l'Elastic Common Schema, vous pouvez en savoir plus ici.
Comme toujours, n'hésitez pas à ouvrir un dossier pour toute question, commentaire, préoccupation ou plainte.
À propos d'Elastic Security Labs
Elastic Security Labs est la branche d'Elastic Security spécialisée dans le renseignement sur les menaces et dont l'objectif est d'apporter des changements positifs dans le paysage des menaces. Elastic Security Labs fournit des recherches accessibles au public sur les menaces émergentes avec une analyse des objectifs stratégiques, opérationnels et tactiques des adversaires, puis intègre ces recherches aux capacités intégrées de détection et de réponse d'Elastic Security.
Suivez Elastic Security Labs sur Twitter @elasticseclabs et consultez nos recherches sur www.elastic.co/security-labs/.