Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS Keymanagement Serviceを知ろう

AWS Keymanagement Serviceを知ろう

AWS KMSとは何か、何に使うのかということを説明した資料です。
※身内でやった勉強会の資料から内輪ネタを削ったものです。

MATSUURA, yosuke

June 07, 2020
Tweet

More Decks by MATSUURA, yosuke

Other Decks in Programming

Transcript

  1. AWS Key Management Service(KMS)を知ろう

  2. 共通鍵によるデータの暗号化 • 共通鍵暗号は256bit AESがデファクトスタンダード • 安全な暗号とはアルゴリズムが公開されていて、脆弱性が見つかって いないこと • 厳密に言えばAESは高性能な量子コンピュータに対して脆弱だが、AESが危殆化 するレベルの量子コンピュータは世に存在していない

    • 代替アルゴリズムがないという「脆弱性」は指摘されている • 非公開アルゴリズムを使っている暗号化は信用してはいけない • アルゴリズムは公開されているので、安全性を担保するのは 「いかに鍵を管理するか」につきる • KMSは安全に鍵を管理するためのサービス • GCPにもCloud Key Management Serviceという同様の機能がある
  3. AWS KMSの概要 • 自前の暗号化はもちろん、RDS, S3, EBSなどの透過的暗号化で も使える • マニアックなオプションとして、CloudHSMで鍵の持ち込みも 可能

    • 東京では$1.81/h(今のレートで月額15万円弱) • 金融系の会社で使うことがあるらしい • 鍵のローテーション(交換)も可能 • セキュリティ上の要請がある場合に使う • 暗号論的安全な乱数を生成する機能もある
  4. メリット • なんといっても暗号鍵の管理が楽 • 自分で暗号鍵を持つ場合 • どこに置けばいいのか • どのように管理・デプロイすればよいのか •

    ハードコードしてリポジトリに入れてたりしないですよね・・・ • KMSならAPI経由で生成・取得可能 • IAMで権限管理できる • CloudTrailで利用ログも記録できる
  5. 間違えないで • KMSはデータを安全に暗号化するためのサービス • たとえば個人情報を保存したいとき • 秘密情報のデプロイに使うサービスではない • アクセストークン、DBパスワード、サーバ証明書秘密鍵など •

    AWS Systems ManagerのParameter Store, AWS Secrets Managerを使います • これはこれで便利なサービス • APIキーのデプロイはEC2 Roleを使う
  6. 登場する鍵 • Master Key: 頂点となる鍵 • この鍵で直接暗号化できるが、 データ長と時間あたりの処理回 数などに制限がある •

    マイナンバーなど短い文字列な らこれでいける • Data Key: 長いデータの暗号 化に使う • Master Keyで暗号化して保存 • これがenvelope encryption
  7. アプリケーションでの鍵の管理 • Master Key暗号化はAPIに平文を送ると、暗号文が返ってくる • ローカルに鍵を置かないので、管理を考える必要はない • Envelope encryptionはAPIに平文の鍵と暗号化された鍵をリク エストする

    • 「平文の鍵で暗号化」して、「暗号化された鍵を保存」する • 平文の鍵は/tmpに置いたりせず、オンメモリで処理を完了させる • ではAPIリクエストするためのキーは? • 流出すると鍵が入手できてしまうので、暗号化の意味がない • EC2 Instance Roleでインスタンスに権限を付与しましょう
  8. データキーによる暗号化 • GenerateDataKeyでデータ キーを要求すると、平文の鍵 と暗号化された鍵が返る • 暗号化したいデータを「平文 の鍵」で暗号化し、暗号化さ れたデータとセットで「暗号 化された鍵」を保存する

    • 暗号化は自分で行う • 平文鍵の処理はすべてオンメモ リで行う
  9. データキーによる復号 • Decryptに暗号化された鍵を 送ると、平文の鍵が返る • 返ってきた鍵で暗号化された データを復号する • 復号も自分でやる •

    平文の鍵はやはりオンメモリで 処理する必要がある
  10. Encryption context? • KMS Encrypt APIのリクエスト構造は以下の通り { "EncryptionContext": { "string"

    : "string" }, "GrantTokens": [ "string" ], "KeyId": "string", "Plaintext": blob } • Encryption Contextという引数を与えることができる • これは何だろう?
  11. 認証付き暗号 • 鍵が共通なので、攻撃者が何らかの方法で暗号文を入手した場合、 暗号を解読できてしまう • ターゲットの暗号文カラムを自分の行にコピーできた場合など • 秘匿性(Confidentiality)しか満たされない • 「混乱した使節」(confused

    deputy) • Encryption contextつきの暗号文は、復号に同じcontextが必要 • これが「追加認証データ」(AAD; Additional Authenticated Data) • UIDなどを使うことが多い • 暗号時に認証するので「認証付き暗号」(AEAD; Authenticated Encryption with Associated Data) • 完全性(Integrity), 可用性(Availability)が満たされる • 可用性は「認可された人が」常に使えるという意味
  12. まとめ • データを暗号化して保存するときはKMSを利用すべき • 暗号アルゴリズムは(今のところ)256bit AESが鉄板 • その上で、鍵の管理方法だけ注意すれば良い • ユーザーデータのように一意キーが使える場合は、認証付き暗

    号を積極的に利用しよう
  13. 参考資料 • だいたいこのあたりを見ればわかります • 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/