レッスン 4-1
要る
読み終えたら攻撃の
この頁の流れ
監査
出典を確かめた日 2026年10月27日
なぜ通るのか
ある
記録は、
| 問い | 記録に要る物 |
|---|---|
| いつ | 世界で |
| どこで | 機械の |
| だれが | 利用者の |
| 何を、 | 操作の |
監査ログとは何か
監査ログは、
残すのは、
残す物と、残さない物
記録は、
| 区分 | 例 |
|---|---|
| 必ず残す | 認証の |
| 残さないか、伏せる | パスワード、 |
OWASP は、
相関の ID と時刻
1 回の
時刻は、
保持の期間は、気づくまでの時間で決める
記録を
置き場も
脆いコードと直したコード
ラボの
文字列でつなぐか、構造で残すか
Python
import logging
log = logging.getLogger("app")
def on_login(user, password, ok):
log.info(f"login user={user} pw={password} ok={ok}")Python
import json, logging
from datetime import datetime, timezone
log = logging.getLogger("app")
def on_login(req_id, user, ip, ok):
log.info(json.dumps({
"ts": datetime.now(timezone.utc).isoformat(),
"event": "login",
"req_id": req_id,
"user": user,
"ip": ip,
"result": "ok" if ok else "fail",
}, ensure_ascii=False))脆い方には、\n と
書き換えに気づけないか、気づけるか
Python
import json
def append(path, event):
with open(path, "a") as f:
f.write(json.dumps(event, sort_keys=True) + "\n")Python
import hashlib, json
def append(path, event, prev):
line = json.dumps(dict(event, prev=prev), sort_keys=True)
with open(path, "a") as f:
f.write(line + "\n")
return hashlib.sha256(line.encode()).hexdigest()
def verify(path, head):
prev = "0" * 64
for line in open(path):
if json.loads(line)["prev"] != prev:
return False
prev = hashlib.sha256(line.rstrip("\n").encode()).hexdigest()
return prev == head脆い方では、
これは
ログでの見え方と検知
脆い on_login の
記録
login user=eve pw=x ok=False
login user=admin pw=x ok=True
login user=eve pw=hunter2 ok=False1 回の
記録
{"ts": "2026-10-27T01:14:03.512904+00:00", "event": "login", "req_id": "r-91", "user": "eve pw=x ok=False\nlogin user=admin pw=x ok=True\nlogin user=eve", "ip": "127.0.0.1", "result": "fail"}記録
| 見る物 | なぜ効くか |
|---|---|
| 記録が | 侵入した |
| 鎖の | 途中の |
| 名前の | 記録の |
| 大量の | 持ち出しは、 |
直し方と、直ったことの確かめ方
自分の
- 作業用の
フォルダを 作り、脆い on_loginに、名前に 改行を 入れた 値を 渡して、 1 回の 操作の 記録が 何行にも 増える ことを 確かめる - 同じ
記録に、 パスワードが そのまま 残っている ことを 確かめる - 直した
on_loginに置き換え、 同じ 値でも 記録が 1 行で、 パスワードが 無い ことを 確かめる - 直した
appendで3 行書き、 途中の 1 行の 中身を 手で 書き換えて、 verifyがFalse を 返す ことを 確かめる - 下の
試験を 足し、 直す前の コードに 戻すと 試験が 落ちる ことも 確かめる - 終わったら、
作業用の フォルダごと消す
Python
import logging
def test_one_event_is_one_line(caplog):
caplog.set_level(logging.INFO)
on_login("r1", "eve\nlogin user=admin ok=True", "127.0.0.1", False)
assert len(caplog.records) == 1
assert "\n" not in caplog.records[0].getMessage()
def test_tamper_is_detected(tmp_path):
p = tmp_path / "audit.log"
head = "0" * 64
for e in ({"event": "login"}, {"event": "export"}):
head = append(p, e, head)
assert verify(p, head)
p.write_text(p.read_text().replace("export", "view"))
assert not verify(p, head)import logging
def test_one_event_is_one_line(caplog):
caplog.set_level(logging.INFO)
on_login("r1", "eve\nlogin user=admin ok=True", "127.0.0.1", False)
assert len(caplog.records) == 1
assert "\n" not in caplog.records[0].getMessage()
def test_tamper_is_detected(tmp_path):
p = tmp_path / "audit.log"
head = "0" * 64
for e in ({"event": "login"}, {"event": "export"}):
head = append(p, e, head)
assert verify(p, head)
p.write_text(p.read_text().replace("export", "view"))
assert not verify(p, head)1 つ目の
記録の設計を 1 枚にまとめる
コードを
記録
残す操作 ログインの成否、権限の変更、書き出し、設定の変更
項目 ts(UTC) event req_id user ip target count result
残さない パスワード、トークン、セッションの ID (要ればハッシュ)
置き場 書いた機械から消せない別の置き場へ、その日のうちに送る
保持 直近 3 か月はすぐ検索でき、1 年は取り出せる
見張り 記録の途切れ、鎖の不一致、時間外の大量の書き出し保持の
関わる事例
記録が
Marriott が
記録が
- 2023年10月1日、
個人向け 23andMe 使い回しパスワードの遺伝子検査・ 系譜 サービス 乗っ取り被害 入口 他のサービスから 漏れた メールアドレスと パスワードの 組み合わせを 使い、 2023年4月29日ごろから 少なくとも 5か 月に わたって 使い回しパスワードを 突く 攻撃 (クレデンシャルスタッフィング) が 行われた - 2023年7月13日、
通信 NTT・ コールセンター 業務受託 西日本 入口 システムのグループ 委託先元派遣社員による 顧客情報の 不正持ち出し 運用保守業務に 従事していた 元派遣社員が、 顧客データを 保管する PDSサーバに 特権的に アクセスできる 立場を 使い、 閉域網の 本件 ネットワークに 保守端末等から アクセスした - 2023年7月4日、
港湾・ 名古屋港統一物流 ターミナルシステム (NUTS) ランサムウェア 入口 保守用被害 VPN 機器からの 侵入が 有力と された (感染経路は 断定されていない) - 2022年6月22日、
地方自治体 尼崎市 全市民情報USB 入口 住民基本情報をメモリー 紛失事案 扱う 委託業務に、 市の 承諾を 得ない 再委託・ 再々 委託に よって 入り 込んでいた 従業員が、 サーバルームで 給付金サーバの 全市民データを USBメモリーに コピーし 持ち出した - 2020年1月20日、
電機・ 三菱電機 不正アクセス総合電機 メーカー 事案 入口 中国拠点のウイルス 対策管理 サーバーが、 未公開の 脆弱性を 突いた ゼロデイ攻撃を 受け、 パターンファイルの 更新機能を 悪用されて 端末への 侵入を許した - 2018年9月8日、
宿泊(ホテルチェーン) マリオット(スターウッド)予約 入口 2014年、データベース 侵害 Starwoodの IT システムの 装置に ウェブシェルが 設置されて 侵入されたが、 その 経路は 特定されていない。 侵入者は これを 足場に RAT(遠隔操作型 マルウェア)で 管理者権限を 奪い、 ネットワーク内を 動き回った。 - 2017年7月29日、
信用情報機関 Equifax の(消費者信用調査) 個人情報流出 入口 2017年3月に公表された Apache Strutsの 脆弱性が、 消費者の 苦情を 受け付ける インターネット 向けの ポータルACISで 修正されないまま 残り、 5月13日に そこを 突かれた
確認クイズ
1 問目
ログインの
答えだと思う選択肢を押すと、その場で正誤と理由が開きます。
答え イ
パスワードと
2 問目
侵入に
答えだと思う選択肢を押すと、その場で正誤と理由が開きます。
答え ア
7 日では、
説明課題
次の
- 自分の
サービスの ログインの 記録を、 攻撃の 跡を 追える 形に 作り 直すとしたら、 何を 足し、 何を 消し、 どこに置くか
模範解答を見る
協定世界時の
一次資料
どれも
- Logging Cheat Sheet (OWASP、英語)。
いつ、 どこで、 だれが、 何を の 項目、 interaction identifier、 認証の 成否を 必ず残す こと、 セッションの ID や トークンを 伏せる こと、 改行と 区切りの 文字を 無害に すること - A09 Security Logging and Alerting Failures (OWASP Top 10 2025年版、英語)。
成功した ログインだけを 残す 失敗、 記録が 機械の 中にだけある 失敗、 追記だけを 許す 仕組みによる 改ざんの防止 - SP 800-92 Guide to Computer Security Log Management (NIST、
英語、 。2006年9月) 記録の 管理の 基本の手引き - SP 800-92 Rev. 1 Cybersecurity Log Management Planning Guide (NIST、
英語、 。2023年10月の 初期公開草案) 記録の 管理を 計画する 手引きの 改訂の草案 - 高度
サイバー攻撃への 。対処に おける ログの 活用と 分析方法 (JPCERT/CC、 日本語、 2015年11月17日) 調査に 要る 記録が 無い、 十分な 期間の 記録が 無いために 全容が 分からなかった 例が 少なくないこと - 調査報告書 (NTT 西日本 社内調査委員会、
日本語、 。2024年2月19日) 書き出しを 止める 仕組みと 記録の 見張りが 無かった こと、 2022年の 調査で 書き出しの 記録を 表面的にしか 見なかったこと - Marriott International Inc, Penalty Notice (ICO、
英語、 。2020年10月30日) 見張りの 警報が 決済カードの 表だけに 限られていたこと - The Equifax Data Breach (米下院 監視・
政府改革委員会、 。英語、 2018年12月) 通信を 検査する 装置の 証明書が 切れていたこと - 不正アクセスによる
個人情報と 。企業機密の 流出 可能性に ついて (三菱電機、 日本語、 2020年1月20日) 送り出された ファイルを 特定する ための 記録が 消されていたこと - 株式会社
DMM Bitcoinに 。対する 行政処分に ついて (財務省 関東 財務局、 日本語、 2024年9月26日) 証拠保全の ための 記録の 保存期間を 検討していなかったこと
次へ
次の
