Guide pratique sur la limitation de la bande passante dans QRadar

Le gestionnaire de bande passante dans IBM® QRadar tire parti de la discipline de mise en file d'attente HTB (Hierarchical Token Bucket) proposée dans le noyau Linux . Pour les cas plus spécifiques ou les utilisations plus avancées, il existe de nombreuses pages sur Internet qui décrivent ce qu'elle est et comment elle fonctionne, notamment :

Remarque: Cet article de blogue technique est As-is et n'a pas été soumis à un contrôle supplémentaire.

Avant de commencer, vous devez personnaliser le fichier bandwidthManagerCLI.sh afin de changer l'emplacement de buildcpath. Pour éditer le fichier bandwidthManagerCLI.sh , entrez edit /opt/qradar/bin/bandwidthManagerCLI.sh. Changez la troisième ligne du fichier pour qu'elle devienne /opt/qradar/systemd/bin/buildcpath. Sauvegardez le fichier et fermez-le.

Aide et syntaxe du gestionnaire de bande passante

Le fragment de code montre la syntaxe du gestionnaire de bande passante :

[root@m5arch06 ~]# /opt/qradar/bin/bandwidthManagerCLI.sh
usage: BandwidthManagerCLI -a <ACTION>
          -a,--action The desired action. Recognized Actions: help, add_class, add_egress_filter,
                      delete_class, delete_egress_filter
usage: add_class <OPTIONS>
          -i,--hostID    The managed host ID which uniquely identifies the host. You can optionally
                         use '-1' to indicate you wish this to be applied to all hosts in the deployment
          -n,--name      A user-friendly name for the new configuration
          -c,--classID   The desired class ID of the class to be added
          -d,--device    The device name (e.g. eth0) which this configuration will apply to. You can
                         optionally use '*' to indicate you wish to be applied to all devices
          -h,--hostname  The managed host host name. Can be used when you don't provide the host ID
          -k,--kbpsLimit The rate limit to be applied against the class in kilobytes/sec
          -p,--parentID  The parent ID for this class
          -q,--qdiscID   The desired queuing discipline ID of the egress filter to be added
usage: add_egress_filter <OPTIONS>
          -i,--hostID           The managed host ID which uniquely identifies the host. You can
                                optionally use '-1' to indicate you wish this to be applied to all hosts in the deployment
          -n,--name             A user-friendly name for the new configuration
          -P,--protocol         The protocol for the new configuration
          -d,--device           The device name (e.g. eth0) which this configuration will apply to.
                                You can optionally use '*' to indicate you wish to be applied to all devices
          -dc,--dstCIDR         [Optional] The destination CIDR for the egress filter
          -dport,--dstPort      [Optional] The destination port for the egress filter
          -dportm,--dstPortMask [Optional] The destination port mask for the egress filter. If not
                                provided, 0xffff will be used (meaning match only that port)
          -f,--filterID         The desired filter ID to be assigned to the new egress filter
          -fl,--flowID          The filter's target flow ID (which represents the minor ID of a
                                class or qdisc). Traffic matched by this filter with go to that location
          -fp,--filterPriority  The fitler's priority relative to others attached to the same parent
                                (lower number is higher priority)
          -h,--hostname         The managed host host name. Can be used when you don't provide the
                                host ID
          -ma,--matchAll        [Optional] If "true", the filter that is created will match *all*
                                incoming packets at its priority level.
          -p,--parentID         The parent ID for this egress filter
          -q,--qdiscID          The desired queuing discipline ID of the egress filter to be added
          -sc,--sourceCIDR      [Optional] The source CIDR for the egress filter
          -sport,--srcPort      [Optional] The source port for the egress filter
          -sportm,--srcPortMask [Optional] The source port mask for the egress filter. If not
                                provided, 0xffff will be used (meaning match only that port)
usage: delete_class <OPTIONS>
          -i,--hostID   The managed host ID which uniquely identifies the host. You can optionally
                        use '-1' to indicate you wish this to be applied to all hosts in the deployment
          -c,--classID  The class ID to class to delete
          -d,--device   The device name (e.g. eth0) of the configuration to be deleted
          -h,--hostname The managed host host name. Can be used when you don't provide the host ID
          -q,--qdiscID  The queuing discipline ID of the class you wish to delete
