Aller au contenu

Traçage GraphQL Activé

Description

Le traçage GraphQL (GraphQL Tracing) est une fonctionnalité qui, lorsqu'elle est activée, fournit des informations détaillées sur le temps d'exécution d'une requête GraphQL. Bien qu'utile pour le débogage et l'optimisation des performances, elle peut potentiellement divulguer des informations sensibles sur le fonctionnement interne du serveur si elle reste activée dans un environnement de production.

Lorsque le traçage est activé, le serveur GraphQL inclut un champ extensions dans la réponse, contenant un objet tracing. Cet objet comprend des informations détaillées sur l'exécution de chaque résolveur dans la requête, y compris les heures de début, les heures de fin et les durées.

Exemple d'une réponse avec le traçage activé :

{
  "data": {
    "field1": "value1",
    "field2": "value2"
  },
  "extensions": {
    "tracing": {
      "version": 1,
      "startTime": "2023-09-17T10:00:00.000Z",
      "endTime": "2023-09-17T10:00:00.050Z",
      "duration": 50000000,
      "execution": {
        "resolvers": [
          {
            "path": ["field1"],
            "parentType": "Query",
            "fieldName": "field1",
            "returnType": "String",
            "startOffset": 1000000,
            "duration": 2000000
          },
          {
            "path": ["field2"],
            "parentType": "Query",
            "fieldName": "field2",
            "returnType": "String",
            "startOffset": 3000000,
            "duration": 1000000
          }
        ]
      }
    }
  }
}

Impact sur la sécurité du traçage GraphQL : - Divulgation d'informations : Les données de traçage peuvent révéler des détails internes sur la structure et les performances du serveur GraphQL, ce qui pourrait être exploité par des attaquants pour planifier des attaques plus ciblées. - Surcharge de performances : L'activation du traçage en production peut introduire une surcharge de performances inutile, affectant potentiellement la capacité du serveur à gérer des charges élevées. - Problèmes de confidentialité des données : Dans certains cas, les données de traçage peuvent inclure des informations sensibles qui ne devraient pas être exposées aux clients.

Recommandation

Recommandations pour le Traçage GraphQL

Pour atténuer les risques associés au traçage GraphQL, tenez compte des recommandations suivantes :

  1. Comprendre l'implémentation du traçage : Le traçage GraphQL est généralement implémenté à l'aide de plugins et envoie souvent des données à des serveurs de traçage distincts (par exemple, Jaeger) plutôt que de les exposer directement dans les réponses GraphQL.

  2. Contrôler le traçage en production : Utilisez des variables d'environnement ou des paramètres de configuration pour activer ou désactiver facilement le traçage en fonction de l'environnement.

  3. Mettre en œuvre des contrôles d'accès : Si le traçage est activé en production, mettez en œuvre des contrôles d'accès stricts sur le serveur de traçage (par exemple, Jaeger) pour garantir que seul le personnel autorisé peut accéder aux données de traçage.

  4. Nettoyer les données de traçage : Assurez-vous que les informations sensibles ne sont pas incluses dans les données tracées avant qu'elles ne soient envoyées au serveur de traçage.

  5. Utiliser des outils APM sécurisés : Envisagez d'utiliser des outils de surveillance des performances des applications (APM) dédiés qui offrent des capacités de surveillance sécurisées et complètes pour les environnements de production.

Exemple d'implémentation du traçage avec un contrôle basé sur l'environnement dans Apollo Server :

const { ApolloServer } = require('apollo-server');
const { ApolloServerPluginInlineTrace } = require('apollo-server-core');

const isProduction = process.env.NODE_ENV === 'production';
const plugins = [];

if (!isProduction) {
  plugins.push(ApolloServerPluginInlineTrace({
    rewriteError: (err) => {
      // Optionally rewrite errors before sending to the tracing service
      return err;
    },
  }));
}

const server = new ApolloServer({
  typeDefs,
  resolvers,
  plugins,
});

Cette configuration vous permet de contrôler facilement le traçage en fonction de l'environnement, garantissant qu'il n'est pas accidentellement activé en production.

Pour d'autres implémentations de serveurs GraphQL, consultez la documentation spécifique sur la façon d'implémenter et de contrôler le traçage de manière sécurisée.

Liens

Normes

  • PCI_STANDARDS:
    • REQ_2_2
    • REQ_6_2
    • REQ_6_3
    • REQ_6_5
    • REQ_11_3
  • OWASP_MASVS_L2:
    • MSTG_ARCH_9
  • OWASP_ASVS_L3:
    • V1_4_4
  • SOC2_CONTROLS:
    • CC_6_1
    • CC_6_7
    • CC_7_1
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213
    • SECURITY255