Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
安全なログ記録を始めよう
Search
Takegata
May 21, 2025
Technology
80
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
安全なログ記録を始めよう
2025/05/21 Log Tips LT会
Takegata
May 21, 2025
More Decks by Takegata
See All by Takegata
PRを小さくする勉強会
ratmie
0
33
プロジェクト炎上を予防するためにメンバーひとりひとりができること
ratmie
0
2.5k
プロダクト開発のトラブルを予防するために どうして「大丈夫です」と報告されるのに スケジュールは遅れるのか
ratmie
0
27
銀の弾丸?AWS App Runnerとは
ratmie
0
40
勤怠入力のためにブラウザを開きたくない!
ratmie
0
250
AWS re/Invent 2023 所感とサービス
ratmie
0
18
Other Decks in Technology
See All in Technology
Driving AI Adoption Using In-House GPUs to Serve Qwen
po3rin
2
420
Claude Codeの体系的な理解と知識のフック
oikon48
10
6.6k
DMMブックスのNext.js化を加速させるAI活用 / Migrating DMM Books to Next.js with AI
kentarom
1
330
全社に広がるMCPサーバーを、 どう安全に管理するか MCPass開発の舞台裏
mtpooh
3
280
#jawssonic2026 あの時代が悪かった ~動かなかったSageMakerと共に迎えたイベント当日~
ktkn1129
0
130
プロダクト思考 × 基盤思考を AIで実現する Compound Engineering
tkc66buzz
1
230
APIセキュリティを組織で実現するには~注力する点と設計・実装に入れたい対策~
riiimparm
3
920
こんなアーキテクチャ図は嫌だ BEYOND THE TIME: 半年後の自分へ贈る15のメッセージ / 15 of Anti-pattern in AWS Architecture Diagrams
naospon
3
210
AI時代に、プロダクトの数だけ積み上がる所有コストをどうエンジニアリングするか / Engineering the Cost of Ownership
kzkmaeda
0
910
Jetpack Compose で挑む新聞紙面UI ─ 複合ジェスチャー・ポリゴン記事領域・適応的ページ構成という3つの壁/droidkaigi2026
nikkei_engineer_recruiting
0
170
本番に近いテストをもっと手軽に - Postmanで広がるAPIテストの世界 / Expanding the World of API Testing with Postman
yokawasa
1
240
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
3
1.9k
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Being A Developer After 40
akosma
91
590k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
HDC tutorial
michielstock
2
840
The Spectacular Lies of Maps
axbom
PRO
1
970
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Ruling the World: When Life Gets Gamed
codingconduct
0
320
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
560
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Transcript
NCDC.co.LTD All Rights Reserved. 安全なログ記録をはじめよう Scrub/Redact Sensitive Data Takegata Jumpei
NCDC.co.LTD All Rights Reserved. ロギングしてますか?
NCDC.co.LTD All Rights Reserved. はじめに 開発・分析にログは不可欠 でもうっかりセキュアな情報(個人情報・パスワード・機密など)がログに残ると大変なことに → 削除するのが大変、インシデント、最悪訴訟など… 大きなログ漏洩事例
ログから個人情報や機密が漏洩する事例はしばしば起きている Typetalk (2023 年) : ログからemail, OAuth2.0 のcredential が漏洩 Kid Security App (2023 年) : ユーザーデータを含む3 億件のログが漏洩 Pegasus Airline (2022 年) : ログを含むデータが漏洩し、ログにパスワードや秘密鍵が含まれていた
NCDC.co.LTD All Rights Reserved. 安全にログを書きたい
NCDC.co.LTD All Rights Reserved. どうするか? 2 つのアプローチ 許可リスト形式:安全なものだけ記録する 拒否リスト形式:危険なものを記録しない
NCDC.co.LTD All Rights Reserved. 許可リスト形式:安全なものだけログに出力する 原則記録しない 安全だとわかっているものだけを選択して、明示的に記録する
NCDC.co.LTD All Rights Reserved. 許可リスト形式の例 function safeLog(data) { const safeFields
= ['id', 'status', 'timestamp']; const logObject = {}; safeFields.forEach(field => { if (data[field] !== undefined) logObject[field] = data[field]; }); console.log(JSON.stringify(logObject)); } safeLog({ name: "John", password: "foo123", id: "1", status: 200, timestamp: "2025/05/21T10:00:00.123Z", }) // { // "id": "1", // "status": 200, // "timestamp": "2025/05/21T10:00:00.123Z" // }
NCDC.co.LTD All Rights Reserved. 拒否リスト形式:危険なものをログから隠す 原則記録する 危険と指定したデータのみマスクする仕組み どうやる? object の特定キーがあったときに別の文字列に置き換える
ハッシュ化や暗号化などをしたものをログに出力する
NCDC.co.LTD All Rights Reserved. 拒否リスト形式の例 function redactLog(data) { const sensitiveFields
= ['mail', 'email', 'password', 'name', 'token']; // 危険なkey const logObject = {...data}; sensitiveFields.forEach(field => { if (logObject[field]) logObject[field] = '***REDACTED***'; }); console.log(JSON.stringify(logObject)); } redactLog({ name: "John", password: "foo123", id: "1", status: 200, timestamp: "2025/05/21T10:00:00.123Z", }) // { // "name": "***REDACTED***", // "password": "***REDACTED***", // "id": "1", // "status": 200, // "timestamp": "2025/05/21T10:00:00.123Z" // }
NCDC.co.LTD All Rights Reserved. どう使うの? 2つのアプローチを組み合わせる。 まず、ログを書くときは必要かつ安全な情報だけをえらぶように心がける:許可リスト思考 そのうえで、共通の仕組みでマスク処理をガードレールとして実装しておく:禁止リストの実装 logger の中で書き換える仕組みを使うとよい
pino のredact option winston のformatter nestjs のintercepter
NCDC.co.LTD All Rights Reserved. その他考えたこと Q. 特定key をマスクする場合、nest したオブジェクトについて再帰的に処理する必要があるのでは? そうですね
そもそも深いnest があるオブジェクトをログに出す必要があるか? sentry は送信時にnest のdepth 上限を決めて、それ以上は[object] として送っている Q. ユーザーが自由に入力できる項目に個人情報などが記載されたら? 正規表現でマスクする、などは可能ではあるが網羅性・未検知などもあるのであまりやりたくない できるだけ入力しない仕組みにしたい UI 上で特定キーワードはフィルタリングする 注意喚起をする 何がsensitive な情報なのか、どのkey を指定するべきかはドメインに依る 扱っているデータと向き合う
NCDC.co.LTD All Rights Reserved. まとめ ログをセキュアにするには小さな取り組みから まずは一度ログをaddress, token などでgrep してみませんか?
NCDC.co.LTD All Rights Reserved. 参考 https://github.com/pinojs/pino/blob/main/docs/redaction.md https://github.com/winstonjs/winston?tab=readme-ov-file#formats