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 の内容を取得する必要がある場合は、以下のいずれかの設定を有効にしてください。
V2 拡張では、公式パラメータも使用できます。
-Dotel.instrumentation.jdbc.experimental.capture-query-parameters=true
# or k8s
export OTEL_INSTRUMENTATION_JDBC_EXPERIMENTAL_CAPTURE_QUERY_PARAMETERS=true
最終的に Guance 上で確認できるトレース詳細は次のようになります。
よくある質問¶
-Dotel.jdbc.sql.obfuscation=trueを有効にしても、パラメータが置き換えられる場合があります。
db.statement の処理段階で一部のパラメータが既に置き換えられている可能性があり、プレースホルダーと origin_sql_x の数が一致しないのは正常な動作です。
- 元の SQL を有効にすると、内容が長くなり、改行が多くなります。
これによりトレースデータ量が増加するため、トレースの保持ポリシーとフィールド長ポリシーを考慮してストレージへの影響を評価することをお勧めします。
詳細については、以下を参照してください。