Cover Image

Utilisation de Pulse

Dans cet article nous allons parler de l’extension Pulse sur QRadar. Cette extension permet de manipuler les données pour les afficher sous différentes formes. Elle peut également interagir avec différentes sources comme l’API QRadar, des recherches AQL ou encore des scripts.

  1. Introduction
  2. Installation de Pulse
  3. Présentation de l’extension
  4. Bases de Pulse
  5. Exemples d’utilisation
  6. Conclusion
  7. Bibliographie
  8. Annexes

Version anglaise en cours de rédaction ✍️

2. Installation de Pulse

Avant toutes choses il faut effectuer l’installation de l’extension. Comme toutes les extensions cela passe par le portail de l’IBM App Exchange (il vous faut un compte IBM bien évidemment). Vous retrouverez l’application à ce lien : Pulse App.

Ensuite, il faut installer l’extension via "Admin>Extensions Management" ou directement avec le lien suivant : https://<instance QRadar>/console/do/qradar/extensionsManagementConsole. Sur cette page vous faites :

  • "Add"
  • "Browse" dans le popup qui apparaît
  • Sélectionner le fichier "QRadarPulse<version>.zip" qui est sur votre ordinateur
  • "Ouvrir"
  • Cocher "Install immediately" puis "Add"
  • Valider l’installation des différents composants
  • Se déconnecter ou reconnecter de l’application QRadar ou rafraîchir le cache de votre navigateur pour que l’application apparaisse

Après cela, l’extension est pleinement opérationnelle comme nous allons le voir dans la partie suivante en regardant ce qui la compose.

3. Présentation de l’extension

L’extension Pulse va vous permettre de manipuler les données récoltées dans QRadar, peu importe la manière, pour les afficher sous forme de graphiques, tableaux ou autres représentations visuelles.

Pulse va donner vie à vos données pour identifier des dysfonctionnements de votre système plus facilement mais également comprendre d’un seul coup d’œil les tentatives d’attaques sur le périmètre supervisé.

4. Bases de Pulse

a. Création de dashboard/widget

Avant de pouvoir créer nos premiers visuels, il va vous falloir une base de travail, un peu comme un grand tableau blanc pour y mettre tous vos beaux graphiques. Nous allons l’appeler "Dashboard" et pour en créer un, faites comme ceci :

puis "Blank Dashboard". Ensuite, vous choisissez un nom (élément obligatoire) à votre dashboard ainsi qu’une description si vous souhaitez comme dans l’image ci-dessous et vous cliquez sur "Next".

Dans le dernier menu, ne choisissez aucun widget en faisant "Create". Vous obtiendrez donc un dashboard similaire à celui-ci :

Maintenant que votre base de travail est prête nous allons voir comme rajouter un "widget". Pour cela cliquez sur la roue crantée comme sur la capture :

Dans le nouveau menu sélectionnez le widget que vous souhaitez en cliquant dessus comme ceci :

Assurez vous que le widget est bien coché et en surbrillance bleue puis cliquez sur "Save" et le widget va apparaître sur votre dashboard.

b. Utilisation de l’AQL

Maintenant que vous savez créer un dashboard, vous allez voir comment utiliser les différentes sources de données. Dans un premier temps nous verrons l’AQL. Pour cela rien de plus simple, il vous faut rajouter un widget comme vu plus haut et choisir "Create new widget". Vous allez être renvoyé vers cet écran :

  1. Choisissez un nom à votre widget
  2. Choisissez une description si vous le souhaitez
  3. Changez le type de source de données pour "AQL"
  4. Copiez votre recherche AQL dans l’encart
  5. Changez le nombre de résultats maximum que vous souhaitez (Attention, pour les grosses instances ou les recherches trop larges il est conseillé de mettre une limite pour éviter les recherches prenant trop de temps)
  6. Modifiez la fréquence d’exécution de votre recherche et donc de rafraîchissement des données de votre widget
  7. Lancez la recherche

