暗号化モードと転送時の強制

開発者のための AWS セキュリティ活用

Rahul Singh

Technical Product Manager

2つの保証、1つのデフォルト

アプリケーションが Amazon S3 バケットにオブジェクトを送信します。緑色の括弧「転送時」がネットワーク区間を示し、もう一つの緑色の括弧「保存時」が保存されたオブジェクトを示しています。その上に、リクエストで別の指定がない限り SSE-S3 が適用されるという注記があります。

  • 保存時: ディスク上のバイト
  • 転送時: ネットワーク上のバイト
開発者のための AWS セキュリティ活用

2つの保証、1つのデフォルト

アプリケーションが Amazon S3 バケットにオブジェクトを送信します。緑色の括弧「転送時」がネットワーク区間を示し、もう一つの緑色の括弧「保存時」が保存されたオブジェクトを示しています。その上に、リクエストで別の指定がない限り SSE-S3 が適用されるという注記があります。

  • 保存時: ディスク上のバイト
  • 転送時: ネットワーク上のバイト
  • すでに完了: 新しいオブジェクトには常に SSE-S3 が適用されます
  • まだ残っている: どのモードを使うか、鍵を誰が管理するか
開発者のための AWS セキュリティ活用

平文はどこで終わるか

サーバーサイド

  • AWS が読み取り可能なバイトを受け取ります
  • S3 が書き込み時に暗号化します

 

サーバーサイドのフローです。プロセスが平文を保持したまま TLS 通信で送信し、Amazon S3 が書き込み時に暗号化します。下部のバーはバイトの状態を示し、S3 の位置で破線により区切られています。手前の区間は「ここまでは読み取り可能」とラベル付けされ赤色で、その後の区間は「暗号文」とラベル付けされ緑色で示されています。

 

開発者のための AWS セキュリティ活用

平文はどこで終わるか

サーバーサイド

  • AWS が読み取り可能なバイトを受け取ります
  • S3 が書き込み時に暗号化します

クライアントサイド

  • 送信前に自分で暗号化します
  • AWS は暗号文のみを保存します

サーバーサイドのフローです。プロセスが平文を保持したまま TLS 通信で送信し、Amazon S3 が書き込み時に暗号化します。下部のバーはバイトの状態を示し、S3 の位置で破線により区切られています。手前の区間は「ここまでは読み取り可能」とラベル付けされ赤色で、その後の区間は「暗号文」とラベル付けされ緑色で示されています。

クライアントサイドのフローです。プロセスが先に暗号化し、暗号文を TLS 通信で送信し、Amazon S3 は受け取ったものをそのまま保存します。下部のバーはバイトの状態を示し、プロセス内部で破線により区切られています。手前の短い区間は「ここまでは読み取り可能」とラベル付けされ赤色で、それ以降はすべて「暗号文」とラベル付けされ緑色で示されています。

開発者のための AWS セキュリティ活用

4つのモード、1つの違い

同じアルゴリズム、4つの鍵の所有者

  • モードは PUT リクエストのヘッダーとして渡されます
  • SSE-S3: AWS の鍵を使用し、管理は不要です
  • SSE-KMS: 自分の鍵、CloudTrail による記録、そして誰に応答するかを定めたキーポリシーが鍵に紐づきます

SSE-S3、SSE-KMS、DSSE-KMS、SSE-C という名前の4枚のカードが積み重なっています。左側のレールは上部の「AWS 管理」から下部の「自分で管理」へと続き、各カードにはそのモードを選択するリクエストヘッダーの値だけが記載されています。

開発者のための AWS セキュリティ活用

4つのモード、1つの違い

同じアルゴリズム、4つの鍵の所有者

  • モードは PUT リクエストのヘッダーとして渡されます
  • SSE-S3: AWS の鍵を使用し、管理は不要です
  • SSE-KMS: 自分の鍵、CloudTrail による記録、そして誰に応答するかを定めたキーポリシーが鍵に紐づきます
  • DSSE-KMS: 独立した2つの層で暗号化します
  • SSE-C: リクエストごとに自分の鍵を使用し、管理責任も自分にあります

SSE-S3、SSE-KMS、DSSE-KMS、SSE-C という名前の4枚のカードが積み重なっています。左側のレールは上部の「AWS 管理」から下部の「自分で管理」へと続き、各カードにはそのモードを選択するリクエストヘッダーの値だけが記載されています。

開発者のための AWS セキュリティ活用

SSE-KMS のコストへの懸念

2つの行があります。バケットキーを使わない場合、オブジェクトのリクエストごとに Amazon S3 から AWS KMS へ矢印が伸び、合計6本の矢印があります。バケットキーを使う場合、S3 内部で保持されるバケットレベルの鍵から1本の矢印だけが伸びます。下部の注記には、バケットキーは DSSE-KMS では利用できないと記載されています。

  • 使わない場合: オブジェクトごとに KMS を1回呼び出します
  • バケットキーを使う場合: 短命な鍵を1つ使い回します
  • DSSE-KMS では利用できません
  • KMS リクエストを最大99%削減できます
