web-dev-qa-db-ja.com

AWS KMSを安全に使用するには?

AWS KMS(Amazon Web Services Key Management Service)を使用して、暗号化された対称キー(つまり、エンベロープ暗号化)を復号化することを調査しています。ただし、KMSを使用するには、Amazonアクセスキーとシークレットキーを渡す必要があります。

したがって、サーバーに平文対称キーを保存しなくなりましたが、暗号化されたキーとAWSアクセスキーを保存しています...これは、そこに平文を保存することと本質的に同じではありませんか?私のサーバーにアクセスできる人は、暗号化されたキーと私のAmazonアクセスキーを受け取り、Amazonにそれを復号化するように要求するだけで済みますか?

16
Vanita

サーバーがEC2にある場合、IAMを使用してそのサーバーのロールを作成し、サーバーにAWSアクセスキーがなくてもKMSにアクセスできるようにすることができます。

http://docs.aws.Amazon.com/kms/latest/developerguide/control-access.html

6
grook5

実際、あなたの言うとおり、サーバーにアクセスできる人なら誰でもプレーンテキストのキーを取得できます。

基本的に、アプリケーションはプレーンテキストのキーを取得できる必要があります。したがって、アプリケーションを完全に侵害する攻撃もプレーンテキストのキーを取得できるようになります。しかし、それはKMSの目的ではありません。

KMSは、キー管理、特にキーの管理、生成、暗号化、および復号化のためのものです。 AWSにはシークレットを管理するためのシークレットマネージャーがあり、すべてのキーはシークレットである必要がありますが、すべてのシークレットがキーであるとは限りません。

KMSを使用して、次のことができます。

  1. カスタマーマスターキー(CMK)を生成します。 CMKはプレーンテキストで取得できないため、KMSでは非常に特殊です。 KMSは、CMKを使用してプレーンテキストのみを暗号化/復号化できますが、CMK自体を明らかにすることはありません。 KMSは、CMKで暗号化/復号化できるデータの量を、リクエストごとに4kB未満に制限します。
  2. データキー(DK)を生成します。 DKは任意の長さのキーにすることができます。 DKを生成すると、KMSはbothのプレーンテキストキーと、特定のCMK(指定されたリクエスト中)。
  3. CMKを管理します。 CMKを使用するアクセス権を持つユーザーを制御できるようにすることで、アカウントなどのKMS内のすべてのCMKを一覧表示します。
  4. CMKをローテーションします。デフォルトでは、すべてのCMKは毎年ローテーションされますが、AWSがCMKを削除することはありません。 CMKの削除は厄介なプロセスであり、正当な理由により、CMKの損失はAWSリソースに重大な影響を与える可能性があります。
  5. CMKを無効にします。必要に応じて、CMKを無効にすることができます。これにより、CMKを使用できなくなり、それによって暗号化されたDKは使用できなくなります。

cMK(平文では決して公開されません)とDK(プレーンテキストと暗号化形式の両方で公開されます)を区別することは非常に重要です。 CMKは別のキーの暗号化に使用されるキーです。DKはデータの暗号化に使用するキーです。この概念が明確になったら、次に進みましょう。

KMSとは何ですか?

KMSは安全な方法でキーを生成できます。 OWASPはソフトウェアの代わりに キーを生成するためにハードウェアモジュールを使用 を推奨し、FIPS140-2であるKMS 準拠 はこれを行います。ソフトウェアで手動でキーを生成している場合、それは最善の方法ではありません。

また、大規模なキーの生成は簡単ではありません。いくつかのユースケースでは、一意のメッセージ/トランザクションごとに異なるキーを生成することが重要です。KMSは、それを正確に行うためのAPIを提供します。

KMSはそのキーを秘密に保ちます。対称キー暗号化の難点の1つは、キーを秘密に保つことです。したがって、KMSのようなサービスを使用すると、CMKが平文で公開されることがなく、管理が簡単になります。

最後に、KMSはキーのアーカイブに役立ちます。 KMSはデフォルトですべてのCMKを永続的に保持します。鍵をローテーションアウトしても、古いCMKを明示的に削除していなければ、KMS内の古いDKを復号化できます。

それはどのように役立ちますか?

ユースケースでは、サーバーを危険にさらす攻撃者は依然として必要なものにアクセスできます。したがって、KMSはこの特定の脅威に対処していません。

ただし、これにより、問題のEC2サーバーのみからのKMSへの呼び出しを制限できます。したがって、機密データを含むファイルを誤ってS3バケットにバックアップした場合などは、データが暗号化され、KMS上のCMKにアクセスしないと復号化できないため、役に立ちます。

しかし、それはおそらくそれが主なユースケースではありません。

KMSの使用例

暗号化されたバックアップなどが必要な場合は、KMSが最適です。どこ:

  1. データをバックアップする
  2. KMSを入手してDKを生成します
  3. バックアップをDKで暗号化し、プレーンテキストを破棄します。
  4. 暗号化されたDKを使用してバックアップデータをどこかに保存します(安全でない場合があります)。

復元したい場合は、プロセスを逆にするだけです。

  1. 暗号化されたDKを取得して、バックアップをダウンロードします
  2. KMSを使用してDKを復号化する
  3. 復号化されたDKを使用してデータを復号化する
  4. バックアップにアクセスしてください!

この使用例では、暗号化されたデータはKMSにまったくアクセスできないサーバーに保存され、鍵の管理にはKMSを使用しています。

シークレットマネージャーを試す

ユースケースに戻って、AWSシークレットマネージャーをお勧めします。これは、呼び出されて問題のキーを返すだけの単純なAPIです。これにより、キーは暗号化された形式でもボックスに保存されません。

コードはAPIを呼び出し、キーを取得し、それを実行して終了します。キーを交換する必要がある場合は、Secrets Managerで中央で変更して、続行できます。

Secrets ManagerはKMSよりも安価で、間違いなく使用が簡単です。

3
keithRozario