コンテンツにスキップ

Java 拡張

著者:宋龙奇

SQL 難読化

OpenTelemetry Java Agent はデフォルトで SQL を難読化します。db.statement 内のパラメータ値は ? に置き換えられ、機密情報の漏洩リスクを低減します。 公式の説明はこちら: DB statement sanitization

デフォルトの難読化動作は次のとおりです。

  • 値(文字列、数値)をプレースホルダーに置き換える
  • 空白文字(複数スペース、改行)を圧縮して統一表示する

ps = conn.prepareStatement("SELECT name,password,id FROM student where name=? and password=?");
ps.setString(1, username);   // set 了参数占位符 1
ps.setString(2, password);   // set 了参数占位符 2

トレース上では次のように表示されます。

SELECT name,password,id FROM student where name=? and password=?

インライン SQL(機密データのシナリオでは推奨されません)を使用した場合:

ps = conn.prepareStatement("SELECT name,password,id FROM student where name='abc' and password='123456'");

トレースは元の SQL テキストを保持します。

難読化パラメータ収集の有効化(拡張)

setXXX でパラメータが埋め込まれた後の SQL の内容を取得する必要がある場合は、以下のいずれかの設定を有効にしてください。

-Dotel.jdbc.sql.obfuscation=true
# or k8s
export OTEL_JDBC_SQL_OBFUSCATION=true

V2 拡張では、公式パラメータも使用できます。

-Dotel.instrumentation.jdbc.experimental.capture-query-parameters=true
# or k8s
export OTEL_INSTRUMENTATION_JDBC_EXPERIMENTAL_CAPTURE_QUERY_PARAMETERS=true

最終的に Guance 上で確認できるトレース詳細は次のようになります。

トレース
トレース詳細

よくある質問

  1. -Dotel.jdbc.sql.obfuscation=true を有効にしても、パラメータが置き換えられる場合があります。

db.statement の処理段階で一部のパラメータが既に置き換えられている可能性があり、プレースホルダーと origin_sql_x の数が一致しないのは正常な動作です。

  1. 元の SQL を有効にすると、内容が長くなり、改行が多くなります。

これによりトレースデータ量が増加するため、トレースの保持ポリシーとフィールド長ポリシーを考慮してストレージへの影響を評価することをお勧めします。

詳細については、以下を参照してください。

フィードバック

このページは役に立ちましたか?