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
AWS Keymanagement Serviceを知ろう
Search
MATSUURA, yosuke
June 07, 2020
Programming
0
600
AWS Keymanagement Serviceを知ろう
AWS KMSとは何か、何に使うのかということを説明した資料です。
※身内でやった勉強会の資料から内輪ネタを削ったものです。
MATSUURA, yosuke
June 07, 2020
Tweet
Share
More Decks by MATSUURA, yosuke
See All by MATSUURA, yosuke
CircleCIとSchemaSpyを使ったMySQLドキュメントの自動生成
bateleurx
1
840
WebRTC配信システムをAWSからオンプレミスに切り替えている話
bateleurx
14
13k
機密情報をKMS+RDS,S3とParameter Storeを使って保存した話
bateleurx
0
3.2k
VAddy導入案内
bateleurx
0
250
0から始まるかもしれない固定長整数をINT型に入れたい
bateleurx
0
1.7k
Other Decks in Programming
See All in Programming
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
210
Security_for_introducing_eBPF
kentatada
0
110
テストケースの名前はどうつけるべきか?
orgachem
PRO
0
130
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
250
[JAWS-UG横浜 #76] イケてるアップデートを宇宙いち早く紹介するよ!
maroon1st
0
460
「とりあえず動く」コードはよい、「読みやすい」コードはもっとよい / Code that 'just works' is good, but code that is 'readable' is even better.
mkmk884
3
230
useSyncExternalStoreを使いまくる
ssssota
6
1k
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
180
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
180
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
1
440
ドメインイベント増えすぎ問題
h0r15h0
2
300
선언형 UI에서의 상태관리
l2hyunwoo
0
160
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
170
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
347
20k
GraphQLとの向き合い方2022年版
quramy
44
13k
Unsuck your backbone
ammeep
669
57k
Practical Orchestrator
shlominoach
186
10k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Transcript
AWS Key Management Service(KMS)を知ろう
共通鍵によるデータの暗号化 • 共通鍵暗号は256bit AESがデファクトスタンダード • 安全な暗号とはアルゴリズムが公開されていて、脆弱性が見つかって いないこと • 厳密に言えばAESは高性能な量子コンピュータに対して脆弱だが、AESが危殆化 するレベルの量子コンピュータは世に存在していない
• 代替アルゴリズムがないという「脆弱性」は指摘されている • 非公開アルゴリズムを使っている暗号化は信用してはいけない • アルゴリズムは公開されているので、安全性を担保するのは 「いかに鍵を管理するか」につきる • KMSは安全に鍵を管理するためのサービス • GCPにもCloud Key Management Serviceという同様の機能がある
AWS KMSの概要 • 自前の暗号化はもちろん、RDS, S3, EBSなどの透過的暗号化で も使える • マニアックなオプションとして、CloudHSMで鍵の持ち込みも 可能
• 東京では$1.81/h(今のレートで月額15万円弱) • 金融系の会社で使うことがあるらしい • 鍵のローテーション(交換)も可能 • セキュリティ上の要請がある場合に使う • 暗号論的安全な乱数を生成する機能もある
メリット • なんといっても暗号鍵の管理が楽 • 自分で暗号鍵を持つ場合 • どこに置けばいいのか • どのように管理・デプロイすればよいのか •
ハードコードしてリポジトリに入れてたりしないですよね・・・ • KMSならAPI経由で生成・取得可能 • IAMで権限管理できる • CloudTrailで利用ログも記録できる
間違えないで • KMSはデータを安全に暗号化するためのサービス • たとえば個人情報を保存したいとき • 秘密情報のデプロイに使うサービスではない • アクセストークン、DBパスワード、サーバ証明書秘密鍵など •
AWS Systems ManagerのParameter Store, AWS Secrets Managerを使います • これはこれで便利なサービス • APIキーのデプロイはEC2 Roleを使う
登場する鍵 • Master Key: 頂点となる鍵 • この鍵で直接暗号化できるが、 データ長と時間あたりの処理回 数などに制限がある •
マイナンバーなど短い文字列な らこれでいける • Data Key: 長いデータの暗号 化に使う • Master Keyで暗号化して保存 • これがenvelope encryption
アプリケーションでの鍵の管理 • Master Key暗号化はAPIに平文を送ると、暗号文が返ってくる • ローカルに鍵を置かないので、管理を考える必要はない • Envelope encryptionはAPIに平文の鍵と暗号化された鍵をリク エストする
• 「平文の鍵で暗号化」して、「暗号化された鍵を保存」する • 平文の鍵は/tmpに置いたりせず、オンメモリで処理を完了させる • ではAPIリクエストするためのキーは? • 流出すると鍵が入手できてしまうので、暗号化の意味がない • EC2 Instance Roleでインスタンスに権限を付与しましょう
データキーによる暗号化 • GenerateDataKeyでデータ キーを要求すると、平文の鍵 と暗号化された鍵が返る • 暗号化したいデータを「平文 の鍵」で暗号化し、暗号化さ れたデータとセットで「暗号 化された鍵」を保存する
• 暗号化は自分で行う • 平文鍵の処理はすべてオンメモ リで行う
データキーによる復号 • Decryptに暗号化された鍵を 送ると、平文の鍵が返る • 返ってきた鍵で暗号化された データを復号する • 復号も自分でやる •
平文の鍵はやはりオンメモリで 処理する必要がある
Encryption context? • KMS Encrypt APIのリクエスト構造は以下の通り { "EncryptionContext": { "string"
: "string" }, "GrantTokens": [ "string" ], "KeyId": "string", "Plaintext": blob } • Encryption Contextという引数を与えることができる • これは何だろう?
認証付き暗号 • 鍵が共通なので、攻撃者が何らかの方法で暗号文を入手した場合、 暗号を解読できてしまう • ターゲットの暗号文カラムを自分の行にコピーできた場合など • 秘匿性(Confidentiality)しか満たされない • 「混乱した使節」(confused
deputy) • Encryption contextつきの暗号文は、復号に同じcontextが必要 • これが「追加認証データ」(AAD; Additional Authenticated Data) • UIDなどを使うことが多い • 暗号時に認証するので「認証付き暗号」(AEAD; Authenticated Encryption with Associated Data) • 完全性(Integrity), 可用性(Availability)が満たされる • 可用性は「認可された人が」常に使えるという意味
まとめ • データを暗号化して保存するときはKMSを利用すべき • 暗号アルゴリズムは(今のところ)256bit AESが鉄板 • その上で、鍵の管理方法だけ注意すれば良い • ユーザーデータのように一意キーが使える場合は、認証付き暗
号を積極的に利用しよう
参考資料 • だいたいこのあたりを見ればわかります • AWS Key Management Service 開発者ガイド •
https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/overvie w.html • AWS Black Belt Techシリーズ AWS Key Management Service • https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt- tech-aws-key-management-service • AWS再入門 – Amazon KMS編 • https://dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-aws- relearning-key-management-service/