Ce document explique comment configurer le plugin OpenCTI v1.0.0 pour le module Threat Exchange de la plateforme Netskope Cloud Exchange. Ce plugin récupère les indicateurs de type URL, IPv4, Domain, IPv6, SHA256 et MD5 depuis les Observables sur OpenCTI. Ce plugin permet de partager des MD5, SHA256, URL, Domain, IPv4 et IPv6 vers des Observables sur la plateforme OpenCTI en utilisant l'action Add Indicators.
Conditions préalables
Pour compléter cette configuration, vous avez besoin de :
- Un locataire Netskope (ou plusieurs, par exemple des instances de production et de développement/test).
- A Netskope Cloud Exchange tenant with the Tenant plugin and Threat Exchange plugin already configured.
- Les informations d'identification de la plate-forme OpenCTI (URL de base et clé API).
- Connectivité à l'hôte suivant : OpenCTI Base URL.
Champ d'application du plugin
Le plugin OpenCTI récupère des IoC de type URL, IPv4, Domain, IPv6, SHA256 et MD5 à partir des Observables sur OpenCTI. Ce plugin permet de partager des MD5, SHA256, URL, Domain, IPv4 et IPv6 vers des Observables sur la plateforme OpenCTI en utilisant l'action Add Indicators.
Type de données prises en charge
| Types d'indicateurs prédéfinis | Types d'indicateurs partagés |
|---|---|
| URL, IPv4, domaine, IPv6, SHA256 et MD5 | URL, IPv4, domaine, IPv6, SHA256 et MD5 |
Mises en correspondance
Mappages de traction
| Champs CE de Netskope | Champs OpenCTI |
|---|---|
| value | pattern |
| type | extrait du modèle stix |
| expiresAt | valid_until |
| firstSeen | created |
| lastSeen | modified |
| reputation | confidence |
| tags | objectLabel |
| commentaires | description, score de décomposition, valid_until |
| extendedInformation | indicator url |
Mappages de poussée
| Champs CE de Netskope | Champs OpenCTI |
|---|---|
| Nom | Nom du paramètre des actions d'ajout d'indicateurs |
| Score | Input parameter from add indicators actions |
| value | pattern |
| type | x_opencti_main_observable_type |
| reputation | confidence |
| Tag | netskope-ce Netskope CE | <Source Plugin Name> |
Permissions
Dans OpenCTI, pour qu'un utilisateur puisse gérer efficacement les indicateurs, tels que l'ajout, le retrait et la suppression d'indicateurs, il doit être assigné à un groupe d'utilisateurs spécifique avec les rôles et les capacités nécessaires. Ces rôles garantissent que l'utilisateur dispose de l'accès et des autorisations nécessaires pour effectuer ces tâches.
Les rôles et capacités clés nécessaires à la gestion des indicateurs sont les suivants :
- Créer / mettre à jour les connaissances : Ce rôle permet à l'utilisateur de créer et de mettre à jour des articles et des objets de connaissance, en veillant à ce qu'il puisse modifier les indicateurs si nécessaire.
- Supprimer les connaissances : L'utilisateur doit avoir la possibilité de supprimer des connaissances ou des indicateurs, ce qui est nécessaire pour supprimer des données obsolètes ou incorrectes.
- Gérer les taxonomies : La capacité de gérer et d'organiser des taxonomies est importante pour que l'utilisateur puisse catégoriser et maintenir les indicateurs de manière efficace.
En attribuant ces rôles à un utilisateur, celui-ci aura la pleine capacité de gérer les indicateurs au sein d'OpenCTI, y compris l'ajout, l'extraction et la suppression, tout en assurant une bonne gouvernance et une bonne organisation des connaissances et des taxonomies.
Détails de l'API
Liste des API utilisées
| Point final de l'API | Méthode | Cas d'utilisation |
|---|---|---|
| https://<opencti_baseurl>/graphql | PUBLIER | Valider les informations d'identification |
| https://<opencti_baseurl>/graphql | PUBLIER | Indicateurs de traction |
| https://<opencti_baseurl>/graphql | PUBLIER | Indicateurs de poussée |
| https://<opencti_baseurl>/graphql | PUBLIER | Supprimer les indicateurs |
Obtenir le jeton du porteur
API Key – La clé Api est disponible sur la page Profil de l'interface OpenCTI.
Validate Credentials
API Endpoint: https://<base_url>/graphql
Method: PUBLIER
Request Headers
| Clé | Value |
|---|---|
| Authorization | Bearer <API Key> |
| User-Agent | netskope-ce-5.1.1-cte-opencti-v1.0.0 |
Sample API Response
{
"data": {
"indicators": {
"edges": [
{
"node": {
"id": "08a0e35b-5749-4d08-80a9-9f9e8abf1cd4",
"entity_type": "Indicator",
"name": "testing 4",
"pattern_type": "stix",
"pattern": "[file:hashes.'MD5' = '932e07750da28e9d40350ffc840ffb8a']",
"valid_from": "2025-03-13T07:10:55.521Z",
"valid_until": "2026-03-15T04:22:42.820Z",
"revoked": false,
"x_opencti_score": 90,
"description": null,
"x_opencti_main_observable_type": "StixFile",
"created": "2025-03-06T05:17:37.578Z",
"modified": "2025-03-13T07:12:35.933Z",
"confidence": 40,
"draftVersion": null,
"createdBy": null,
"objectMarking": [],
"objectLabel": [
{
"id": "1226a53e-962a-4c11-a0d1-c4cdfc9d0729",
"value": "performance",
"color": "#b8e986"
}
],
"creators": [
{
"id": "88ec0c6a-13ce-5e39-b486-354fe4a7084f",
"name": "admin"
}
],
"__typename": "Indicator"
},
"cursor": "WzAuMDAwMDAzMjY0MjAyOSwiaW5kaWNhdG9yLS0wMDAxNWU0OC05YWRmLTU1YjItODlhZi05OTQzZGE5YjBkZDYiXQ=="
}
],
"pageInfo": {
"endCursor": "WzAuMDAwMDAzMjY0MjAyOSwiaW5kaWNhdG9yLS0wMDAxNWU0OC05YWRmLTU1YjItODlhZi05OTQzZGE5YjBkZDYiXQ==",
"hasNextPage": true,
"globalCount": 123134
}
}
}
}
Indicateurs de traction :
API Endpoint: https://<base_url>/graphql
Method: POST
Request Headers
| Clé | Value |
|---|---|
| Authorization | Bearer <API Key> |
| User-Agent | netskope-ce-5.1.1-cte-opencti-v1.0.0 |
Graphql Query
query Indicators(
$filters: FilterGroup,
$search: String,
$first: Int,
$after: ID,
$orderBy: IndicatorsOrdering,
$orderMode: OrderingMode
) {
indicators(
filters: $filters,
search: $search,
first: $first,
after: $after,
orderBy: $orderBy,
orderMode: $orderMode
) {
edges {
node {
id
objectLabel {
id
value
color
}
revoked
confidence
created
modified
pattern_type
pattern
description
indicator_types
valid_from
valid_until
x_opencti_score
x_opencti_main_observable_type
}
}
pageInfo {
startCursor
endCursor
hasNextPage
hasPreviousPage
globalCount
}
}
}
Graphql Variable
{
"first": 1000,
"after": None,
"orderBy": "modified",
"orderMode": "desc",
"filters": {
"mode": "and",
"filters": [
{
"key": "entity_type",
"values": ["Indicator"],
"operator": "eq",
"mode": "or",
},
{
"key": "pattern_type",
"values": ["stix"],
"operator": "eq",
"mode": "or",
},
],
"filterGroups": [{"mode": "and", "filters": [], "filterGroups": []}],
},
}
Sample API Response:
{
"data": {
"indicators": {
"edges": [
{
"node": {
"id": "08a0e35b-5749-4d08-80a9-9f9e8abf1cd4",
"entity_type": "Indicator",
"name": "testing 4",
"pattern_type": "stix",
"pattern": "[file:hashes.'MD5' = '932e07750da28e9d40350ffc840ffb8a']",
"valid_from": "2025-03-13T07:10:55.521Z",
"valid_until": "2026-03-15T04:22:42.820Z",
"revoked": false,
"x_opencti_score": 90,
"description": null,
"x_opencti_main_observable_type": "StixFile",
"created": "2025-03-06T05:17:37.578Z",
"modified": "2025-03-13T07:12:35.933Z",
"confidence": 40,
"draftVersion": null,
"createdBy": null,
"objectMarking": [],
"objectLabel": [
{
"id": "1226a53e-962a-4c11-a0d1-c4cdfc9d0729",
"value": "performance",
"color": "#b8e986"
}
],
"creators": [
{
"id": "88ec0c6a-13ce-5e39-b486-354fe4a7084f",
"name": "admin"
}
],
"__typename": "Indicator"
},
"cursor": "WzAuMDAwMDAzMjY0MjAyOSwiaW5kaWNhdG9yLS0wMDAxNWU0OC05YWRmLTU1YjItODlhZi05OTQzZGE5YjBkZDYiXQ=="
}
],
"pageInfo": {
"endCursor": "WzAuMDAwMDAzMjY0MjAyOSwiaW5kaWNhdG9yLS0wMDAxNWU0OC05YWRmLTU1YjItODlhZi05OTQzZGE5YjBkZDYiXQ==",
"hasNextPage": true,
"globalCount": 123134
}
}
}
}
Indicateurs de poussée :
API Endpoint: https://<base_url>/graphql
Method: POST
Request Headers
| Clé | Value |
|---|---|
| Authorization | Bearer <API Key> |
| User-Agent | netskope-ce-5.1.1-cte-opencti-v1.0.0 |
Graphql Mutation
mutation IndicatorCreationMutation($input: IndicatorAddInput!) {
indicatorAdd(input: $input) {
id
standard_id
name
description
entity_type
parent_types
pattern_type
valid_from
valid_until
x_opencti_score
x_opencti_main_observable_type
created
confidence
x_opencti_detection
createdBy {
id
name
entity_type
}
objectMarking {
id
definition_type
definition
x_opencti_order
x_opencti_color
}
objectLabel {
id
value
color
}
creators {
id
name
}
}
}
Graphql Variable
{
"input": {
"name": "Testing 5",
"description": "",
"indicator_types": [],
"pattern": "[file:hashes.'MD5' = '932e07750da28e9d40350ffc840ffb8a']",
"pattern_type": "stix",
"createObservables": false,
"x_opencti_main_observable_type": "StixFile",
"x_mitre_platforms": [],
"confidence": 100,
"x_opencti_score": 9,
"x_opencti_detection": false,
"valid_from": null,
"valid_until": null,
"killChainPhases": [],
"objectMarking": [],
"objectLabel": [],
"externalReferences": []
}
}
Sample API Response
{
"data": {
"indicatorAdd": {
"id": "08a0e35b-5749-4d08-80a9-9f9e8abf1cd4",
"standard_id": "indicator--00015e48-9adf-55b2-89af-9943da9b0dd6",
"name": "Testing 5",
"representative": {
"main": "Testing 5"
},
"description": null,
"entity_type": "Indicator",
"parent_types": [
"Basic-Object",
"Stix-Object",
"Stix-Core-Object",
"Stix-Domain-Object"
],
"pattern_type": "stix",
"valid_from": "2025-03-17T05:28:52.077Z",
"valid_until": "2025-03-17T05:28:52.077Z",
"x_opencti_score": 9,
"x_opencti_main_observable_type": "StixFile",
"created": "2025-03-06T05:17:37.578Z",
"confidence": 100,
"draftVersion": null,
"createdBy": null,
"objectMarking": [],
"objectLabel": [
{
"id": "1226a53e-962a-4c11-a0d1-c4cdfc9d0729",
"value": "performance",
"color": "#b8e986"
}
],
"creators": [
{
"id": "88ec0c6a-13ce-5e39-b486-354fe4a7084f",
"name": "admin"
}
]
}
}
}
Supprimer les indicateurs :
API Endpoint: https://<base_url>/graphql
Method: POST
Request Headers
| Clé | Value |
|---|---|
| Authorization | Bearer <API Key> |
| User-Agent | netskope-ce-5.1.1-cte-opencti-v1.0.0 |
Graphql Mutation
mutation DataTableToolBarListTaskAddMutation(
$input: ListTaskAddInput!
) {
listTaskAdd(input: $input) {
__typename
id
type
}
}
Graphql Variable
{
"input": {
"ids": [
"08a0e35b-5749-4d08-80a9-9f9e8abf1cd4",
"e816325c-cf42-4174-9f52-af0ccfe807f4",
"140d2dbc-fff0-424d-ab4d-ee7ce2c2bbf6"
],
"actions": [
{
"type": "DELETE",
"context": null,
"containerId": null
}
],
"scope": "KNOWLEDGE"
}
}
Sample API Response
{
"data": {
"listTaskAdd": {
"__typename": "ListTask",
"id": "2227261e-e342-44d7-a3b6-4a0dcb8ec92e",
"type": "LIST"
}
}
}
Matrice de performance
Vous trouverez ci-dessous la lecture des performances réalisée pour la recherche et l'envoi de 100 000 IOC dans chaque cycle de vie du plugin sur une instance Large CE avec les spécifications ci-dessous.
| Description | Spécifications |
|---|---|
| Détails de la pile | Taille : Grande RAM : 32 GB CPU : 16 cœurs |
| Indicateurs extraits d'OpenCTI | ~15K per minute |
| Indicateurs partagés avec OpenCTI | ~100 per minute |
Agent utilisateur
netskope-ce-5.1.1-cte-opencti-v1.0.0
Workflow
- Obtenez votre clé API OpenCTI.
- Configurez le plugin OpenCTI.
- Ajoutez une règle de gestion pour OpenCTI.
- Ajouter le partage pour OpenCTI.
- Validez le plugin.
Cliquez sur "play" pour regarder une vidéo :
Obtenez votre clé API OpenCTI
Pour configurer le plugin OpenCTI, nous avons besoin de votre clé API. Suivez ces étapes pour obtenir votre clé API.
- Connectez-vous à votre instance OpenCTI et sélectionnez Profile dans le menu du coin supérieur droit.

