Citrix ADC

Configuration et utilisation de variables

Vous devez d’abord créer une variable, puis affecter une valeur ou spécifier l’opération qui doit être effectuée sur la variable. Après avoir effectué ces opérations, vous pouvez utiliser l’affectation comme action de stratégie.

Remarque : une fois configuré, les paramètres d’une variable ne peuvent pas être modifiés ou réinitialisés. Si la variable doit être modifiée, la variable et toutes les références à la variable (expressions et affectations) doivent être supprimées. La variable peut ensuite être rajoutée avec de nouveaux paramètres, et les références (expressions et affectations) peuvent être rajoutées.

Pour configurer des variables à l’aide de l’interface de ligne de commande

  1. Créez une variable.
add ns variable <name> -type <string> [-scope global] [-ifFull ( undef | lru )] [-ifValueTooBig ( undef | truncate )] [-ifNoValue ( undef | init )] [-init <string>] [-expires <positive_integer>] [-comment <string>]

Remarque : Reportez-vous à la page man « man add ns variable » pour la description des paramètres de commande.

Exemple 1 : Créez une variable ulong nommée « my_counter » et initialisez-la à 1.

add ns variable my_counter –type ulong -init 1

Exemple 2 : Créer une carte nommée « user_privilege_map ». La carte contiendra des clés d’une longueur maximale de 15 caractères et des valeurs de texte d’une longueur maximale de 10 caractères, avec un maximum de 10000 entrées.

add ns variable user_privilege_map -type map(text(15),text(10),10000)

Remarque : Si la carte contient 10000 entrées non expirées, les affectations pour les nouvelles clés réutilisent l’une des entrées les moins récemment utilisées. Par défaut, une expression essayant d’obtenir une valeur pour une clé inexistante initialisera une valeur de texte vide.

Affectez la valeur ou spécifiez l’opération à effectuer sur la variable. Cela se fait en créant une affectation.

add ns assignment <name> -variable <expression> [-set <expression> | -add <expression> | -sub <expression> | -append <expression> | -clear] [-comment <string>]

Remarque : Une variable est référencée à l’aide du sélecteur de variable ($). Par conséquent, $variable1 est utilisé pour faire référence à des variables de texte ou ulong. De même, $variable2[key-expression]est utilisée pour faire référence à des variables de carte.

Exemple 1 : Définissez une affectation nommée « inc_my_counter » qui ajoute automatiquement 1 à la variable « my_counter ».

add ns assignment inc_my_counter -variable $my_counter -add 1

Exemple 2 : Définissez une affectation nommée « set_user_privilege » qui ajoute à la variable « user_privilege_map » une entrée pour l’adresse IP du client avec la valeur renvoyée par la légende HTTP « get_user_privilege ».

add ns assignment set_user_privilege -variable $user_privilege_map[client.ip.src.typecast_text_t] -set sys.http.callout(get_user_privilege)

Remarque : Si une entrée pour cette clé existe déjà, la valeur sera remplacée. Sinon, une nouvelle entrée pour la clé et la valeur sera ajoutée. Sur la base de la déclaration précédente pour user_privilege_map, si la carte contient déjà 10000 entrées, l’une des entrées les moins récemment utilisées sera réutilisée pour la nouvelle clé et la nouvelle valeur.

  1. Appelez l’affectation de variable dans une stratégie.

    Il existe deux fonctions qui peuvent fonctionner sur des variables de carte.

    • $name.valueExists(key-expression). Renvoie true s’il y a une valeur dans la carte sélectionnée par l’expression clé. Sinon renvoie false. Cette fonction met à jour les informations d’expiration et de LRU si l’entrée de carte existe, mais ne crée pas de nouvelle entrée de carte si la valeur n’existe pas.

    • $name.valueCount. Renvoie le nombre de valeurs actuellement détenues par la variable. Il s’agit du nombre d’entrées dans une carte. Pour une variable singleton, ceci est 0 si la variable n’est pas initialisée ou 1 autrement.

    Exemple : invoquez l’affectation nommée « set_user_privilege » avec une stratégie de compression.

add cmp policy set_user_privilege_pol -rule $user_privilege_map.valueExists(client.ip.src.typecast_text_t).not -resAction set_user_privilege

Cas d’utilisation pour insérer un en-tête HTTP dans le côté réponse

L’exemple suivant montre un exemple de variable singleton.

Ajoutez une variable singleton de type texte. Cette variable peut contenir un maximum de 100 octets de données.

add ns variable http_req_data -type text(100) -scope transaction

Ajoutez une action d’affectation, qui sera utilisée pour stocker les données de requête HTTP dans la variable.

add ns assignment set_http_req_data -variable $http_req_data -set http.req.body(100)

Ajoutez une action de réécriture pour insérer l’en-tête HTTP, dont la valeur sera récupérée à partir de la variable.

add rewrite action act_ins_header insert_http_header user_name $http_req_data.after_str("user_name").before_str("password")

Ajoutez une stratégie de réécriture qui évaluera dans l’heure de la requête et effectuera une action d’affectation pour stocker les données. Lorsque nous atteignons cette stratégie, nous allons prendre l’action d’affectation et stocker les données dans la variable ns (http_req_data)

add rewrite policy pol_set_variable true set_http_req_data

bind rewrite global pol_set_variable 10 -type req_dEFAULT

Ajoutez une stratégie de réécriture qui évaluera dans le temps de réponse, et ajoutez un en-tête HTTP dans la réponse.

