Principes fondamentaux de GUI Application Framework

Les applications QRadar GUI Application Framework sont des applications Web autonomes qui s'exécutent sur la micro-infrastructure Flask, et sont diffusées à partir du serveur Web Flask.

Présentation de l'installation

Chaque application s'exécute dans son propre serveur Flask. Chaque serveur Flask à son tour s'exécute dans un conteneur Linux® sécurisé. Docker est la pile d'implémentation pour le confinement sécurisé du codebase de l'application Flask.

Chaque application est installée à l'aide des noeuds finaux de l'API RESTful. Le noeud final d'installation gère les tâches suivantes :

  • Valide le manifeste de l'application.
  • Crée automatiquement une image Docker (asynchrone) avec le code de d'application intégré.
  • Enregistre l'application (asynchrone) auprès de QRadar afin d'activer un proxy de trafic Web et le cycle de vie demande-réponse HTTP depuis QRadar vers l'application.
  • Exécute automatiquement un conteneur Docker à partir de l'image Docker (asynchrone), liée à un conteneur secondaire de données uniquement utilisé pour le stockage permanent.

Noeuds finaux d'API RESTful QRadar

L'interface clé entre la gestion du cycle de vie d'une application, lors de ses phases de création et d'exécution, est constituée des noeuds finaux de l'API REST de QRadar GUI App Framework.

Le tableau suivant décrit les noeuds finaux de l'API RESTful de QRadar.

Tableau 1. Noeuds finaux de l'API REST GUI Application Framework
Noeud final Paramètres Description
GET /gui_app_framework/application_creation_task ID d'application Extrait une liste de détails de statut pour toutes les demandes asynchrones pour créer des applications.
GET /gui_app_framework/application_creation_task/{application_id} ID d'application Extrait une liste de détails de statut pour une demande asynchrone pour créer des applications.
POST /gui_app_framework/application_creation_task Fichier bundle (.zip) d'application Crée une application dans l'infrastructure d'application et l'enregistre dans QRadar. L'application est créée de manière asynchrone. Une référence à l'application_id est renvoyée et doit être utilisée dans les appels API ultérieurs pour déterminer le statut de l'installation de l'application.
POST /gui_app_framework/application_creation_task/{application_id} ID application, statut annulation Met à jour une nouvelle installation d'application dans l'infrastructure d'application. Les paramètres application_id et status sont requis.
GET /gui_app_framework/applications   Extrait une liste d'applications installées sur la console QRadar ainsi que la structure et le statut JSON du manifeste.
GET /gui_app_framework/applications/{application_id} ID d'application Extrait une application spécifique qui est installée sur la console ainsi que la structure et le statut JSON du manifeste.
POST /gui_app_framework/applications/{application_id} ID application, statut démarrage/arrêt Met à jour une application. Démarre ou arrête une application en définissant le statut sur RUNNING ou STOPPED respectivement.
PUT /gui_app_framework/applications/{application_id} ID d'application Met à niveau une application.
DELETE /gui_app_framework/applications/{application_id} ID d'application Supprime une application.
GET /gui_app_framework/named_services   Extrait une liste de tous les services nommés enregistrés auprès d'Application Framework.
GET /gui_app_framework/named_services/{uuid} uuid Extrait un service nommé enregistré auprès d'Application Framework grâce à l'identificateur unique universel (UUID) fourni.

Python

Python est le principal langage Web utilisé pour créer une application et l'infrastructure Flask est intégrée et disponible pour son utilisation par l'application.

Pour plus d'informations, rendez-vous sur le site Python (https://www.python.org/doc/).

Flask

Flask est une micro-infrastructure d'application Web qui est écrite en Python.

Flask est le serveur Web à partir duquel les noeuds finaux codés par l'application sont diffusés. Vous utilisez les fonctions Python pour fournir des cas d'utilisation. Vous pouvez utiliser des annotations de route pour chaque méthode Python dans l'application Flask. Une fois le serveur Web Flask démarré, les requêtes HTTP/HTTPS sont traitées par Flask pour cette route et les fonctions Python sont exécutées.

Chaque serveur Flask qui s'exécute à partir du conteneur Docker utilise le port 5000. En dehors du conteneur, Docker mappe le port interne 5000 vers le prochain port libre de la gamme éphémère allant de 32768 à 60999. Pendant la phase d'enregistrement, ce port mappé vers l'extérieur est stocké par QRadar afin que les requêtes Web d'une application, via QRadar, soient transmises au conteneur correct.