Les résultats de votre recherche vont apparaître dans l’encadré bleu comme sur la capture. Au préalable, je vous conseille fortement de tester votre recherche via l’onglet "Log Activity" pour faire des ajustements.

c. Utilisation de l’API

Dans un deuxième, nous allons voir qu’il est également faisable d’aller rechercher des données via l’API. Pour ce faire, procédez de la même manière que pour l’AQL mais dans la source de données choisissez "Generic API" comme ceci :

  1. Choisissez "Generic API"
  2. Copiez votre endpoint API

Comme pour la recherche AQL, pour l’endpoint API je vous conseille de tester cela dans le "Security Intelligence API" accessible à l’adresse suivante : "https://<ma console QRadar>/api_doc". Par exemple, pour l’exemple plus voici les tests que j’ai faits :

  1. J’ai choisi l’endpoint que je souhaitais : "log_sources"
  2. J’ai choisi la méthode : "GET"
  3. J’ai appliqué mes filtres de colonnes pour n’avoir que les informations essentielles, je vous conseille de toujours lancer une première fois avec toutes les colonnes pour voir les informations récupérables
  4. J’ai filtré les résultats pour ne pas avoir les log sources internes à QRadar ni les log sources désactivées
  5. J’ai lancé la requête avec le bouton "Try It Out"

J’obtiens le résultat de ma requête dans l’encadré de réponse. Si cela me convient, je peux alors copier la requête encadrée en bleu que je vais pouvoir coller dans la configuration du widget dans l’application Pulse.

d. Représentation des données

Avant d’avancer à la partie exemple, il ne nous reste plus que l’affichage à voir. Nous avons vu comment récupérer les données, il nous faut maintenant les afficher. Pour vous expliquer cela, reprenons les tests faits dans la partie précédente avec la requête API. Dans l’application Pulse puis création de widget, descendez dans la page de configuration et vous allez voir la partie "Views". Pour une seule et même requête vous pouvez avoir plusieurs views pour différents affichages pour différents usages.

Vous voyez que dans ma capture, j’ai choisi de créer 3 views différentes en modifiant le paramètre "View Name" pour chacune d’entre elle. Pour pouvoir en créer il faut utiliser le bouton "New View +" et vous pouvez à tout moment supprimer une view en la sélectionnant et en cliquant sur "Delete View".

Ensuite, nous allons choisir le type de visuel en déroulant le menu "Chart Type". Vous trouverez les options suivantes :

  • Time Series Chart → Graphique avec a minima 2 séries de données en abscisse et en ordonnée
  • Geographic Chart → Grapique se basant sur la géographie des données pour les afficher sur une carte
  • Big Number Chart → Affichage d’un nombre/donnée
  • Bar Chart → Histogramme
  • Tabular Display → Tableau
  • Pie Chart → Graphique communément appelé "camembert"
  • Scatter Chart → Nuage de points

Dans mon cas, la meilleure visualisation est un tableau, je choisis donc "Tabular Display". Je vais également modifier l’affichage pour n’avoir que l’ID et le nom de ma log source comme ceci :

  1. Choisissez "Selected Column(s)" pour spécifier les colonnes souhaitées
  2. Ajoutez les colonnes voulues en cliquant sur "Add Column +" pour chaque colonne

Vous pouvez ensuite faire "Save" et votre nouveau widget va apparaître dans la liste de ceux de votre dashboard comme ceci :

Vous n’avez plus qu’à cliquez sur "Save" et votre nouveau widget va apparaître.

5. Exemples d’utilisation

a. Supervision des log sources

Dans l’exemple que je vais vous présenter, l’idée est de pouvoir avoir d’un coup d’œil un aperçu des log sources de votre supervision. Voici le rendu final :

Si on fait le tour des widgets on a :

  1. Le nombre de log sources ayant envoyé des logs lors des X dernières minutes
  2. Le nombre de log sources créées lors des X derniers jours
  3. Le nombre de log sources créées manuellement lors des X derniers jours
  4. Le nombre de log sources créées automatiquement lors des X derniers jours
  5. Le nombre de log sources supprimées lors des X derniers jours
  6. Un tableau récapitulatif des log sources non internes à QRadar avec les éléments suivants :
    • id de la log source
    • nom de la log source
    • IP envoyant les logs (peut être vide en fonction des protocoles de collecte)
    • le nombre d’EPS (Event per minutes) moyen
    • le statut de la log source

