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
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
31
プロジェクト炎上を予防するためにメンバーひとりひとりができること
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
本番に近いテストをもっと手軽に - Postmanで広がるAPIテストの世界 / Expanding the World of API Testing with Postman
yokawasa
1
220
いま、生成AIにKaggleをどこまで 任せられるか — ROGIIコンペでの進め方とTips
k951286
1
1.2k
AIエージェントの開発・提供におけるセキュリティリスクの論点と対策
flatt_security
1
350
少人数データチームのDevin活用実践事例
runandy16
2
330
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3.2k
こんなアーキテクチャ図は嫌だ BEYOND THE TIME: 半年後の自分へ贈る15のメッセージ / 15 of Anti-pattern in AWS Architecture Diagrams
naospon
2
120
AIエージェントを雇う前に決める5つのこと
knishioka
1
140
はじめてのDatabricks:技術者向けワークショップ / beginner-workshop
databricksjapan
PRO
0
110
IDperturb: Enhancing Variation in Synthetic Face Generation via Angular Perturbation
sansantech
PRO
0
100
なぜSRE・セキュリティは評価されないのか?守りの組織を事業成長エンジンに変えた実践
cscengineer
PRO
0
750
サーバー常駐型の 簡易障害調査AI エージェントを作ってみた話
masayoshi
1
520
APIセキュリティを組織で実現するには~注力する点と設計・実装に入れたい対策~
riiimparm
3
880
Featured
See All Featured
Navigating Team Friction
lara
192
16k
Building Adaptive Systems
keathley
44
3.2k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
430
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Designing Experiences People Love
moore
143
24k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Bash Introduction
62gerente
615
220k
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