ログは「家ののぞき穴」?あなたの家の鍵が丸見えになっていませんか?
こんにちは。セキュリティの世界で長く戦っていると、「完璧なシステムなんて存在しない」という現実に突き当たります。でも、だからといって無防備でいいわけじゃありませんよね。
今日は、開発現場でつい忘れがちだけど、実は「泥棒に家の合い鍵を配っているようなもの」と言っても過言ではない、「ログ出力」の話をしましょう。
「え、ログってエンジニアがデバッグするために出すものでしょ? なんでそれが悪いの?」と思っているあなた。その認識、今日から少しアップデートしていきましょう!
—
なぜ「ログ」が狙われるのか?
想像してみてください。あなたは自分の家の玄関に、親切心で「今日、誰が何時に帰ってきたか」を記録するノートを置いています。これがいわゆる「アプリケーションログ」です。
本来なら「19:00 帰宅」と書くべきところに、もし「19:00 帰宅、鍵は植木鉢の下に隠しました(合鍵の暗証番号:1234)」なんて書き込んでいたらどうでしょう?
ログファイルは、システムが正常に動いているかを確認するための非常に便利なものですが、そこに「パスワード」「セッションID(ログイン後の通行手形)」「個人情報(名前や住所)」がそのまま記録されていると、攻撃者はそのログを盗み見るだけで、あなたのシステムの裏口を簡単に開けてしまいます。
これが、昨今のインシデントで非常によくある「ログ情報の漏洩」のメカニズムです。
—
ログから「機密」を消し去るための3つのステップ
では、どうすれば安全にログを残せるのでしょうか。一歩ずつ、泥臭い対策を見ていきましょう。
1. 「全部出す」をやめて「必要なものだけ出す」
初心者のうちは、エラーが出たときに何でもかんでもログに出したくなりますよね。「`request.body` を丸ごと出力しちゃえ!」……これはNGです。リクエストボディには、ユーザーが入力したパスワードが含まれている可能性があるからです。
対策:必要なフィールドだけを抽出する
すべてを出力するのではなく、必要な項目だけをホワイトリスト形式で指定しましょう。
2. マスキング(隠蔽)という魔法を使う
もし、どうしてもログに出力しなきゃいけない場合でも、そのまま出す必要はありません。「1234-5678-9012」というカード番号を「–-9012」に変える、あれです。
3. ライブラリの「フィルター機能」を頼る
自力でif文をたくさん書いてログを加工するのは大変ですし、バグの元です。ログ出力ライブラリが持っている「フィルター機能」を使いましょう。
例えば、Javaの `Logback` や Pythonの `logging` では、特定のパターンにマッチした文字列を自動的に「」に置換する機能が備わっています。
【サンプルコード:Pythonでのログ・マスキング例】
import logging
import re
ログ内に含まれるカード番号のようなパターンを自動で隠すフィルター
class SensitiveDataFilter(logging.Filter):
def filter(self, record):
# ログメッセージを取得
msg = record.getMessage()
# カード番号(例: 1234-5678-…)をマスクする正規表現
masked_msg = re.sub(r’\d{4}-\d{4}-\d{4}-\d{4}’, ‘–––‘, msg)
record.msg = masked_msg
return True
ロガーの設定
logger = logging.getLogger(“AppLogger”)
logger.addFilter(SensitiveDataFilter())
開発中のログ出力
logger.info(“ユーザーのカード情報: 1111-2222-3333-4444 を処理しました”)
出力結果: ユーザーのカード情報: ––– を処理しました
—
忘れないで!「ログの完全性」を守る
最後に、もう一つ大事な話を。ログが改ざんされないようにすることも重要です。
もし攻撃者がシステムに侵入したとき、自分の足跡(ログ)を消そうとしますよね。家の掃除をして証拠隠滅を図る泥棒と同じです。
- 書き込み専用(Append-only)にする: 一度書かれたログは、システム管理者でも簡単には消せない(上書きできない)設定にしましょう。
- ログを外部に逃がす: アプリケーションと同じサーバーにログを溜め込まず、別のログ管理専用サーバーへリアルタイムに転送しておくのが鉄則です。サーバーごと破壊されても、ログだけは別の場所に残っている。これが最後の砦になります。
—
最後に:セキュリティは「おもてなし」と同じ
セキュリティ対策を「面倒なこと」と捉える必要はありません。
「ユーザーの大切な情報を守る」というのは、お客様を大切にする最高のおもてなしです。
今日からコードを書くとき、ふと手を止めてこう考えてみてください。
「このログ、もし誰かに盗み見られたら、ユーザーは困らないかな?」
その「想像力」こそが、最強のセキュリティツールです。
一緒に、安全で愛されるシステムを作っていきましょう!応援しています。

コメント