usage: delete_egress_filter <OPTIONS>
          -i,--hostID   The managed host ID which uniquely identifies the host. You can optionally
                        use '-1' to indicate you wish this to be applied to all hosts in the deployment
          -d,--device   The device name (e.g. eth0) of the configuration to be deleted
          -f,--filterID The filter ID of the filter to delete
          -h,--hostname The managed host host name. Can be used when you don't provide the host ID
[root@m5arch06 ~]#

Terminologie

Cette discipline de mise en file d'attente, ou HTB, vous permet de définir les propriétés des jetons et du compartiment (bucket) utilisés. (Nous n'avons pas à nous soucier de ce mécanisme.)
Classes

Définissez les blocs de bande passante - minimums et maximums. Ils sont organisés dans une structure en arbre. Par exemple, vous disposez d'un lien 10 Mbit qui est partagé entre QRadar et d'autres applications. Vous voulez vous assurer que QRadar n'utilise jamais plus de 5 Mbit / sec, donc il ne saturera pas le lien. Vous définissez une classe pour tout le trafic limité à 5 Mbit/s, puis vous pouvez subdiviser davantage cette classe de sorte que votre réplication PostgreSQL n'affecte pas les performances de la recherche.

Filtres

Sélectionnez le trafic réseau qui est placé dans chacune de ces classes. Généralement mise en oeuvre par des combinaisons IP/protocole/port, les filtres sont remarquablement souples et permettent une granularité très fine. Pour nos besoins, nous nous en tiendrons aux simples combinaisons IP/protocole/port.

Recettes - Exemples

Toutes les commandes sont exécutées sur la console, inutile de les exécuter sur un hôte géré. Vous indiquez l'hôte auquel appliquer le changement dans la ligne de commande bandwidthManagerCLI.sh.

Exemple : Ralentir la réplication vers un hôte (tout le trafic sur le port 443 - en supposant une liaison non chiffrée)