Le code suivant est un exemple de route Python :

@app.route('/')
def hello_world():
    return 'Hello World!'

Dans un serveur Web Flask autonome, une requête Web via un navigateur vers http://localhost:5000 renvoie : Hello World!

Le tableau suivant décrit la version spécifique de Flask et ses dépendances :

Modules Version Description
Flask 0.10.1 Micro-infrastructure ou micro-infrastructure d'application Web
itsdangerous 0.24 Package d'utilitaires pour la signature et le chiffrement des données
jinja2 2.7.3 Moteur de modèles pour python
markupsafe 0.23 Bibliothèque d'échappement Unicode utilisée avec Jinja2
Werkzeug 0.96 Bibliothèque d'utilitaires WSGI (Web Server Gateway Interface) pour Python

Pour plus d'informations, consultez le site Web Flask (http://flask.pocoo.org/).

Jinja2

Jinja2 est une bibliothèque Python qui vous permet de créer des modèles pour différents formats de sortie à partir d'un fichier texte de modèle de base. Le format HTML est utilisé pour les applications QRadar. Jinja2 dispose d'une API riche et d'un grand nombre de directives syntaxiques (instructions, expressions, variables, balises) que vous utilisez pour injecter dynamiquement du contenu dans le fichier modèle.

La méthode intégrée render_template() de Flask est la manière la plus simple d'injecter des données à partir d'une méthode Python, diffusée par la route, dans un modèle HTML Jinja2, comme indiqué dans l'exemple suivant.

@app.route('/')
def hello_world():
    return render_template('hello.html', title='QRadar')

Le modèle hello.html contient le code suivant :

<!doctype html>
<title>Hello from Flask</title>
  <h1>Hello {{ title }}!</h1>

La sortie HTML suivante est générée :

<!doctype html>
<title>Hello from Flask</title>
  <h1>Hello QRadar!</h1>

Pour plus d'informations, consultez le site Web Jinja2 (http://jinja.pocoo.org/docs/dev/).

Cycle de vie de requêtes et réponses HTTP

Lorsqu'une application est correctement installée, les demandes vers l'application ne sont transmise qu'à l'aide d'une connexion établie vers QRadar. L'application n'est pas directement accessible à l'aide de requêtes d'URL directes ou de toute autre méthode.

Les applications peuvent établir une session authentifiée et autorisée sécurisée pour QRadar. Tous les jetons d'autorisation créés pour vérifier l'intégrité de la session peuvent être réutilisés. L'application obtient toutes les catégories de fonctions, de sécurité et d'authenticité de QRadar. L'application peut utiliser l'état de la session utilisateur pour accéder à tous les noeuds finaux de l'API RESTful de QRadar pour extraire ou envoyer des données sur le système QRadar.

Applications conteneurisées et réseau

Avec GUI Application Framework, le trafic s'écoule d'un conteneur vers un autre, d'un conteneur vers l'hôte sur son adresse IP publique (et non sur l'hôte local), et des conteneurs vers le monde extérieur.

Lorsque chaque application est transmise en tant qu'archive (fichier .zip) de code source vers les noeuds finaux QRadar, QRadar construit l'image initiale spécifique à votre codebase d'application. Chaque image fonctionne comme un conteneur individuel. Lorsque le conteneur est exécuté ou démarré, QRadar mappe le port du serveur Flask interne (5000) vers un port éphémère externe. Ce port éphémère externe est enregistré sur QRadar afin que les requêtes transmises vers votre code d'application soient acheminées vers le conteneur approprié.

Noeuds finaux /debug

Toutes les applications doivent inclure une route ou un noeud final /debug qui s'exécute localement sur le port 5000.Si vous utilisez la structure Flask par défaut, ce point de terminaison est automatiquement inclus dans votre fichier _init_.py racine. Ce noeud final permet de s'assurer que les applications en ligne sont actives et accessibles.

Si vous désactivez l'instance Flask par défaut afin d'autoriser l'application à utiliser son propre serveur Web, vous devez inclure un noeud final /debug sur le port 5000. Si vous n'incluez pas le noeud final, votre application redémarrera une fois par minute car QRadar ne peut pas recevoir de réponse de l'application.