Vous pouvez voir également encadré en rouge dans la capture une partie paramètre. En effet, c’est ce qui fait la force de Pulse c’est que vous pouvez très facilement interagir avec vos visuels par le biais de paramètres. Par exemple pour le widget 1, la recherche AQL est la suivante :

select UNIQUECOUNT(logsourceid) from events where LOGSOURCENAME(logsourceid) NOT ILIKE '%SIM Audit%' AND LOGSOURCENAME(logsourceid) NOT ILIKE '%Health Metrics%' AND LOGSOURCENAME(logsourceid) NOT ILIKE '%System Notification%' AND LOGSOURCENAME(logsourceid) NOT ILIKE '%Custom Rule Engine%' last {last_X_minutes} minutes

On remarque le paramètre écrit entre accolades, c’est le formalisme pour utiliser des variables. Si vous souhaitez créer votre propre variable, utilisez ce formalisme puis exécutez la recherche, vous devriez avoir la fenêtre suivante qui va apparaître :

Vous devez mettre une valeur à cette variable (dans l’encadré rouge) pour que la recherche puisse s’exécuter correctement puis vous pouvez, si vous le voulez, définir cette valeur comme valeur par défaut pour cette variable.

Je ne vais pas faire le tour de tous les widgets pour vous expliquer comment ils sont construits car cela pourrait être long, mais je vous mets en annexe le fichier JSON à importer si vous souhaitez avoir le même dashboard. Vous n’aurez plus qu’à l’importer en suivant la procédure dans la partie 4.a puis en faisant "Import Existing" et en choisissant le fichier JSON. Vous pourrez ensuite jouer avec les paramètres et configuration de ce dashboard pour comprendre comment il fonctionne et comment vous pouvez l’améliorer pour qu’il corresponde au mieux à vos besoins.

6. Conclusion

Ainsi se conclut cet article autour de l’application Pulse, ce n’est très certainement pas le dernier à ce sujet étant donné les possibilités qu’offrent cette application.

N’hésitez pas à me faire un retour sur d’éventuelles améliorations du dashboard que je vous ai montré mais également des idées de dashboard qu’il serait intéressant d’avoir.

7. Bibliographie

8. Annexes

dashboard.json :

Pensez à changer les "<QRADAR_FQDN_OR_IP>" avec l’IP ou le FQDN de votre instance QRadar.