Dans cet exemple, nous créons une classe dans laquelle nous limitons la bande passante à 10 kbit/s. Ensuite, nous créons des filtres pour les mapper à cette classe. Nous voulons limiter ces filtres spécifiquement au port source 443 (car il s'agit de la console) et à l'IP de destination 192.0.2.0 (l'hôte géré dans ce cas). Le nom d'hôte de la console est m5arch06.
/opt/qradar/bin/bandwidthManagerCLI.sh -a add_class -h m5arch06 -n SlowReplication -c 1 -q 30 -p 0 -k 10 -d eno1
/opt/qradar/bin/bandwidthManagerCLI.sh -a add_egress_filter -h m5arch06 -n MatchHttps -d eno1 -dc 192.0.2.0/32 -f 2 -fl 1 -fp 1 -p 0 -q 30 -sport 443 -P tcp
/opt/qradar/bin/bandwidthManagerCLI.sh -a add_egress_filter -h m5arch06 -n MatchHttps -d eno1 -dc 192.0.2.0/32 -f 3 -fl 3 -fp 1 -p 0 -q 1 -sport 443 -P tcp

Pour tester, nous avons forcé la réplication sur l'hôte géré à demander un vidage de base de données complet et avons abouti aux résultats suivants :
….
  2750K .......... .......... .......... .......... ..........  4% 9.02K 1h45m
  2800K .......... .......... .......... .......... ..........  4% 9.68K 1h45m
  2850K .......... .......... .......... .......... ..........  4% 9.51K 1h45m
  2900K .......... .......... .......... .......... ..........  4% 8.14K 1h45m
  2950K .......... .......... .......... .......... ..........  5% 9.00K 1h45m
  3000K .......... .......... .......... .......... ..........  5% 9.00K 1h45m
  3050K .......... .......... .......... .......... ..........  5% 9.99K 1h44m
…..

Les vitesses sont approximativement (et ne dépassent pas) de 10 ko/s.

Pour tester et voir si la régulation est en place sur la console, regardez la sortie obtenue avec la classe que nous avons créée :

[root@m5arch06 ~]# tc -s class ls dev eno1 classid 30:1
class htb 30:1 root prio 1 rate 80000bit ceil 80000bit burst 1600b cburst 1600b
 Sent 8579563 bytes 7315 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 3p requeues 0
 lended: 4682 borrowed: 0 giants: 0
 tokens: -4730822 ctokens: -4730822

[root@m5arch06 ~]#

Pour supprimer les règles de limitation de bande passante, entrez les commandes suivantes :

/opt/qradar/bin/bandwidthManagerCLI.sh -a delete_egress_filter -h m5arch06 -d eno1 -f 2
/opt/qradar/bin/bandwidthManagerCLI.sh -a delete_egress_filter -h m5arch06 -d eno1 -f 3
/opt/qradar/bin/bandwidthManagerCLI.sh -a delete_class -h m5arch06 -c 1 -q 30 -d eno1
Remarque: Sans supprimer les règles de bande passante, ces filtres et classes resteront persistants entre les réamorces, etc, et QRadar continuera à les respecter sur les correctifs.

Exemple : Limitation de la bande passante entre la console et un hôte géré

Nous allons surveiller la bande passante sur la console et dans la configuration suivante :

  • m5arch06 (198.51.100.0) est la console
  • m5arch07 (192.0.2.0) est l'hôte géré
/opt/qradar/bin/bandwidthManagerCLI.sh -a add_class -h m5arch06 -n SlowCommunicationToHost -c 1 -q 30 -p 0 -k 10 -d eno1

Ajoutez des filtres pour faire correspondre la classe et la discipline de mise en file d'attente en entrant la commande suivante :

/opt/qradar/bin/bandwidthManagerCLI.sh -a add_egress_filter -h m5arch06 -n MatchToIP -d eno1 -dc 192.0.2.0/32 -f 2 -fl 1 -fp 1 -p 0 -q 30 -P tcp
/opt/qradar/bin/bandwidthManagerCLI.sh -a add_egress_filter -h m5arch06 -n MatchToIP -d eno1 -dc 192.0.2.0/32 -f 3 -fl 3 -fp 1 -p 0 -q 1 -P tcp

Si vous souhaitez réguler la bande passante sur l'hôte géré (notez la modification apportée à la hostname à laquelle ces règles s'appliquent et au routage CIDR de destination), entrez la commande suivante:

/opt/qradar/bin/bandwidthManagerCLI.sh -a add_class -h m5arch07 -n SlowCommunicationToHost -c 1 -q 30 -p 0 -k 10 -d eno1
Ajoutez des filtres pour faire correspondre la classe et la discipline de mise en file d'attente en entrant la commande suivante :
/opt/qradar/bin/bandwidthManagerCLI.sh -a add_egress_filter -h m5arch07 -n MatchToIP -d eno1 -dc 198.51.100.0/32 -f 2 -fl 1 -fp 1 -p 0 -q 30 -P tcp
/opt/qradar/bin/bandwidthManagerCLI.sh -a add_egress_filter -h m5arch07 -n MatchToIP -d eno1 -dc 198.51.100.0/32 -f 3 -fl 3 -fp 1 -p 0 -q 1 -P tcp

Enfin, pour supprimer les règles à la fois de la console et de l'hôte géré, entrez la commande suivante :

/opt/qradar/bin/bandwidthManagerCLI.sh -a delete_egress_filter -h m5arch06 -d eno1 -f 2
/opt/qradar/bin/bandwidthManagerCLI.sh -a delete_egress_filter -h m5arch06 -d eno1 -f 3
/opt/qradar/bin/bandwidthManagerCLI.sh -a delete_class -h m5arch06 -c 1 -q 30 -d eno1

/opt/qradar/bin/bandwidthManagerCLI.sh -a delete_egress_filter -h m5arch07 -d eno1 -f 2
/opt/qradar/bin/bandwidthManagerCLI.sh -a delete_egress_filter -h m5arch07 -d eno1 -f 3
/opt/qradar/bin/bandwidthManagerCLI.sh -a delete_class -h m5arch07 -c 1 -q 30 -d eno1

Exemple : Ajout des changements via SQL et sollicitation de Mbeans afin que faire entrer les changements en vigueur (un peu plus rapide et plus scriptable)

Cet exemple utilise la même configuration que dans le premier exemple, mais nous l'insérons dans PostgreSQL au lieu d'attendre que le gestionnaire de bande passante initialise les frameworks et fasse tout ce travail pour nous.

Deux tables sont pertinentes pour la configuration du gestionnaire de bande passante :
  • La table bandwidth_configuration contient toutes les informations de classe / bande passante :
    qradar=# \d bandwidth_configuration
    Table "public.bandwidth_configuration"
         Column     |          Type          |                             Modifiers                             
    ----------------+------------------------+------------------------------------------------------------
     sequenceid     | bigint                 | not null default nextval('bandwidth_configuration_seq'::regclass)
     appname        | character varying(100) | not null
     mh_id          | bigint                 | not null
     device         | character varying(100) | not null
     qdisc_id       | integer                | not null
     class_id       | integer                | not null
     parent_id      | integer                | not null
     bandwidth_kbps | bigint                 | not null
     created_by     | character varying(100) |
    
  • Le filtre bandwidth_egress_filter contient tous les filtres :
    qradar=# \d bandwidth_egress_filter
    Table "public.bandwidth_egress_filter"
         Column      |          Type          |                             Modifiers                             
    -----------------+------------------------+-----------------------------------------------------------
     sequenceid      | bigint                 | not null default nextval('bandwidth_egress_filter_seq'::regclass)
     appname         | character varying(100) | not null
     mh_id           | bigint                 | not null
     device          | character varying(100) | not null
     qdisc_id        | integer                | not null
     parent_id       | integer                | not null
     filter_id       | integer                | not null
     flow_id         | integer                | not null
     filter_priority | integer                | not null
     src_port        | integer                |
     src_port_mask   | integer                |
     src_cidr        | character varying(45)  |
     dst_port        | integer                |
     dst_port_mask   | integer                |
     dst_cidr        | character varying(45)  |
     match_all       | boolean                | not null default false
     created_by      | character varying(100) |
     protocol        | character varying(4)   |
    

En utilisant la configuration de l'exemple 1, nous obtenons un SQL qui ressemble au fragment suivant :

INSERT INTO bandwidth_configuration (appname, mh_id, device, qdisc_id, class_id, parent_id, bandwidth_kbps, created_by) VALUES ('SlowReplication', 53, 'eno1', 30, 1, 0, 10, 'SQL_Insert');
INSERT INTO bandwidth_egress_filter (appname, mh_id, device, qdisc_id, parent_id, filter_id, flow_id, filter_priority, src_port, src_port_mask, dst_cidr, created_by, protocol) VALUES ('MatchHttps', 53, 'eno1', 30, 0, 2, 1, 1, 443, 65535, '192.0.2.0/32', 'SQL_Insert', 'ip');
INSERT INTO bandwidth_egress_filter (appname, mh_id, device, qdisc_id, parent_id, filter_id, flow_id, filter_priority, src_port, src_port_mask, dst_cidr, created_by, protocol) VALUES ('MatchHttps', 53, 'eno1', 1, 0, 3, 3, 1, 443, 65535, '192.0.2.0/32', 'SQL_Insert', 'ip');

Maintenant, nous sollicitons le Mbean et rafraichissons sa configuration :

[root@m5arch06 ~]# /opt/qradar/support/jmx.sh 7778 'com.q1labs.hostcontext.bm:application=hostcontext.hostcontext,type=BandwidthManager' reloadConfig

Invoking operation: reloadConfig ( )
Result: true

[root@m5arch06 ~]#

Et voilà ! La classe est de retour :

[root@m5arch06 ~]# tc class ls dev eno1
class prio 1:1 parent 1: leaf 10:
class prio 1:2 parent 1: leaf 20:
class prio 1:3 parent 1: leaf 30:
class prio 1:4 parent 1: leaf 40:
class prio 1:5 parent 1: leaf 50:
class prio 1:6 parent 1: leaf 60:
class prio 1:7 parent 1: leaf 70:
class htb 30:1 root prio 1 rate 80000bit ceil 80000bit burst 1600b cburst 1600b
[root@m5arch06 ~]#

Ensuite, nous supprimons les entrées de la base de données et rechargeons la configuration :

[root@m5arch06 ~]# psql -U qradar -c "DELETE from bandwidth_configuration"
DELETE 1
[root@m5arch06 ~]# psql -U qradar -c "DELETE from bandwidth_egress_filter"
DELETE 2
[root@m5arch06 ~]# /opt/qradar/support/jmx.sh 7778 'com.q1labs.hostcontext.bm:application=hostcontext.hostcontext,type=BandwidthManager' reloadConfig

Invoking operation: reloadConfig ( )
Result: true

[root@m5arch06 ~]#

Et voilà ! La classe disparaît à nouveau :

[root@m5arch06 ~]# tc class ls dev eno1
class prio 1:1 parent 1: leaf 10:
class prio 1:2 parent 1: leaf 20:
class prio 1:3 parent 1: leaf 30:
class prio 1:4 parent 1: leaf 40:
class prio 1:5 parent 1: leaf 50:
class prio 1:6 parent 1: leaf 60:
class prio 1:7 parent 1: leaf 70:
[root@m5arch06 ~]#