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
Active Record Encryption と AWS KMS でエンベロープ暗号化
Search
gedorinku
December 18, 2024
Programming
690
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
160
Porting mruby/c for the SNES (Super Famicom) - RubyKaigi 2024
gedorinku
0
4.8k
N+1 問題の解決と computed_model
gedorinku
0
120
部内での競プロ用ジャッジシステム
gedorinku
0
1.8k
部内ジャッジを作る話
gedorinku
1
120
プロラボ年度末報告会 HackDay / Hack U 福岡
gedorinku
0
170
Kotlin入門しました
gedorinku
0
290
Other Decks in Programming
See All in Programming
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
160
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.6k
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
160
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
2
660
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
510
CSC307 Lecture 17
javiergs
PRO
0
320
dRuby over BLE
makicamel
2
330
Swiftのレキシカルスコープ管理
kntkymt
0
220
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.3k
LLM Plugin for Node-REDの利用方法と開発について
404background
0
170
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
210
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
Designing Powerful Visuals for Engaging Learning
tmiket
1
410
It's Worth the Effort
3n
188
29k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
The Cost Of JavaScript in 2023
addyosmani
55
10k
We Are The Robots
honzajavorek
0
240
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
30 Presentation Tips
portentint
PRO
1
320
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.