・AWS Key Management Service(KMS)
暗号化に使用する鍵(キー)を作成・管理するサービス。通常は、暗号化を行う対象のサービス(Amazon S3やEBS、Amazon Redshiftなど)と連携して利用。
KMSはAWS CloudTrailと連携しており、鍵の使用ログ(いつどのサービスで鍵が使用されたか)が記録されるため、鍵の利用状況を監査することができます。
■暗号化の仕組み
KMSでは「CMK(Customer Master Key:カスタマーマスターキー)」「CDK(Customer Data Key:カスタマーデータキー)」と呼ばれる2種類の鍵を使用してデータの暗号化および復号を行います。このように二段階で鍵を保護する方式を「エンベロープ暗号化(Envelope Encryption)」といいます。
「CMK」はCDKを暗号化する際に使用し、「CDK」はデータを暗号化する際に使用。
CDKは通常、暗号化を行う対象のサービスごとに作成します。これにより、1つのCDKが漏洩したとしても他のCDKで暗号化されたサービスへは影響しません。また、CDKをCMKで暗号化することによって、運用時に頻繁に使用されるCDKを保護します。
・CMKの種類
CMKには「AWSマネージド型」「カスタマーマネージド型」の2種類があります。
通常、AWSによって作成・管理されるものは「AWSマネージド型」であり、ユーザーは削除できません。AWSマネージド型の鍵は、連携したEBSやRedshiftなどのサービスで暗号化を利用したタイミングでAWSが作成。
一方、カスタマーマネージド型のCMKはユーザーが作成・削除、および管理を行います。ただし作成した鍵を長期間利用するのはセキュリティ上危険なため、KMSでは鍵の自動ローテーション(定期的な更新)をサポートしています。
・AWS Secrets Managerとの連携
Secrets Managerは、データベースなどにアクセスする際のシークレット(ログイン時の認証情報など)を管理するサービス。アプリケーションなどからAWSリソースへアクセスする際にSecrets Managerからシークレットを取得することにより、ログイン情報をアプリケーションにハードコーディングしたり平文で入力しておく必要がありません。また、シークレットは定期的に更新(ローテーション)されたりバージョン管理も行われます。
KMSと連携すると、シークレットを保護するためにCDKが使用されます。ローテーションが行われるたびCDKも新しいものが自動的に生成されるため、高いセキュリティの認証を実現できます。
■キーポリシー
キーポリシーは、カスタマーマネージド型のCMKへ適用するリソースベースのポリシーです。鍵に対して、IAMユーザーまたはIAMロール、他のAWSアカウントへの操作可能な権限を設定します。
・鍵の使用と鍵の共有
鍵の作成者とは異なるIAMユーザーやIAMロールが、鍵を使って暗号化や復号をしたい場合、キーユーザーとして使用者を追加できます。
また、別のAWSアカウントで鍵を使用したい場合は、対象のアカウントと鍵を共有します(クロスアカウント)
暗号化されたAMIやデータベースのスナップショットなどを他のアカウントと共有する際に利用します。
なお、使用者の追加や共有ができる鍵はカスタマーマネージド型のCMKのみです。AWSマネージド型の鍵はキーポリシーを編集できないため他アカウントと共有できません。
・インラインポリシー
IAMポリシーと同様に、キーポリシーはインラインポリシーでも定義できます。
キーポリシーでは、例えば、ユーザーAが暗号化したリソースをユーザーBが復号したい場合には"kms:Decrypt"を設定するなど、細かな権限設定を行えます。IAMポリシーと同様に、最小の権限で運用することが望ましいです。
なお、ユーザーやリソースに対して鍵の利用を許可する際は、キーポリシーだけでなく、IAMポリシーでも同じように権限を設定できます。
■サーバー側の暗号化とクライアント側の暗号化
データの暗号化・復号はサーバーまたはクライアントのいずれかで行われます。
サーバー側の暗号化(Server-Side Encryption:SSE)は、AWS(サービス提供側=サーバー側)にデータが保存されるタイミングで暗号化が行われ、ユーザーがデータを取り出す際もサーバー側が復号して渡します。
一方、クライアント側の暗号化は、サーバーへデータを送信する前にクライアント側で暗号化を行い、サーバー側では受け取ったデータをそのまま保存します。また、データの復号もクライアント側で行います
AWS側で暗号化が行われる場合はほとんどがサーバー側の暗号化です。クライアント側の暗号化は、通信回線のセキュリティに不安があるなどユーザーが自主的に暗号化したいケースで使用されます。また、クライアント側の暗号化は、暗号化および復号をユーザー側で行うため、鍵の利用状況のチェックや監査などもユーザー自身が行う必要があります。なお、クライアント側の暗号化を行うにはAWS SDK(ソフトウェア開発キット)を使用します。
・AWS CloudHSM
AWS CloudHSMでは、専用のハードウェアデバイスを用いて暗号化鍵を生成・管理します。貸し出されるハードウェアは世界的な暗号化ハードウェアの規格(FIPS 140-2 のレベル 3)で認証済みのため、信頼性の高さが強みです。
なお、「CloudHSM」のHSM(Hardware Security Module)とは、データセキュリティを高めるための暗号鍵を保護しつつ運用するデバイスのことです。
KMSでは鍵の管理はAWS側で行われるのに対して(フルマネージド)、CloudHSMでは鍵の生成や保管・削除などのライフサイクル管理はユーザー自身が行います。運用面においても、CloudHSMは他のAWSユーザーと分離するためにAmazon VPC内にプロビジョニングする必要があるなど、KMSよりもセキュアな運用が求められます。
なお、CloudHSMでは専用のハードウェアを使用する分、KMSと比べると利用料金が高価に設定されています。
法令や規制等の要件で、認定を受けたハードウェアで暗号化鍵を管理する必要があるようなケースでは、CloudHSMを使用します。