開発者のための AWS セキュリティ活用

テーブルではなくフィールドを暗号化する

保存時の暗号化はすでに有効

  • 読み取り権限があれば、クエリは誰にでも平文を返します

5つの属性を持つ1つの DynamoDB アイテムです。2つの属性は暗号文を保持し青いレールが付いており、パーティションキー、ソートキー、タイムスタンプは平文のままです。下部の緑色のボックスには、テーブル全体が保存時に暗号化されていると記載されています。

開発者のための AWS セキュリティ活用

テーブルではなくフィールドを暗号化する

保存時の暗号化はすでに有効

  • 読み取り権限があれば、クエリは誰にでも平文を返します

AWS Database Encryption SDK

  • コード内で選択した属性を暗号化します
  • DynamoDB がアイテムの検索に使うパーティションキーとソートキーは、インデックスとして使われるため平文のままです

5つの属性を持つ1つの DynamoDB アイテムです。2つの属性は暗号文を保持し青いレールが付いており、パーティションキー、ソートキー、タイムスタンプは平文のままです。下部の緑色のボックスには、テーブル全体が保存時に暗号化されていると記載されています。

開発者のための AWS セキュリティ活用

TLS は提供されるが必須ではない

提供されるが強制はされない

  • S3 は HTTP にも HTTPS にも同様に応答します

2つのシナリオです。バケットに条件を設定しない場合、HTTPS クライアントと HTTP クライアントのどちらもオブジェクトに到達します。拒否条件を設定すると、HTTP の経路は赤い×印で止まり、接続できません。

開発者のための AWS セキュリティ活用

TLS は提供されるが必須ではない

提供されるが強制はされない

  • S3 は HTTP にも HTTPS にも同様に応答します

必須にする

  • バケットポリシー: aws:SecureTransport が false の場合に拒否します
  • 正規のクライアントには何の影響もありません

2つのシナリオです。バケットに条件を設定しない場合、HTTPS クライアントと HTTP クライアントのどちらもオブジェクトに到達します。拒否条件を設定すると、HTTP の経路は赤い×印で止まり、接続できません。

開発者のための AWS セキュリティ活用

名前を保証するのはどの認証局か

パブリックな名前

  • ACM: 公的に信頼され、無料で、自動更新されます

自分のネットワークでのみ解決される名前

  • AWS Private CA: 自分専用の認証局です
  • パブリックインターネットでは信頼されません

証明書を発行できるのは誰かを示す2枚のカードが積み重なっています。上のカード「パブリックな名前」は、解決する名前として reports.example.com、発行者として ACM を示し、どこでも信頼されます。下のカード「内部名」は admin.example.internal を示し、VPC 内でのみ解決され、発行者は AWS Private CA です。

開発者のための AWS セキュリティ活用

秘密鍵の管理責任は自分にある

誰が保持するか

  • ACM: AWS が保持します
  • EC2 キーペア、またはその他の SSH 鍵: 秘密鍵は一度だけ自分で保持します

どちらの半分を誰が保持するかを示す2枚のカードが積み重なっています。上のカード「公開鍵」は、AWS またはインスタンス上に存在すると示しています。下のオレンジ色のカード「秘密鍵」には3つの行があります。コピーは1つだけで予備はないこと、Secrets Manager に保管することが緑のチェックマークで示されていること、リポジトリやノートパソコン、チャットには決して保存しないことがオレンジの×印で示されていることです。

開発者のための AWS セキュリティ活用

秘密鍵の管理責任は自分にある

誰が保持するか

  • ACM: AWS が保持します
  • EC2 キーペア、またはその他の SSH 鍵: 秘密鍵は一度だけ自分で保持します

自分の鍵なら

  • リポジトリではなく Secrets Manager に保管します
  • 定期的に交換します

どちらの半分を誰が保持するかを示す2枚のカードが積み重なっています。上のカード「公開鍵」は、AWS またはインスタンス上に存在すると示しています。下のオレンジ色のカード「秘密鍵」には3つの行があります。コピーは1つだけで予備はないこと、Secrets Manager に保管することが緑のチェックマークで示されていること、リポジトリやノートパソコン、チャットには決して保存しないことがオレンジの×印で示されていることです。

開発者のための AWS セキュリティ活用

答えは1つではなく3つ

モード、鍵の管理、転送という3つの番号付きカードがあり、それぞれに対応するヘッダーまたは条件キーが示されています。下部の注記には、3番目のチェックだけが暗号化設定の外にあると記載されています。

  1. モード: 何がオブジェクトを書き込んだか
  2. 鍵の管理: このアカウント内外を問わず、誰が復号できるか
  3. 転送: 必須か、提供されるだけか
開発者のための AWS セキュリティ活用

練習しましょう!

開発者のための AWS セキュリティ活用

Preparing Video For Download...