- Faites défiler la page jusqu'à la section "API access" et copiez la clé API.

Configurer le plugin OpenCTI
- Dans Cloud Exchange, accédez à Settings > Plugins.
- Recherchez et sélectionnez la case du plugin OpenCTI v1.0.0 (CTE) .

- Saisissez les informations de base :
- Nom de la configuration : Nom unique de la configuration.
- Intervalle de synchronisation : Laissez la valeur par défaut.
- Critères de vieillissement : Durée d'expiration du plugin en jours. (Valeur par défaut : 90)
- Ignorer la réputation : Définissez une valeur pour remplacer la réputation des indicateurs reçus de cette configuration. (Valeur par défaut : 5)
- Stratégie d'agrégation des balises : Choisissez d'ajouter les balises New aux objets de confiance existants ou de les écraser. Ce paramètre détermine la manière dont les étiquettes sont stockées pour les indicateurs tirés dans le cadre de cette configuration.
- Activer la validation SSL : Activez la validation du certificat SSL.
- Utiliser le proxy du système : Activez cette option si le proxy est nécessaire pour la communication.
- Cliquez sur Next.
- Enter the configuration parameters:
- URL de base : OpenCTI Base URL.
- API Key : Fournissez la clé API à partir de "My Profile > API Key" sur la plateforme OpenCTI.
- Type de données sur les menaces à extraire : Type de données sur les menaces à extraire. Les valeurs autorisées sont Stix File [SHA256] [MD5], Domain, Url, IPv4, IPv6.
- Confiance minimale : Saisissez la confiance minimale dans une fourchette de 0 à 100. Seuls les indicateurs dont le degré de confiance est supérieur ou égal au degré de confiance spécifié seront recherchés.
Note
S'il reste vide, il récupérera tous les indicateurs disponibles.
Les étiquettes sont appelées Tags dans Netskope CE. - Indicateurs révoqués : Seuls les indicateurs dont le statut de révocation correspond seront recherchés. Si aucune valeur spécifique n'est choisie, les indicateurs avec tous les statuts révoqués disponibles seront récupérés.
- Étiquettes: Seuls les indicateurs dont les étiquettes correspondent seront recherchés. Ajoutez plusieurs étiquettes séparées par des virgules. Exemple : tag1,tag2,tag3. Gardez le champ libre pour récupérer les indicateurs de tous les Tags.
Note
Les étiquettes sont appelées Tags dans Netskope CE.
- Enable Polling (Activer l'interrogation) : Activer/désactiver les données d'interrogation d'OpenCTI. Désactivez cette option si vous ne souhaitez envoyer que des indicateurs à OpenCTI.
- Activer le balisage : Activer/désactiver la fonctionnalité de marquage.
- Intervalle de rétraction (en jours): Indiquez le nombre de jours pendant lesquels la rétraction de l'IoC doit être exécutée pour les indicateurs OpenCTI.
Note
Ce paramètre ne s'applique qu'à la version 5.1.0 de Netskope CE. ou plus récent, et si la rétraction d'IoC(s) est activée dans les paramètres de Threat Exchange.
- Initial Range (in days) : Nombre de jours pour extraire les données pour l'exécution initiale.
- Cliquez Save.

Ajouter une règle de gestion Threat Exchange pour OpenCTI
Pour partager les indicateurs récupérés de l'OpenCTI vers le Netskope CE et vice versa, vous devrez disposer d'une règle de gestion qui filtrera les indicateurs que vous souhaitez partager. Pour configurer une règle de gestion, suivez les étapes ci-dessous :
- Allez à Threat Exchange > Business Rule et cliquez sur Create New Rule.
- Ajoutez le filtre en fonction de vos besoins dans la règle, puis cliquez sur Enregistrer.

Configuration du partage de Threat Exchange pour Open CTI
Pour partager les IoCs de Netskope CE vers la plateforme OpenCTI, et vice-versa :
- Allez à Threat Exchange > Sharing et cliquez sur Add Sharing Configuration.
- Select votre configuration source (CTE Netskope), une règle métier, la configuration de destination (CTE OpenCTI) et une cible. Cliquez sur Save et suivez ces mêmes étapes en sens inverse pour partager les IoC d'OpenCTI avec Netskope. Select votre configuration source comme CTE OpenCTI, une règle métier, la configuration de destination (CTE Netskope) et une cible.

- Entrez ces valeurs :
- Nom de l'indicateur : Nom des indicateurs à envoyer à OpenCTI.
- Score : Ce score est mis à jour en fonction de la règle de décroissance appliquée à cet indicateur.
- Cliquez sur Save.

Valider le plugin Open CTI
Valider le retrait
Dans Threat Exchange, les données extraites seront répertoriées sur la page Threat IoCs. Vous pouvez filtrer les IoCs extraits de la plateforme en utilisant le filtre : sources.source Like "<plugin configuration name>"
Pour vérifier les journaux tirés dans Cloud Exchange, allez sur Logging et recherchez les journaux du plugin CTE OpenCTI.
Pour vérifier les données disponibles pour l'extraction sur OpenCTI, connectez-vous à OpenCTI et allez à Observations > Indicators.
Valider le push
Pour valider le push dans CE, allez dans Logging et filtrez les logs partagés pour le plugin OpenCTI.
>
Sur la plate-forme OpenCTI, allez sur Services > URL Protection > Managed URL, pour vérifier les IOCs partagés sur la plate-forme.
Appliquez un filtre pour l'étiquette comme "Netskope-ce ".
Note
Vous pouvez voir l'étiquette "Netskope ce | Netskope threat exchange " qui est l'étiquette source du COI. Cela indique que l'IOC en question a été extrait du plugin Netskope Threat Exchange dans le Netskope CE.
Validez la rétractation
Vous pouvez filtrer les journaux liés à la rétractation en utilisant le filtre : sources.source Comme<plugin configuration name> « [Rétraction] »
Nous pouvons valider la même chose sur la page des CIO de la menace :
Le plugin OpenCTI prend également en charge la rétractation par poussée, ce qui signifie que les IOC provenant de plugins tiers partagés vers le plugin OpenCTI et qui ont ensuite été marqués comme rétractés dans CE, ces IOC seront automatiquement supprimés de la plateforme OpenCTI via la rétraction push. Vous pouvez vérifier cela en observant le champ Résultat de rétraction qui indique «<plugin configuration name>: rétracté ».
Lorsque les IOC partagés d’OpenCTI vers un tiers sont supprimés de cette plateforme, ils seront marqués comme « <plugin-config-name>: retracted » dans le résultat de la rétractation. S’ils ne sont pas supprimés du tiers, le résultat de rétractation sera en attente, sinon il sera rétracté.
Les IOC extraits d'OpenCTI ont été partagés avec une liste d'URL "CTE Demo" sur le Netskope Tenant.
Si l'un des IOC partagés est marqué comme rétracté dans CE, il sera également supprimé du locataire Netskope. Ici, vous pouvez voir que les COI qui ont été marqués Retracted "Yes" dans la capture d'écran de rétractation, ont également été supprimés de la liste des URL sur le locataire de Netskope.
Dépannage
Impossible de configurer le plugin OpenCTI
Elle peut être due à l'une des causes suivantes :
- URL de base invalide
- Inavalid API key
What to do: Identifiez la cause première et suivez la procédure pour le problème spécifié.
URL de base invalide
Reportez-vous à la section Connectivité avec les hôtes suivants et assurez-vous que votre instance OpenCTI fonctionne correctement.
Inavalid API key
Reportez-vous à la section Configuration de la plateforme OpenCTI pour obtenir la clé API valide pour votre instance OpenCTI.
Impossible d'extraire des IOC de la plate-forme OpenCTI
Après la configuration du plugin, si les IOC ne sont pas extraits de la plate-forme, cela peut être dû à l'une des raisons suivantes.
- Aucun CIO n'est disponible sur la plateforme pour tirer
What to do: Vérifiez si les IOC sont disponibles sur la plateforme pour les extraire.
Comportement connu
- Lors de l'envoi des indicateurs sur OpenCTI à partir de Netskope CE, il existe deux scénarios dans lesquels l'API ne créera ni ne mettra à jour les indicateurs.
- If the Indicator Already Exists:
- Si un indicateur est envoyé à OpenCTI et qu'il existe déjà avec une adresse lower confidence value différente de celle de l'indicateur existant, l'API will not update the indicator. L'indicateur restera inchangé, comme la logique interne d'OpenCTI.
- If the Older Indicator is Revoked:
- Si l'ancienne version d'un indicateur a été revoked, l'API sera également not update or create a new version pour cet indicateur. Il considérera l'indicateur révoqué comme inactif et ne procédera à aucune modification.
- Lors de la suppression d'un indicateur sur OpenCTI, si l'indicateur est retiré de Netskope CE, la tâche d'arrière-plan de suppression sera déclenchée. Cette tâche peut être suivie via l'URL suivante : http://{base_url}/dashboard/données/processing/tasks.
- Toutefois, si cette tâche d'arrière-plan échoue sur OpenCTI en raison d'un problème quelconque (par exemple, connectivité, erreurs de traitement), la suppression de l'indicateur ne sera pas effectuée avec succès. Par conséquent, les indicateurs partagés par Netskope CE seront toujours marqués comme étant rétractés, et le plugin OpenCTI ne sera pas en mesure de suivre l'échec de la tâche d'arrière-plan. Par conséquent, l'état rétracté de l'indicateur persistera dans Netskope CE malgré l'échec du traitement de la tâche OpenCTI.

