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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Takegata
May 21, 2025
Technology
79
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
31
プロジェクト炎上を予防するためにメンバーひとりひとりができること
ratmie
0
2.4k
プロダクト開発のトラブルを予防するために どうして「大丈夫です」と報告されるのに スケジュールは遅れるのか
ratmie
0
27
銀の弾丸?AWS App Runnerとは
ratmie
0
39
勤怠入力のためにブラウザを開きたくない!
ratmie
0
250
AWS re/Invent 2023 所感とサービス
ratmie
0
17
Other Decks in Technology
See All in Technology
事業価値と Engineering 2026年度版
recruitengineers
PRO
50
25k
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
その“隠したつもり”が命取り ── 自前と平文をやめて「正解」に委ねる
kuroneko13
0
130
Head First モブプログラミング / Head First Mobprogramming
takaking22
10
12k
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
19k
少人数チームで実現する、大規模AWSサーバーレス基盤における"揺らがない"信頼性運用
maimyyym
1
100
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
380
修正PRを食べてレビュースキルが賢くなる:Claude Codeによる自己改善サイクル
yuyaumetsu
6
1.6k
ブラウザ研修 2026
recruitengineers
PRO
6
1.1k
Service Connect 上のサービスに ECS Service の外側から到達できなかった話
ota1022
1
260
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
20k
Featured
See All Featured
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
530
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
570
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
340
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
270
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
How STYLIGHT went responsive
nonsquared
100
6.2k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
860
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
490
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
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