{
  "json_schema_version": "1.3",
  "app_version": "2.2.5",
  "qradar_version": "2019.14.0.20191031163225",
  "exported_at": 1673805572889,
  "parameters": {
    "list": [
      {
        "name": "last_X_minutes",
        "value": "30"
      },
      {
        "name": "last_X_days",
        "value": "5"
      }
    ]
  },
  "items": {
    "list": [
      {
        "id": "36",
        "uuid": "b0568673-3fe9-4456-ab49-946f71968f89",
        "name": "Log sources",
        "description": "Tableau récapitulatif des log sources non internes",
        "view_definitions": {
          "list": [
            {
              "id": "43",
              "name": "Log sources",
              "params": {
                "series": [
                  {
                    "querydata": {
                      "yAxis": "id"
                    },
                    "type": "tabular",
                    "name": "id"
                  },
                  {
                    "querydata": {
                      "yAxis": "name"
                    },
                    "type": "tabular",
                    "name": "Log Source"
                  },
                  {
                    "querydata": {
                      "yAxis": "sending_ip"
                    },
                    "type": "tabular",
                    "name": "IP"
                  },
                  {
                    "querydata": {
                      "yAxis": "average_eps"
                    },
                    "type": "tabular",
                    "name": "EPS"
                  },
                  {
                    "querydata": {
                      "yAxis": "status"
                    },
                    "type": "tabular",
                    "name": "status"
                  }
                ],
                "plotlyLayout": {},
                "type": "tabular",
                "thresholds": {
                  "color": {}
                },
                "showAllColumns": false,
                "maxItems": "10",
                "tableSize": "default",
                "columnsAlignment": "left",
                "showTitle": true,
                "showStatus": true
              },
              "localization_key": null
            }
          ]
        },
        "datasource": {
          "type": "generic"
        },
        "query": {
          "url": "https://<QRADAR_FQDN_OR_IP>/api/config/event_sources/log_source_management/log_sources?fields=status(status)%2Cid%2Cname%2Csending_ip%2Clast_event_time%2Caverage_eps&filter=internal%20%3C%3E%20true&sort=-status(status)",
          "filter": "",
          "sort": "",
          "resultsMapping": "",
          "overrideTitle": false,
          "titleMapping": "",
          "resultsLimit": 0
        },
        "localization_key": null
      },
      {
        "id": "34",
        "uuid": "ff68c290-14ac-4b97-a2c8-15ccafb1a840",
        "name": "Log sources créées manuellement (last_X_days)",
        "description": "Nouvelles log sources créées manuellement sur le périmètre de supervision.",
        "view_definitions": {
          "list": [
            {
              "id": "41",
              "name": "Log sources créées manuellement (last_X_days)",
              "params": {
                "series": [
                  {
                    "querydata": {
                      "xAxis": "COUNT",
                      "fontSize": "bestfit",
                      "showZeroOnNoData": true
                    },
                    "type": "bignumber"
                  }
                ],
                "plotlyLayout": {},
                "type": "bignumber",
                "thresholds": {
                  "bgcolor": {
                    "column": "",
                    "levels": [
                      {
                        "threshold": 10,
                        "color": "#dc0000"
                      },
                      {
                        "threshold": 5,
                        "color": "#fdc500"
                      }
                    ],
                    "default": "#00ac46"
                  },
                  "color": {
                    "column": "",
                    "levels": [
                      {
                        "threshold": 0,
                        "color": "#ffffff"
                      }
                    ],
                    "default": "#ffffff"
                  }
                },
                "showTitle": true,
                "showStatus": true
              },
              "localization_key": null
            }
          ]
        },
        "datasource": {
          "type": "aql"
        },
        "query": {
          "queryVal": "select count(*) from events where LOGSOURCETYPENAME(devicetype) = 'SIM Audit' AND qid ='28250053' AND username <> 'configservices' LAST {last_X_days} DAYS",
          "resultsLimit": 0
        },
        "localization_key": null
      },
      {
        "id": "33",
        "uuid": "7bb6c8d8-6e4d-459a-9a0d-6b5a9bc75c92",
        "name": "Log sources créées automatiquement (last_X_days)",
        "description": "Nouvelles log sources créées automatiquement sur le périmètre de supervision.",
        "view_definitions": {
          "list": [
            {
              "id": "40",
              "name": "Log sources créées automatiquement (last_X_days)",
              "params": {
                "series": [
                  {
                    "querydata": {
                      "xAxis": "COUNT",
                      "fontSize": "bestfit",
                      "showZeroOnNoData": true
                    },
                    "type": "bignumber"
                  }
                ],
                "plotlyLayout": {},
                "type": "bignumber",
                "thresholds": {
                  "bgcolor": {
                    "column": "",
                    "levels": [
                      {
                        "threshold": 10,
                        "color": "#dc0000"
                      },
                      {
                        "threshold": 5,
                        "color": "#fdc500"
                      }
                    ],
                    "default": "#00ac46"
                  },
                  "color": {
                    "column": "",
                    "levels": [
                      {
                        "threshold": 0,
                        "color": "#ffffff"
                      }
                    ],
                    "default": "#ffffff"
                  }
                },
                "showTitle": true,
                "showStatus": true
              },
              "localization_key": null
            }
          ]
        },
        "datasource": {
          "type": "aql"
        },
        "query": {
          "queryVal": "select count(*) from events where LOGSOURCETYPENAME(devicetype) = 'SIM Audit' AND qid ='28250053' AND username = 'configservices' LAST {last_X_days} DAYS",
          "resultsLimit": 0
        },
        "localization_key": null
      },
      {
        "id": "31",
        "uuid": "47f30ca0-4f1b-485d-a00a-6f4b9c42f831",
        "name": "Log source communicantes (last_X_minutes)",
        "description": "Log sources envoyant des logs à QRadar.",
        "view_definitions": {
          "list": [
            {
              "id": "38",
              "name": "Log source communicantes (last_X_minutes)",
              "params": {
                "series": [
                  {
                    "querydata": {
                      "xAxis": "UniqueCount_logsourceid",
                      "fontSize": "bestfit",
                      "showZeroOnNoData": true
                    },
                    "type": "bignumber"
                  }
                ],
                "plotlyLayout": {},
                "type": "bignumber",
                "thresholds": {
                  "bgcolor": {
                    "column": "",
                    "levels": [
                      {
                        "threshold": 1,
                        "color": "#00ac46"
                      }
                    ],
                    "default": "#dc0000"
                  },
                  "color": {
                    "column": "",
                    "levels": [
                      {
                        "threshold": 0,
                        "color": "#ffffff"
                      }
                    ],
                    "default": "#ffffff"
                  }
                },
                "showTitle": true,
                "showStatus": true
              },
              "localization_key": null
            }
          ]
        },
        "datasource": {
          "type": "aql"
        },
        "query": {
          "queryVal": "select UNIQUECOUNT(logsourceid) from events where LOGSOURCENAME(logsourceid) NOT ILIKE '%SIM Audit%' AND LOGSOURCENAME(logsourceid) NOT ILIKE '%Health Metrics%' AND LOGSOURCENAME(logsourceid) NOT ILIKE '%System Notification%' AND LOGSOURCENAME(logsourceid) NOT ILIKE '%Custom Rule Engine%' last {last_X_minutes} minutes",
          "resultsLimit": 0
        },
        "localization_key": null
      },
      {
        "id": "32",
        "uuid": "8ffdc023-c058-42e9-bd91-aac2066098bf",
        "name": "Log sources créées (last_X_days)",
        "description": "Nouvelles log sources sur le périmètre de supervision.",
        "view_definitions": {
          "list": [
            {
              "id": "39",
              "name": "Log sources créées (last_X_days)",
              "params": {
                "series": [
                  {
                    "querydata": {
                      "xAxis": "COUNT",
                      "fontSize": "bestfit",
                      "showZeroOnNoData": true
                    },
                    "type": "bignumber"
                  }
                ],
                "plotlyLayout": {},
                "type": "bignumber",
                "thresholds": {
                  "bgcolor": {
                    "column": "",
                    "levels": [
                      {
                        "threshold": 10,
                        "color": "#dc0000"
                      },
                      {
                        "threshold": 5,
                        "color": "#fdc500"
                      }
                    ],
                    "default": "#00ac46"
                  },
                  "color": {
                    "column": "",
                    "levels": [
                      {
                        "threshold": 0,
                        "color": "#ffffff"
                      }
                    ],
                    "default": "#ffffff"
                  }
                },
                "showTitle": true,
                "showStatus": true
              },
              "localization_key": null
            }
          ]
        },
        "datasource": {
          "type": "aql"
        },
        "query": {
          "queryVal": "select count(*) from events where LOGSOURCETYPENAME(devicetype) = 'SIM Audit' AND qid ='28250053' LAST {last_X_days} DAYS",
          "resultsLimit": 0
        },
        "localization_key": null
      },
      {
        "id": "35",
        "uuid": "ba355032-5b08-4de3-b295-455faca0ee50",
        "name": "Log sources supprimées (last_X_days)",
        "description": "Log sources supprimées du périmètre de supervision.",
        "view_definitions": {
          "list": [
            {
              "id": "42",
              "name": "Log sources supprimées (last_X_days)",
              "params": {
                "series": [
                  {
                    "querydata": {
                      "xAxis": "COUNT",
                      "fontSize": "bestfit",
                      "showZeroOnNoData": true
                    },
                    "type": "bignumber"
                  }
                ],
                "plotlyLayout": {},
                "type": "bignumber",
                "thresholds": {
                  "bgcolor": {
                    "column": "",
                    "levels": [
                      {
                        "threshold": 0,
                        "color": "#dc0000"
                      }
                    ],
                    "default": "#dc0000"
                  },
                  "color": {
                    "column": "",
                    "levels": [
                      {
                        "threshold": 0,
                        "color": "#ffffff"
                      }
                    ],
                    "default": "#ffffff"
                  }
                },
                "showTitle": true,
                "showStatus": true
              },
              "localization_key": null
            }
          ]
        },
        "datasource": {
          "type": "aql"
        },
        "query": {
          "queryVal": "select count(*) from events where LOGSOURCETYPENAME(devicetype) = 'SIM Audit' AND qid ='28250054' LAST {last_X_days} DAYS",
          "resultsLimit": 0
        },
        "localization_key": null
      }
    ]
  },
  "dashboards": {
    "list": [
      {
        "id": "7",
        "uuid": "2a2b368a-7609-40fc-add8-5bb16d971277",
        "name": "Log Source Audit",
        "type": 1,
        "app_uuid": null,
        "description": "Dashboard pour auditer la création/suppression de log sources ainsi que l'état des log sources supervisées.",
        "localization_key": null,
        "views": {
          "list": [
            {
              "id": "62",
              "params": {
                "layout": {
                  "w": 14,
                  "h": 5,
                  "x": 0,
                  "y": 10,
                  "i": "62",
                  "moved": false,
                  "static": false
                }
              },
              "type": "regular",
              "view_definition": {
                "id": "43"
              }
            },
            {
              "id": "63",
              "params": {
                "layout": {
                  "w": 3,
                  "h": 4,
                  "x": 4,
                  "y": 6,
                  "i": "63",
                  "moved": false,
                  "static": false
                }
              },
              "type": "regular",
              "view_definition": {
                "id": "41"
              }
            },
            {
              "id": "64",
              "params": {
                "layout": {
                  "w": 3,
                  "h": 4,
                  "x": 7,
                  "y": 6,
                  "i": "64",
                  "moved": false,
                  "static": false
                }
              },
              "type": "regular",
              "view_definition": {
                "id": "40"
              }
            },
            {
              "id": "65",
              "params": {
                "layout": {
                  "w": 4,
                  "h": 8,
                  "x": 0,
                  "y": 2,
                  "i": "65",
                  "moved": false,
                  "static": false
                }
              },
              "type": "regular",
              "view_definition": {
                "id": "38"
              }
            },
            {
              "id": "66",
              "params": {
                "layout": {
                  "w": 6,
                  "h": 4,
                  "x": 4,
                  "y": 2,
                  "i": "66",
                  "moved": false,
                  "static": false
                }
              },
              "type": "regular",
              "view_definition": {
                "id": "39"
              }
            },
            {
              "id": "67",
              "params": {
                "layout": {
                  "w": 4,
                  "h": 8,
                  "x": 10,
                  "y": 2,
                  "i": "67",
                  "moved": false,
                  "static": false
                }
              },
              "type": "regular",
              "view_definition": {
                "id": "42"
              }
            },
            {
              "id": "71",
              "params": {
                "layout": {
                  "w": 14,
                  "h": 2,
                  "x": 0,
                  "y": 0,
                  "i": "71",
                  "moved": false,
                  "static": false
                },
                "display": true
              },
              "type": "parameter_card",
              "view_definition": null
            }
          ]
        }
      }
    ]
  }
}

Merci d’avoir suivi ce petit tuto, en espérant que cela vous ait été utile. N’hésitez pas à me communiquer vos ressentis, tips…etc via le formulaire ci-dessous.

Currently there are no comments, so be the first!