Ad Widget

Collapse

Gérer un API KEY d'un site distant

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • omarchand
    Junior Member
    • Apr 2019
    • 2

    #1

    Gérer un API KEY d'un site distant

    Bonjour à touts.


    Petit nouveau sur ce forum, 3 ans d'expérience avec Zabbix.

    Je travaille sur la version 4.2.0 de Zabbix serveur installé sur un CentOS 7.

    J'essaie de monitorer un système distant via un API HTTPS.
    Sur le même serveur que Zabbix, toutes mes demandes cli fonctionnent.

    exemples de login au API en mode manuel (version écourtée):
    $curl -X POST https://abx.com/api/Login -d '{"username":"mon_username","password":"monpasswor d"}'

    Aucun problème, je reçoit une clef dans le header https que retoure le web server NGINX distant.

    Dans Zabbix j'ai créer un http item qui recréer cette même requête. Dans cet item, j'ai demandé de convertir la réponse en format JSON, puisque la réponse est en text standard.
    Avec 2 preposessing filtre (JSON PATH + Regex), j'arrive à isoler la clef... cool !
    Nom de l'item : GetApiKey
    Clef dans l'item: APIKEY

    J'aimerais ré-utiliser cette dite clef qui se trouve dans un item pour pouvoir demander d'autres infos via le API du site web distant.

    Exemple de demandes faites manuellement - réponse fonctionnelle !

    $curl -X GET https://abx.com/api/ResourcesList -H "Key: .AspNetCore.Cookies=rt5nvRuhinfd-43jfn... etc...etc...etc.."

    Dans Zabbix, j'ai créer un 2e http item qui recréer ma dernière demande, mais je dois passer comme paramètre dans les headers la celf de login.

    -- Headers - Name - (premier champ): Key => Value (2e champ) : {GetApiKey.APIKEY} (pour faire une référence à mon premier item qui contient la clef).
    Headers - Content-Type => application/json,charset=UTF-8
    Headers - Accept => application/json

    Dans le debug du serveur , je vois la demande suivante envoyé par Zabbix:

    18967:20190405:171429.047 End of substitute_key_macros():SUCCEED data:'ResourcesList'
    18967:20190405:171429.047 In substitute_simple_macros() data:'3s'
    18967:20190405:171429.047 In substitute_simple_macros() data:'https://abx.com/api/ResourcesList'
    18967:20190405:171429.047 In substitute_simple_macros() data:EMPTY
    18967:20190405:171429.047 In substitute_simple_macros() data:'Key: {GetApiKey.APIKEY}
    Content-Type: application/json,charset=UTF-8
    Accept: application/json
    18967:20190405:171429.047 In substitute_simple_macros() data:'401,200'
    18967:20190405:171429.047 In substitute_simple_macros() data:EMPTY
    18967:20190405:171429.047 In substitute_simple_macros() data:EMPTY
    18967:20190405:171429.047 In substitute_simple_macros() data:EMPTY
    18967:20190405:171429.047 In substitute_simple_macros() data:EMPTY
    18967:20190405:171429.047 In substitute_simple_macros() data:EMPTY
    18967:20190405:171429.047 In substitute_simple_macros() data:EMPTY
    18967:20190405:171429.047 In get_value() key:'TrunkResourcesList'
    18967:20190405:171429.047 In get_value_http() request method 'GET' URL 'https://abx.com/api/ResourcesList' headers 'Key: {GetApiKey.APIKEY}
    Content-Type: application/json,charset=UTF-8
    Accept: application/json' message body ''

    Evidement, la réponse du site web :

    ]
    18957:20190405:171430.025 query [txnlev:1] [insert into history_text (itemid,clock,ns,value) values (29099,1554498869,132679036,'HTTP/1.1 401 Unauthorized
    Server: nginx
    Date: Fri, 05 Apr 2019 21:14:29 GMT
    Content-Length: 0
    Connection: keep-alive
    Cache-Control: no-cache
    Pragma: no-cache
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Set-Cookie: CmmSession=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; samesite=lax
    Set-Cookie: XSRF-TOKEN=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; samesite=lax
    Set-Cookie: .AspNetCore.Cookies=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; samesite=lax

    ');
    ]

    Donc, est-ce possible de créer une référence en utilisant le nom d'un autre item + key dans le champ Header? Est-ce ma méthode qui n'est pas bonne ??

    J'ai essayé également avec un Discovery item, mais comme la réponse du site web n'est pas en format JSON, rien à faire...
    Dans le discovery item http, il n'y a pas l'option de convertir la réponse en format JSON.

    Merci.
  • steve.destivelle
    Senior Member
    Zabbix Certified Trainer
    Zabbix Certified SpecialistZabbix Certified Professional
    • Feb 2017
    • 304

    #2
    Bonjour,

    Olivier ?

    Est-ce que tu pourrais tester en remplaçant la valeur dans le deuxième item {GetApiKey.APIKEY} par {NOMDETONHOST:GetApiKey.APIKEY.last()} ?

    Le NOMDETONHOST doit être écrit comme écrit dans Zabbix.

    Steve
    "Estimez la taille de votre base de données Zabbix: http://tools.izi-it.io
    "Rejoignez le ZABBIX Discord francophone https://discordapp.com/invite/hvauXEQ"

    "izi-it.io / ZABBIX Certified Trainer / ZABBIX French Evangelist"

    Comment

    • omarchand
      Junior Member
      • Apr 2019
      • 2

      #3
      Bonjour Steve. Désolé pour le délai, nous avons du gérer d'autres problématique dans notre entreprise plus urgente que notre développement de Zabbix.

      J'ai pas mal tout essayé, entre autre ce que tu as proposé, {NOMDETONHOST:GetApiKey.APIKEY.last()} ... rien à faire.

      Dans le but de créer un template, j'ai remplacer plusieurs valeurs dans ma requête par des user macros.

      Le serveur Zabbix remplace correctement les valeurs des macros par les bonnes informations avant d'envoyer la requête ex:

      22554:20190626:101435.037 In substitute_simple_macros() data:'https://{$URL}:{$PORT}/api/command'
      22554:20190626:101435.037 End substitute_simple_macros() data:'https://abxtoto.com:443/api/command'
      22554:20190626:101435.038 In get_value_http() request method 'GET' URL 'https://abxtoto.com:443/api/command' headers 'Cookie: {GETAPIKEY.APIKEY}' message body ''

      Comme on peu voir, le seul élément qui n'est pas remplacé par Zabbix est {ITEM.KEY} dans les headers.

      Pourtant, selon la doc https://www.zabbix.com/documentation...itemtypes/http
      Headers Custom HTTP headers that will be sent when performing a request.
      Specified as attribute and value pairs.
      Supported macros: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, user macros, low-level discovery macros.
      Si je force un user macro ==> {$KEY} et j'assigne la clef API à cette macro:
      In substitute_simple_macros() data:'https://{$URL}:{$PORT}/api/command'
      End substitute_simple_macros() data:'https://abxtoto.com:443/api/command'
      In get_value_http() request method 'GET' URL 'https://abxtoto.com:443/api/command' headers '"Cookie: .AspNetCore.Cookies=CfDJ8Iz7jxXhzBROoDL4TPTG0pfDGW 88"' message body ''

      Donc fonctionnel avec un user macro.

      Depuis mon post original, j'ai fait une mise à jour vers Zabbix Server 4.2.3 , je crois qu'il s'agit tout simplement d'un bug.

      Je crois devoir ouvrir un defect chez Zabbix directement.

      Merci.

      Comment

      • Boune
        Junior Member
        • Jul 2021
        • 13

        #4
        Bonjour ,

        Je relance ce sujet , car je recherche a faire exactement la même chose.
        Des heures que je test différentes approches pour passer en paramètre la valeur d'un item a un autre item.

        Est ce que quelqu'un a réussi a faire fonctionner ceci ? omarchand

        Un item "HTTP Agent" qui va récupérer un token d'authentification.
        Un item "HTTP Agent" qui va faire une requete avec en parametre (Header) le fameux token d'authentification.



        merci pour vos retours.

        Comment


        • nicolasgoudard
          nicolasgoudard commented
          Editing a comment
          @Bourne Je pense que l'item qui doit recevoir le paramètre doit être un item "dépendant" du premier et de type "calculated item" Sous Zabbix il est possible de créer des dépendances entre items. Et en choisissant le type Calculated, il y a un champ formule où on peut mettre le nom de l'item. Par contre on ne peut pas mettre le nom tel quel, dans Zabbix 5.4 il faut passer par une fonction : par exemple ici pour la dernière valeur de nombre de CPU : last(//system.cpu.num)
          C'est mieux expliqué ici : https://www.zabbix.com/documentation...pes/calculated
      • nicolasgoudard
        Junior Member
        • Mar 2021
        • 27

        #5
        Originally posted by Boune
        Bonjour ,

        Je relance ce sujet , car je recherche a faire exactement la même chose.
        Des heures que je test différentes approches pour passer en paramètre la valeur d'un item a un autre item.

        Est ce que quelqu'un a réussi a faire fonctionner ceci ? omarchand

        Un item "HTTP Agent" qui va récupérer un token d'authentification.
        Un item "HTTP Agent" qui va faire une requete avec en parametre (Header) le fameux token d'authentification.



        merci pour vos retours.


        @Bourne Je pense que l'item qui doit recevoir le paramètre doit être un item "dépendant" du premier et de type "calculated item" Sous Zabbix il est possible de créer des dépendances entre items. Et en choisissant le type Calculated, il y a un champ formule où on peut mettre le nom de l'item. Par contre on ne peut pas mettre le nom tel quel, dans Zabbix 5.4 il faut passer par une fonction : par exemple ici pour la dernière valeur de nombre de CPU : last(//system.cpu.num)
        C'est mieux expliqué ici : https://www.zabbix.com/documentation...pes/calculated

        Comment

        • Boune
          Junior Member
          • Jul 2021
          • 13

          #6
          Salut Nicolas,

          Merci pour ton retour,
          Je ne comprends pas trop le fonctionnement, si je crée un "depend item" tu ne peux pas choisir le type d'item (calculated ou Http agent )
          De plus le "calculated item" est seulement un nombre , et malheureusement j'ai une chaine de caractère a gérer ^^

          Comment

          • nicolasgoudard
            Junior Member
            • Mar 2021
            • 27

            #7
            Originally posted by Boune
            Salut Nicolas,

            Merci pour ton retour,
            Je ne comprends pas trop le fonctionnement, si je crée un "depend item" tu ne peux pas choisir le type d'item (calculated ou Http agent )
            De plus le "calculated item" est seulement un nombre , et malheureusement j'ai une chaine de caractère a gérer ^^
            en fait je viens de regarder et je n'ai jamais créé de dépendent item. Peut-être qu'il n'y en a pas besoin car si je fais référence à un item dans un autre ça fonctionne.
            Par exemple un formule pour avoir le CPU idle en nombre total et non en pourcentage (j'en ai besoin car ensuite je dois faire une moyenne sur un cluster de noeuds ) :
            Type : calculated
            Formula : last(//system.cpu.util[,idle])*last(//system.cpu.num)/100

            Comment

            • Boune
              Junior Member
              • Jul 2021
              • 13

              #8
              Yes je comprends ton fonctionnement , mais dans mon cas j'ai besoin d'utiliser des items de type "Http Agent" et si je test de faire appel a
              Code:
              last(//apikey)
              dans le champ "Header" ça ne fonctionne pas.
              apikey étant l'item pour récupérer le token d'authentification.
              Attached Files

              Comment

              • nicolasgoudard
                Junior Member
                • Mar 2021
                • 27

                #9
                Originally posted by Boune
                Yes je comprends ton fonctionnement , mais dans mon cas j'ai besoin d'utiliser des items de type "Http Agent" et si je test de faire appel a
                Code:
                last(//apikey)
                dans le champ "Header" ça ne fonctionne pas.
                apikey étant l'item pour récupérer le token d'authentification.
                Il y a beaucoup de choses que j'ai trouvé difficile à faire sous Zabbix et j'ai du les scripter et les envoyer à zabbix avec zabbix_sender pour les récupérer de l'autre coté avec des item de type "trapper" .
                C'est ce que je ferais pour ton cas.
                Sans parler des graphes qui ne marchent pas sans qu'on comprenne pourquoi (no data) ou dont les possibilités sont limitées ( uniquement des graphes temporels, impossible de mixer des données empilées et normales, etc) . Je compte à terme tout scripter et envoyer sur du grafana .

                Comment

                • Boune
                  Junior Member
                  • Jul 2021
                  • 13

                  #10
                  ça sera la même chose , une fois que j'aurais récupéré ma variable avec "trapper" je ne trouverai pas de solution pour la réutiliser dans un autre item...

                  Comment

                  • nicolasgoudard
                    Junior Member
                    • Mar 2021
                    • 27

                    #11
                    Originally posted by Boune
                    ça sera la même chose , une fois que j'aurais récupéré ma variable avec "trapper" je ne trouverai pas de solution pour la réutiliser dans un autre item...
                    C'est un peu compliqué de débugguer ça sur un forum. Sur la doc de zabbix il est expliqué avec un exemple concret comment réutiliser le résultat du http agent dans un item dépendant : https://www.zabbix.com/documentation...itemtypes/http
                    je ne sais pas si ça peut aider

                    Comment

                    • Boune
                      Junior Member
                      • Jul 2021
                      • 13

                      #12
                      Merci pour ton retour Nicolas , je ne peux utiliser un item dépendant , car il ne me permet pas de relancer une requete HTTP..., l'item dépendant ne fait que du traitement de donné malheuresement.

                      Dans mon cas il faudrait avoir la possibilité de faire "Http Agent pour recuperer le token" => "Item dependant de type Http agent (avec le token en parametre)"
                      Mais ce n'est pas possible
                      Last edited by Boune; 14-07-2021, 18:08.

                      Comment

                      • nicolasgoudard
                        Junior Member
                        • Mar 2021
                        • 27

                        #13
                        Originally posted by Boune
                        Merci pour ton retour Nicolas , je ne peux utiliser un item dépendant , car il ne me permet pas de relancer une requete HTTP..., l'item dépendant ne fait que du traitement de donné malheuresement.

                        Dans mon cas il faudrait avoir la possibilité de faire "Http Agent pour recuperer le token" => "Item dependant de type Http agent (avec le token en parametre)"
                        Mais ce n'est pas possible
                        Je comprends. As tu réellement besoin de premier item en terme de monitoring ? Car au pire il reste la possibilité de faire tout dans un script externe et juste d'envoyer l'item à monitorer et sa valeur

                        Comment

                        • Boune
                          Junior Member
                          • Jul 2021
                          • 13

                          #14
                          Je pense que c'est la seule solution en effet , tu as un exemple de script , genre un fichier bash qui "curl" pour recuperer le token , et l'envoyer via l'api de zabbix ?

                          Comment

                          • Boune
                            Junior Member
                            • Jul 2021
                            • 13

                            #15
                            bon bah j'ai trouvé une autre astuce

                            un external script qui requete sur mon serveur pour recuperer le token
                            une fois le token recuperer , je l'assigne a une global macro , via l'api zabbix

                            Ensuite je peux jouer avec cette macro , sur mes items HTTP Agent

                            c'est pas flex , car si j'ai 100 serveurs j'ai 100 scripts a coder... mais bon je vois pas d'autres solutions pour le moment...

                            Comment

                            Working...