Vérification de la protection par déni de service JSON
La vérification JSON par déni de service (DoS) examine une requête JSON entrante et valide s’il existe des données correspondant aux caractéristiques d’une attaque DoS. Si la requête présentait des violations JSON, l’appliance bloque la demande, consigne les données, envoie une alerte SNMP et affiche également une page d’erreur JSON. Le but de la vérification DoS JSON est d’empêcher un attaquant d’envoyer une requête JSON pour lancer des attaques DoS sur vos applications JSON ou site Web.
Lorsqu’un client envoie une requête à une appliance Citrix ADC, l’analyseur JSON analyse la charge utile de la requête et, si une violation est observée, l’appliance applique des contraintes sur la structure JSON. La contrainte applique une limite de taille sur la requête JSON. Par conséquent, si une violation JSON a été observée, l’appliance applique une action et répond avec la page d’erreur JSON.
Règles DoS JSON
Lorsque l’appliance reçoit une demande JSON, la protection DOS JSON applique la limite de taille aux paramètres DoS suivants dans la charge utile de la requête.
- profondeur maximale : imbrication maximale (profondeur) du document JSON. Cette vérification protège contre les documents dont la hiérarchie est excessive.
- longueur maximale du document : longueur maximale du document JSON.
- longueur maximale du tableau : longueur maximale du tableau dans l’un des objets JSON. Cette vérification protège contre les baies ayant de grandes longueurs.
- longueur de chaîne maximale : longueur de chaîne maximale dans le JSON. Cette vérification protège contre les chaînes de grande longueur.
- Nombre maximum de touches d’objet : Nombre maximum de touches dans l’un des objets JSON. Cette vérification protège contre les objets qui ont un grand nombre de clés.
- longueur maximale de la clé d’objet : longueur maximale de la clé dans l’un des objets JSON. Cette vérification protège contre les objets qui ont de grandes clés.
Voici une liste des règles DoS JSON validées lors de l’analyse JSON.
-
JsonMaxContainerDepth. Cette vérification peut être activée en configurant la vérification JSONMaxContainerDepth et par défaut l’option est OFF.
-
JsonMaxContainerDepth. Cette vérification peut être active/désactivée par l’option configurable JsonMaxContainerDepthCheck et la valeur par défaut peut être modifiée par l’option JsonMaxContainerDepth. Toutefois, vous pouvez faire varier les niveaux maximum à une valeur comprise entre 1 et 127. Valeur par défaut : 5, Valeur minimale : 1, Valeur maximale : 127
-
JSONMaxDocumentLength. Cette vérification peut être activée en configurant la vérification JsonMaxDocumentLength et l’option par défaut est OFF.
-
JSONMaxDocumentLength. Cette vérification peut être activée en configurant la vérification JsonMaxDocumentLength et la longueur par défaut est définie sur 20000000 octets. Valeur minimale : 1, Valeur maximale : 2147483647
-
JSONMaxObjectKeyCount. La règle valide si la vérification du nombre maximal de clés d’objet JSON est activée ou désactivée. Valeurs possibles : ON, OFF, Valeur par défaut : OFF
-
JSONMaxObjectKeyCount. Cette vérification peut être activée en configurant la vérification JsonMaxObjectKeyCount. La vérification protège contre les objets qui ont un grand nombre de clés et la valeur par défaut est définie sur 1000 octets. Valeur minimale : 0, Valeur maximale : 2147483647
-
JSONMaxObjectKeyLength. Cette vérification peut être activée en configurant la vérification JSONMaxObjectKeyLength. La règle valide si la vérification de la longueur maximale de la clé d’objet JSON est activée ou désactivée. Par défaut, il est désactivé.
-
JSONMaxObjectKeyLength. Le contrôle protège contre les objets qui ont une grande longueur de clé. Valeur par défaut : 128. Valeur minimale : 1, Valeur maximale : 2147483647
-
JSONMaxArrayLength. La règle valide si la vérification de la longueur maximale du tableau JSON est ON ou OFF. Par défaut, il est désactivé.
-
JSONMaxArrayLength. La vérification protège contre les baies qui ont de grandes longueurs. Par défaut, la valeur est définie sur 10000. Valeur minimale : 1, Valeur maximale : 2147483647
-
JSONMaxStringLength. Cette vérification peut être activée en configurant la vérification JsonMaxStringLength. La vérification valide si la longueur maximale de chaîne JSON est ON ou OFF. Par défaut, il est désactivé.
-
JSONMaxStringLength. Le contrôle protège contre les chaînes de grande longueur. Par défaut, il est défini sur 1000000. Valeur minimale : 1, Valeur maximale : 2147483647
Configurer la vérification de la protection DoS JSON
Pour configurer la protection DoS JSON, vous devez effectuer les étapes suivantes :
- Ajouter un profil de pare-feu d’application pour JSON.
- Définissez le profil de pare-feu d’application pour les paramètres de DoS JSON.
- Configurez les variables DoS JSON en liant le profil de pare-feu de l’application.
Ajouter un profil de pare-feu d’application pour la protection DoS JSON
Vous devez d’abord créer un profil qui spécifie comment le pare-feu d’application doit protéger votre contenu Web JSON contre les attaques DoS JSON. À l’invite de commandes, tapez :
add appfw profile <name> -type (HTML | XML | JSON)
Remarque :
Lorsque vous définissez le type de profil comme JSON, d’autres vérifications telles que HTML ou XML ne s’appliquent pas.
Exemple
add appfw profile profile1 –type JSON
Définir le profil de pare-feu d’application pour la protection DoS JSON
Vous devez configurer le profil pour une ou plusieurs actions DOS JSON et objet d’erreur DOS JSON à définir sur le profil de pare-feu de l’application. À l’invite de commandes, tapez :
set appfw profile <name> -JSONDoSAction [block] | [log] | [stats] | [none]
Bloquer - Bloquer les connexions qui violent cette vérification de sécurité. Journal - Consigner les violations de cette vérification de sécurité. Stats - Générez des statistiques pour cette vérification de sécurité. Aucun - Désactivez toutes les actions pour cette vérification de sécurité.
Remarque :
Pour activer une ou plusieurs actions, tapez “set appfw profile -JSONDoSAction” suivi des actions à activer.
Exemple
set appfw profile profile1 -JSONDoSAction block log stat
Configurer les variables DoS en liant le profil de pare-feu d’application
Pour fournir une protection DoS JSON, vous devez lier le profil de pare-feu de l’application aux paramètres DoS JSON. À l’invite de commandes, tapez :
bind appfw profile <name> -JSONDoSURL <expression> [-JSONMaxContainerDepthCheck ( ON | OFF ) [-JSONMaxContainerDepth <positive_integer>]] [-JSONMaxDocumentLengthCheck ( ON | OFF ) [-JSONMaxDocumentLength <positive_integer>]] [-JSONMaxObjectKeyCountCheck ( ON | OFF ) [-SONMaxObjectKeyCount <positive_integer>]] [-JSONMaxObjectKeyLengthCheck ( ON | OFF ) [-JSONMaxObjectKeyLength <positive_integer>]] [-JSONMaxArrayLengthCheck ( ON | OFF ) [-JSONMaxArrayLength <positive_integer>]] [-JSONMaxStringLengthCheck ( ON | OFF ) [-JSONMaxStringLength <positive_integer>]]
Exemple
bind appfw profile profile1 -JSONDoSURL “.*” -JSONMaxContainerDepthCheck ON
Remarque :
Les vérifications DoS JSON ne s’appliquent que si le type de profil est sélectionné comme JSON. En outre, le SQL, le script inter-site, le format de champ et les signatures de champ Formulaire sont appliqués aux paramètres de requête dans les cas de profil JSON.
Page d’erreur d’importation JSON
Si une demande entrante a subi une attaque DoS et lorsque vous bloquez la demande, l’appliance affiche un message d’erreur. Pour ce faire, vous devez importer la page d’erreur JSON. À l’invite de commandes, tapez :
import appfw jsonerrorpage <src> <name> [-comment <string>] [-overwrite]
Où,
src. URL (protocole, hôte, chemin d’accès et nom) pour l’emplacement où stocker l’objet d’erreur JSON importé.
Remarque :
L’importation échoue si l’objet à importer se trouve sur un serveur HTTPS qui nécessite l’authentification de certificat client pour l’accès. Il s’agit d’un argument obligatoire. Longueur maximale : 2047.
Nom. Nom à affecter à l’objet d’erreur JSON sur Citrix ADC. Il s’agit d’un argument obligatoire. Longueur maximale : 31 Commentaire. Tout commentaire pour conserver les informations sur l’objet d’erreur JSON. Longueur maximale : 255 Remplacer. Remplacer tout objet d’erreur JSON existant du même nom.
Exemple de configuration
Add appfw prof profjson –type JSON
Bind appfw prof profjson –JSONDoSURL “.*” -JSONMaxDocumentLengthCheck ON -JSONMaxDocumentLength 30 -JSONMaxContainerDepthCheck ON -JSONMaxContainerDepth 3 JSONMaxObjectKeyCountCheck ON -JSONMaxObjectKeyCount 4 -JSONMaxObjectKeyLengthCheck ON -JSONMaxObjectKeyLength 10 -JSONMaxArrayLengthCheck ON -JSONMaxArrayLength 5 -JSONMaxStringLengthCheck ON -JSONMaxStringLength 30
<!--NeedCopy-->
Exemples de charges utiles, de messages de journal et de compteurs :
Violation JSONMaxDocumentLength
JSONMaxDocumentLength: 30 Payload: {“a”:”A”,”b”:”B”,”c”:”C”,”d”:”D”,”e”:”E”}
Message du journal :
Document Length exceeds 20000000 May 29 20:23:32 <local0.info> 10.217.31.243 05/29/2019:20:23:32 GMT 0-PPE-0 : default APPFW APPFW_JSON_DOS_MAX_DOCUMENT_LENGTH 136 0 : 10.217.32.134 114-PPE0 - profjson http://10.217.30.120/forms/login.html Document exceeds maximum document length (30). cn1=30467 cn2=115 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
Compteurs :
1 0 6 as_viol_json_dos
2 0 3 as_viol_json_dos_max_document_length
3 0 6 as_log_json_dos
4 0 3 as_log_json_dos_max_document_length
5 0 6 as_viol_json_dos_profile appfw__(profile1)
6 0 3 as_viol_json_dos_max_document_length_profile appfw__(profile1)
7 0 6 as_log_json_dos_profile appfw__(profile1)
8 0 3 as_log_json_dos_max_document_length_profile appfw__(profile1)
<!--NeedCopy-->
Violation JSONMaxContainerDepth
JSONMaxContainerDepth: 3 Payload: {“a”: {”b”: {“c”: {“d”: { ”e” : “f” }}}}}
Message du journal :
May 29 19:33:59 <local0.info> 10.217.31.243 05/29/2019:19:33:59 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_CONTAINER_DEPTH 4626 0 : 10.217.31.247 22-PPE1 – profjson http://10.217.30.120/forms/login.html Document at offset (15) exceeds maximum container depth (3). cn1=30466 cn2=113 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
Compteurs :
36 20999 7 1 0 as_viol_json_dos
37 0 6 1 0 as_viol_json_dos_max_container_depth
38 0 7 1 0 as_log_json_dos
39 0 6 1 0 as_log_json_dos_max_container_depth
40 0 7 1 0 as_viol_json_dos_profile appfw__(profile1)
41 0 6 1 0 as_viol_json_dos_max_container_depth_profile appfw__(profile1)
42 0 7 1 0 as_log_json_dos_profile appfw__(profile1)
43 0 6 1 0 as_log_json_dos_max_container_depth_profile appfw__(profile1)
<!--NeedCopy-->
Violation JSONMaxObjectKeyCount
JSONMaxObjectKeyCount: 4
Payload: {“a”: ”A”, “b”: “B”, “c”:“C”, “d” :“D”, ”e” : “E” }
Message du journal :
May 30 19:42:41 <local0.info> 10.217.31.243 05/30/2019:19:42:41 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_OBJECT_KEY_COUNT 457 0 : 10.217.32.134 219-PPE1 - profjson http://10.217.30.120/forms/login.html Object at offset (41) that exceeds maximum key count (4). cn1=30468 cn2=118 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
Compteurs :
94 119105 15 1 0 as_viol_json_dos
95 0 4 1 0 as_viol_json_dos_max_object_key_count
96 0 15 1 0 as_log_json_dos
97 0 4 1 0 as_log_json_dos_max_object_key_count
98 0 15 1 0 as_viol_json_dos_profile appfw__(profile1)
99 0 4 1 0 as_viol_json_dos_max_object_key_count_profile appfw__(profile1)
100 0 15 1 0 as_log_json_dos_profile appfw__(profile1)
101 0 4 1 0 as_log_json_dos_max_object_key_count_profile appfw__(profile1)
<!--NeedCopy-->
Violation JSONMaxObjectKeyLength
JSONMaxObjectKeyLength: 10 Payload: {“a”: ”A”, “b1234567890”: “B”, “c”:“C”, “d” :“D”, ”e” : “E” }
Message du journal :
May 31 20:26:10 <local0.info> 10.217.31.243 05/31/2019:20:26:10 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_OBJECT_KEY_LENGTH 102 0 : 10.217.32.134 89-PPE1 - profjson http://10.217.30.120/forms/login.html Object key(b1234567890) at offset (12) exceeds maximum key length (10). cn1=30469 cn2=118 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
Compteurs :
242172 6 1 0 as_viol_json_dos
0 1 1 0 as_viol_json_dos_max_object_key_length
10 0 5 1 0 as_log_json_dos
11 0 1 1 0 as_log_json_dos_max_object_key_length
12 0 6 1 0 as_viol_json_dos_profile appfw__(profile1)
13 0 1 1 0 as_viol_json_dos_max_object_key_length_profile appfw__(profile1)
14 0 5 1 0 as_log_json_dos_profile appfw__(profile1)
15 0 1 1 0 as_log_json_dos_max_object_key_length_profile appfw__(profile1)
<!--NeedCopy-->
Violation JSONMaxArrayLength
JSONMaxArrayLength : 5 Charge utile : {« a » : » A », « c [» : » d », » e », » f », » g », » h »], » e » :[« E », » e »]}
Message du journal :
May 29 20:58:39 <local0.info> 10.217.31.243 05/29/2019:20:58:39 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_ARRAY_LENGTH 4650 0 : 10.217.32.134 153-PPE1 -profjson http://10.217.30.120/forms/login.html Array at offset (37) that exceeds maximum array length (5). cn1=30469 cn2=120 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
Compteurs :
36 182293 10 1 0 as_viol_json_dos
37 0 1 1 0 as_viol_json_dos_max_array_length
38 0 10 1 0 as_log_json_dos 39 0 1 1 0 as_log_json_dos_max_array_length
40 0 10 1 0 as_viol_json_dos_profile appfw__(profile1)
41 0 1 1 0 as_viol_json_dos_max_array_length_profile appfw__(profile1)
42 0 10 1 0 as_log_json_dos_profile appfw__(profile1)
43 0 1 1 0 as_log_json_dos_max_array_length_profile appfw__(profile1))
<!--NeedCopy-->
Violation JSONMaxStringLength
JSONMaxStringLength : 10
Payload: {“a”: ”A”, “c”:”CcCcCcCcCcCcCcCcCc”,”e”:[« E », » e »]}
Message du journal :
May 29 20:05:02 <local0.info> 10.217.31.243 05/29/2019:20:05:02 GMT 0-PPE-0 : default APPFW APPFW_JSON_DOS_MAX_STRING_LENGTH 134 0 : 10.217.32.134 80-PPE0 - profjson http://10.217.30.120/forms/login.html String(CcCcCcCcCcCcCc) at offset (27) that exceeds maximum string length (10). n1=30470 cn2=122 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
Compteurs :
44 91079 3 1 0 as_viol_json_dos
45 0 1 1 0 as_viol_json_dos_max_string_length
46 0 3 1 0 as_log_json_dos
47 0 1 1 0 as_log_json_dos_max_string_length
48 0 3 1 0 as_viol_json_dos_profile appfw__(profile1)
49 0 1 1 0 as_viol_json_dos_max_string_length_profile appfw__(profile1)
50 0 3 1 0 as_log_json_dos_profile appfw__(profile1)
51 0 1 1 0 as_log_json_dos_max_string_length_profile appfw__(profile1
<!--NeedCopy-->
Configurer la protection DoS JSON à l’aide de l’interface graphique Citrix
Suivez la procédure ci-dessous pour définir les paramètres de protection DOS JSON.
- Dans le volet de navigation, accédez à Sécurité > Profils.
- Dans la page Profils, cliquez sur Ajouter.
- Dans la page Profil du Citrix Web App Firewall, cliquez sur Vérifications de sécurité sous Paramètres avancés.
- Dans la section Vérifications de sécurité, accédez aux paramètres de déni de service JSON.
-
Cliquez sur l’icône exécutable située près de la case à cocher.
- Cliquez sur Paramètres d’action pour accéder à la page Paramètres de déni de service JSON.
- Sélectionnez l’action DoS JSON.
-
Cliquez sur OK.
- Dans la page Profil du Citrix Web App Firewall, cliquez sur Règles de relaxation sous Paramètres avancés.
-
Dans la section Règles de relaxation, sélectionnez Paramètres de déni de service JSON et cliquez sur Modifier.
- Dans le pare-feu d’application JSON Denial of Service Check, définissez les valeurs de validation DOS JSON.
-
Cliquez sur OK.
- Dans la page Profil du Citrix Web App Firewall, cliquez sur Paramètres du profil sous Paramètres avancés.
-
Dans la section Paramètres du profil, accédez à la sous-section Paramètres d’erreur JSON pour définir la page d’erreur DoS JSON.
-
Dans la page Error Page Importer un objet JSON, définissez les paramètres suivants :
- Importer à partir de. Importez la page d’erreur en tant que texte, fichier ou URL.
- URL. URL pour rediriger l’utilisateur vers la page d’erreur. 1 Dossier. Sélectionnez un fichier à importer en tant que fichier d’erreur DoS JSON.
- Texte. Entrez le contenu du fichier JSON.
- Cliquez sur Continuer.
- Dossier. Entrez le nom du fichier.
- Contenu du fichier. Ajoutez le contenu du fichier d’erreur.
- Cliquez sur OK.
- Cliquez sur OK.
- Cliquez sur Terminé.