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
710
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.9k
N+1 問題の解決と computed_model
gedorinku
0
130
部内での競プロ用ジャッジシステム
gedorinku
0
1.8k
部内ジャッジを作る話
gedorinku
1
130
プロラボ年度末報告会 HackDay / Hack U 福岡
gedorinku
0
170
Kotlin入門しました
gedorinku
0
290
Other Decks in Programming
See All in Programming
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
140
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
230
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
120
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
510
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
140
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
590
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
180
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
140
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.5k
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
770
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
500
Navigating Team Friction
lara
192
16k
The Cult of Friendly URLs
andyhume
79
6.9k
Discover your Explorer Soul
emna__ayadi
2
1.2k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
620
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
Designing for Timeless Needs
cassininazir
1
380
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
550
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.