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
Active Record Encryption と AWS KMS でエンベロープ暗号化
Search
gedorinku
December 18, 2024
Programming
790
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Active Record Encryption と AWS KMS でエンベロープ暗号化
gedorinku
December 18, 2024
More Decks by gedorinku
See All by gedorinku
Wantedly のバックエンドの将来に向けた取り組みと課題 - Wantedly Tech Night 2024/5
gedorinku
0
170
Porting mruby/c for the SNES (Super Famicom) - RubyKaigi 2024
gedorinku
0
5k
N+1 問題の解決と computed_model
gedorinku
0
140
部内での競プロ用ジャッジシステム
gedorinku
0
1.8k
部内ジャッジを作る話
gedorinku
1
130
プロラボ年度末報告会 HackDay / Hack U 福岡
gedorinku
0
180
Kotlin入門しました
gedorinku
0
300
Other Decks in Programming
See All in Programming
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
530
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
300
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
430
FreeBSDでZabbixを動かす
kenkino
0
350
iOSDCのペンライトを自動制御したい!
akkeylab
0
340
Workers Cache を知る
syumai
0
320
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
390
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
440
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
210
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
330
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
420
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
290
Featured
See All Featured
Everyday Curiosity
cassininazir
0
340
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Limits of Empathy - UXLibs8
cassininazir
1
700
WENDY [Excerpt]
tessaabrams
14
40k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
For a Future-Friendly Web
brad_frost
183
10k
How STYLIGHT went responsive
nonsquared
100
6.3k
ラッコキーワード サービス紹介資料
rakko
1
5.1M
Transcript
© 2024 Wantedly, Inc. Active Record Encryption と AWS KMS
でエンベロープ暗号化 Dec. 18 2024 - Ryota Egusa Wantedly Tech Night #6
© 2024 Wantedly, Inc. Ryota Egusa @gedorinku Quality Control Squad
https://www.wantedly.com/companies/ wantedly/post_articles/459966
© 2024 Wantedly, Inc. モチベーション データにアクセスできる範囲を制限したい • 万が一の漏洩時の被害を抑える 1. アクセスに対して監査ログを残したい
• KMS のようなキーマネージメントサービスの機能 • DB レベルで行うこともできる (例: pgAudit) 2.
© 2024 Wantedly, Inc. エンベロープ暗号化 Root Key Data Key Data
暗号化 暗号化 データごとに⽣成
© 2024 Wantedly, Inc. AWS KMS + エンベロープ暗号化 Root Key
Data Key Data 暗号化 暗号化 AWS KMS Data Key の暗号化‧復号は KMS の中で⾏う ここは各アプリケーション 内で⾏う
© 2024 Wantedly, Inc. AWS KMS のメリット キーの使用時にログが残る • Root
key が AWS KMS の外に出ないので必ずログが残る 1. Root key 自体は AWS が保護してくれる • AWS のアクセスキーが漏れることはあっても Root key が漏れる心配はなさそう 2.
© 2024 Wantedly, Inc. Active Record Encryption class User encrypts
:foo end user = User.create(foo: "hoge") user.foo # => "hoge"
© 2024 Wantedly, Inc. 標準のKeyProvider DerivedSecretKeyProvider • デフォルト • アプリケーション全体で単一のキーを使って暗号化
1. EnvelopeEncryptionKeyProvider • 暗号化毎にデータキーを生成、指定した Root key で暗号化 • 暗号化されたデータキーと暗号化されたデータを一緒に保存 2.
© 2024 Wantedly, Inc. Active Record Encryption class CustomKeyProvider def
encryption_key end def decryption_keys(encrypted_message) end end 暗号化⽤のData Keyを返す
© 2024 Wantedly, Inc. Active Record Encryption class CustomKeyProvider def
encryption_key end def decryption_keys(encrypted_message) end end 復号⽤のData Keyを返す
© 2024 Wantedly, Inc. Active Record Encryption class CustomKeyProvider def
encryption_key end def decryption_keys(encrypted_message) end end ドキュメントに詳しい説明はないが デフォルトの実装が参考になる https://github.com/rails/rails/blob/main/activerecord/lib/ active_record/encryption/envelope_encryption_key_prov ider.rb
© 2024 Wantedly, Inc. CustomKeyProvider#encryption_key resp = kms_client.generate_data_key( key_id: ENV.fetch('AWS_KMS_KEY_ID'),
key_spec: 'AES_256', ) ActiveRecord::Encryption::Key.new(resp.plaintext).tap do |key| key.public_tags.encrypted_data_key = resp.ciphertext_blob end 暗号化されずに保存される
© 2024 Wantedly, Inc. CustomKeyProvider#decryption_keys encrypted_data_key = encrypted_message.headers.encrypted_data_key response =
kms_client.decrypt({ ciphertext_blob: encrypted_data_key, key_id: ENV.fetch('AWS_KMS_KEY_ID') }) [ActiveRecord::Encryption::Key.new(response.plaintext)]
© 2024 Wantedly, Inc. まとめ アプリケーションレベルの暗号化によって被害を抑えログを残す • データにアクセスできる範囲を限定し、ログを残すことができる 1. Rails
と AWS KMS などを組み合わせて透過的に暗号化できる • 暗号化キーをRailsに渡す部分だけ作る必要がある • 暗号化処理はRailsやKMSがやってくれる 2.