add rewrite policy pol_ins_header true act_ins_header

bind rewrite global pol_ins_header 10 -type res_dEFAULT

Action d’affectation

Dans une appliance Citrix ADC, une action d’affectation liée à la stratégie est déclenchée lorsque la règle de stratégie est évaluée à true. L’action met à jour la valeur de la variable qui peut être utilisée dans les évaluations ultérieures des règles de stratégie. De cette façon, la même variable peut être mise à jour et utilisée pour des évaluations de stratégie ultérieures dans la même fonctionnalité. Auparavant, l’appliance exécutait des actions d’affectation uniquement après avoir évalué toutes les stratégies de la fonction lorsque les stratégies des actions d’affectation associées étaient évaluées à true. Par conséquent, la valeur de variable définie par l’action d’affectation ne peut pas être utilisée dans les évaluations de règles de stratégie suivantes au sein de la fonction.

Cette fonctionnalité peut être mieux comprise avec un cas d’utilisation qui contrôle la liste d’accès des clients sur une appliance Citrix ADC. La décision d’accès est fournie par un service Web distinct, avec la demandeGET /client-access?<client-IP-address> qui renvoie une réponse avec « BLOCK » ou « Autoriser » dans le corps. La légende HTTP est configurée pour inclure l’adresse IP du client associée à une requête entrante. Lorsque l’appliance Citrix ADC reçoit une demande d’un client, l’appliance génère la demande de légende et l’envoie au serveur de légende, qui héberge une base de données d’adresses IP figurant sur la liste noire et un agent de légende HTTP qui vérifie si l’adresse IP du client est répertoriée dans la base de données. L’agent de légende HTTP reçoit la demande de légende, vérifie si l’adresse IP du client est répertoriée et envoie une réponse. La réponse est un code d’état, 200, 302 avec « BLOCK » ou « Autoriser » dans le corps. En fonction du code d’état, l’appliance effectue l’évaluation de la stratégie. Si l’évaluation de stratégie a la valeur true, l’action d’affectation est déclenchée immédiatement et l’action définit la valeur à la variable. L’appliance utilise et définit cette valeur de variable pour une évaluation ultérieure de stratégie dans le même module.

Cas d’utilisation pour configurer l’action d’affectation

Suivez les étapes ci-dessous pour configurer l’action d’affectation et utiliser la variable pour les stratégies suivantes :

  1. La décision d’accès est fournie par un service Web séparé, avec la demande qui renvoie une réponse avec BLOCK ou Autoriser dans le corps.

    GET /url-service>/url-allowed?<URL path>

  2. Configurez une variable de carte pour contenir les décisions d’accès pour les URL.

    add ns variable url_list_map -type 'map(text(1000),text(10),10000)'

  3. Configurez une légende HTTP pour envoyer la demande d’accès au service Web.

    add policy httpCallout url_list_callout -vserver url_vs -returnType TEXT -urlStemExpr '"/url-allowed?" + HTTP.REQ.URL.PATH' -resultExpr 'HTTP.RES.BODY(10)'

  4. Configurez une action d’affectation pour appeler la légende pour obtenir la décision d’accès et l’affecter à l’entrée de mappage de l’URL.

    add ns assignment client_access_assn -variable '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T]' -set SYS.HTTP_CALLOUT(client_access_callout)

  5. Configurez une action de répondeur pour envoyer une réponse 403 si une requête d’URL est bloquée.

    add responder action url_list_block_act respondwith '"HTTP/1.1 403 Forbidden\\r\\n\\r\\n"'

  6. Configurez une stratégie de répondeur pour définir l’entrée de carte pour l’URL si elle n’est pas déjà définie. Avec l’amélioration de l’action immédiate, la valeur d’entrée de carte est définie lors de l’évaluation de cette stratégie. Avant l’amélioration, l’affectation n’a pas été effectuée avant que toutes les stratégies des intervenants aient été évaluées décision est fournie par un service Web distinct.

    add responder policy url_list_assn_pol '!$url_list_map.VALUEEXISTS(HTTP.REQ.URL.PATH)' url_list_assn

  7. Configurez une stratégie de répondeur pour bloquer l’accès à une URL si sa valeur d’entrée de carte est BLOCK. Avec l’amélioration de l’action immédiate, l’entrée de carte définie par la stratégie précédente peut être utilisée dans cette stratégie. Avant l’amélioration, l’entrée de carte n’est toujours pas définie à ce stade.

    add responder policy client_access_block_pol '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T] == "BLOCK"' client_access_block_act

  8. Liez les stratégies de répondeur au serveur virtuel. Remarque : Nous ne pouvons pas lier globalement les stratégies car nous ne voulons pas les exécuter pour la légende HTTP sur un serveur virtuel distinct.

    bind lb vserver vs -policyName client_access_assn_pol -priority 10 -gotoPriorityExpression NEXT -type REQUEST bind lb vserver vs -policyName client_access_block_pol -priority 20 -gotoPriorityExpression END -type REQUEST

Pour configurer des variables à l’aide de l’utilitaire de configuration

  1. Accédez à AppExpert > Variables NS, pour créer une variable.
  2. Accédez à AppExpert > NS Assignments, pour affecter des valeurs à la variable.
  3. Accédez à la zone d’entités appropriée dans laquelle vous souhaitez configurer l’affectation en tant qu’action.