Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
安全なログ記録を始めよう
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takegata
May 21, 2025
Technology
89
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
41
プロジェクト炎上を予防するためにメンバーひとりひとりができること
ratmie
0
2.6k
プロダクト開発のトラブルを予防するために どうして「大丈夫です」と報告されるのに スケジュールは遅れるのか
ratmie
0
36
銀の弾丸?AWS App Runnerとは
ratmie
0
43
勤怠入力のためにブラウザを開きたくない!
ratmie
0
260
AWS re/Invent 2023 所感とサービス
ratmie
0
23
Other Decks in Technology
See All in Technology
PostgreSQL オプティマイザ統計の秘密
nori_shinoda
0
310
AIエージェントに業務知識を届ける仕組みづくり - Knowledge Catalogを活用した知識基盤の構築
hekuchan
0
120
re:Invent の去年のスケジュールを公開します!
miu_crescent
PRO
0
280
Flutter Widget Previewerで始めるUIプレビューとVRTの自動化
sakusaku3939
0
210
AI時代のエンジニアの情報発信〜個人の発信を組織の力に変える〜
ryo_kawamata
1
7.3k
200人の配信コメント、 全部Jevが仕分けます 〜 マサカリガードを作ってみた 〜
katayamatg
1
530
Consistency for mere mortals - A gentle guide to consistency
ufried
0
120
Patterns in AI Driven Software Development
akosma
PRO
0
470
kintoneで在庫管理システムを作るときの要件定義・設計ポイント
kai0707
0
230
あなたのDartコードは丸見えかもしれない ~reFlutterで暴くFlutterアプリの中身と多層防御~
zozotech
PRO
0
770
AIエージェントの監視、思考を見るか行動を見るか / Monitoring AI Agents: Thoughts or Actions
yusukeshimizu
1
120
The future of architectural work
ufried
0
150
Featured
See All Featured
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
370
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
500
Visualization
eitanlees
153
17k
Making Projects Easy
brettharned
120
6.8k
Google's AI Overviews - The New Search
badams
0
1.7k
Mind Mapping
helmedeiros
1
430
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Optimizing for Happiness
mojombo
378
71k
GitHub's CSS Performance
jonrohan
1033
470k
Ethics towards AI in product and experience design
skipperchong
2
460
Odyssey Design
rkendrick25
PRO
2
920
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
290
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