跳转至

已启用 GraphQL 跟踪

描述

GraphQL Tracing 是一项功能,启用后,它可以提供有关 GraphQL 查询执行的详细时序信息。虽然它对调试和性能优化很有用,但如果在生产环境中保持启用状态,它可能会泄露有关服务器内部工作原理的敏感信息。

启用跟踪后,GraphQL 服务器在响应中包含一个 extensions 字段,其中包含一个 tracing 对象。此对象包含有关查询中每个解析器执行的详细信息,包括开始时间、结束时间和持续时间。

启用跟踪的响应示例:

{
  "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
          }
        ]
      }
    }
  }
}

GraphQL 跟踪的安全性影响: - 信息泄露:跟踪数据可能会泄露有关 GraphQL 服务器结构和性能的内部细节,攻击者可能会利用这些细节策划更具针对性的攻击。 - 性能开销:在生产环境中启用跟踪会带来不必要的性能开销,从而可能影响服务器处理高负载的能力。 - 数据隐私问题:在某些情况下,跟踪数据可能包含不应向客户端暴露的敏感信息。

建议

GraphQL 跟踪建议

为了缓解与 GraphQL Tracing 相关的风险,请考虑以下建议:

  1. 了解跟踪的实施方式:GraphQL 跟踪通常使用插件来实现,并且通常会将数据发送到独立的跟踪服务器(例如 Jaeger),而不是直接在 GraphQL 响应中暴露。

  2. 在生产环境中控制跟踪:使用环境变量或配置设置,以根据环境轻松启用或禁用跟踪。

  3. 实施访问控制:如果在生产环境中启用了跟踪,请对跟踪服务器(例如 Jaeger)实施严格的访问控制,以确保只有经过授权的人员才能访问跟踪数据。

  4. 清理跟踪数据:确保在将跟踪数据发送到跟踪服务器之前,其中不包含敏感信息。

  5. 使用安全的 APM 工具:考虑使用专门的应用程序性能监控 (APM) 工具,这些工具可为生产环境提供安全且全面的监控功能。

在 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,
});

这种设置允许您根据环境轻松控制跟踪,确保它不会在生产环境中被意外启用。

对于其他 GraphQL 服务器实施方案,请查阅有关如何安全实施和控制跟踪的具体文档。

链接

标准

  • 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