コンテンツにスキップ

GraphQL トレースが有効化されている

説明

GraphQL トレースは、有効にすると 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 トレースに関連するリスクを軽減するために、以下の推奨事項を検討してください:

  1. トレース実装の理解: GraphQL トレースは通常、プラグインを使用して実装され、GraphQL の応答に直接公開するのではなく、別個のトレースサーバー(例:Jaeger)にデータを送信することがよくあります。

  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