こんにちは。現場の最前線でコードと格闘し続けている皆さんに、今日は「ログ」という、実は一番の「秘密の漏洩源」についてお話しします。
「ログなんて、ただの記録でしょ?」と思っていませんか? それが大きな落とし穴なんです。システムにとってログは「防犯カメラの映像」のようなもの。でも、そのカメラが「金庫の暗証番号」や「家の合鍵の形」を堂々と玄関先に張り出していたらどうでしょう? 泥棒(攻撃者)は、わざわざ鍵を壊さなくても、そのメモを拾うだけで中に入れてしまいますよね。
今日は、そんな「うっかり漏洩」と「ログ改ざん」という、現場で最も多い事故を防ぐためのノウハウを、一緒に紐解いていきましょう。
—
1. ログは「家の玄関」と同じ。見せていいものだけを書こう
開発をしていると、つい「何が起きたか知りたい!」という一心で、リクエストの内容を丸ごとログに出力してしまいがちです。でも、そこにユーザーのパスワードや認証トークン(JWTなど)が紛れ込んでいたら……それは、玄関の鍵を道端に落とすのと同じことなんです。
対策:マスキングは「カーテン」の役割
すべての情報をありのまま記録するのではなく、機密情報には「カーテン」をかけましょう。これを「マスキング」と呼びます。
例えば、クレジットカード番号やトークンをログに出す際は、全桁を表示せず、以下のように加工するのが鉄則です。
悪い例:全部出しちゃう(これだと泥棒にプレゼントしているようなもの!)
logger.info(f”ログイン成功: トークン={user_token}”)
良い例:マスキングして安全に記録する
def mask_token(token):
# 前後の数文字だけ残して、あとは伏せ字にする
return token[:4] + “” + token[-4:]
logger.info(f”ログイン成功: トークン={mask_token(user_token)}”)
これだけで、万が一ログファイルが流出しても、攻撃者は「鍵の欠片」しか手に入れられません。これなら被害を最小限に抑えられますよね。
—
2. ログ偽装(ログインジェクション)を防ぐ「二重ロック」
次に注意したいのが「ログインジェクション」という攻撃です。これは、攻撃者が入力フォームなどに「改行コード(\n や \r)」を仕込んで、ログファイルを意図的に改ざんする手法です。
例えば、ログに User: [入力内容] でログインしました と書き出すシステムがあるとします。攻撃者が入力欄に「不正なユーザー\n[INFO] 管理者権限を付与しました」と書き込むと、ログファイルにはこう記録されます。
[INFO] User: 正常なユーザー でログインしました
[INFO] User: 不正なユーザー
[INFO] 管理者権限を付与しました でログインしました
これを見ると、まるでシステムが「管理者権限を付与した」ように見えてしまいますよね。これが「ログ偽装」です。後から監査しようとしても、何が真実か分からなくなってしまいます。
対策:サニタイズ(情報の消毒)
この対策はシンプルです。「ログに出力する前に、改行コードを消す(置換する)」こと。これをサニタイズと呼びます。
// Javaでの例:改行コードをスペースや空文字に置換する
String userInput = request.getParameter(“username”);
String safeLog = userInput.replaceAll(“[\n\r]”, “_”); // 改行をアンダーバーに置換
logger.info(“ユーザー名: ” + safeLog);
こうすることで、どんなに悪意のある入力があっても、ログは「一行の安全な記録」として保たれます。家の玄関に「変なものを持ち込ませないフィルター」を一枚挟むようなイメージですね。
—
現場で役立つ「鉄則」まとめ
最後に、明日からの開発で意識してほしいポイントを3つだけ持ち帰ってください。
1. 「何でもログに出さない」: 開発中は便利でも、本番環境では「個人情報・認証情報」をフィルタリングする設定が必須です。
2. 「ライブラリに頼る」: 最近のロギングライブラリ(LogbackやLog4j2のフィルターなど)には、自動的にマスキングを行う機能があります。自分でゼロから書くより、信頼できる武器を使いましょう。
3. 「ログは改ざんされる前提で」: ログファイル自体のアクセス権限を絞り、読み取り専用にするなど、インフラ側の「防犯」も合わせて考えましょう。
—
セキュリティ対策は「一度やったら終わり」ではなく、「日々、家の施錠を確認する」ような習慣です。最初は少し面倒に感じるかもしれませんが、これこそがあなたの書くコードを、そしてユーザーを守る「最強の盾」になります。
一歩ずつ、着実に学んでいきましょう。何か困ったことがあれば、またいつでも聞きに来てくださいね!
コメント