已启用 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 相关的风险,请考虑以下建议:
-
了解跟踪的实施方式:GraphQL 跟踪通常使用插件来实现,并且通常会将数据发送到独立的跟踪服务器(例如 Jaeger),而不是直接在 GraphQL 响应中暴露。
-
在生产环境中控制跟踪:使用环境变量或配置设置,以根据环境轻松启用或禁用跟踪。
-
实施访问控制:如果在生产环境中启用了跟踪,请对跟踪服务器(例如 Jaeger)实施严格的访问控制,以确保只有经过授权的人员才能访问跟踪数据。
-
清理跟踪数据:确保在将跟踪数据发送到跟踪服务器之前,其中不包含敏感信息。
-
使用安全的 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