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 :
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
- 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)
/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
….
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
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
/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.
- La table bandwidth_configuration contient toutes les informations de classe / bande passante :
qradar=# \d bandwidth_configurationTable "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_filterTable "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 ~]#