« 2月は エンタープライズアプリ&アーキテクチャ点検月間!〜2月のAWS Black Belt Tech Webinarのご案内 | メイン | AWS IoT で WebSocket、カスタム キープアライブ インターバルがサポートされ、コンソールが機能強化されました »

AWS KMSを利用してセンシティブデータを保護する方法

AWS Key Management Service (AWS KMS)は2015年11月のローンチからめでたくも1周年を迎え、あらゆる大きさの組織が自身の暗号鍵を効果的に管理しています。KMSはまた最新(2015年8月)の SOC アセスメントと同様にPCI DSS 3.1 Level 1アセスメントを無事完了しています。

お客様によく頂く質問の一つとして、「どうやってカード会員番号(PAN:Primary Account Number)データを暗号化すればいいですか?」というものがあります。お客様はKMSからエクスポート可能なカスターマーデータキー(CDK)を使ってPANデータを暗号化することもできますし、カスタマーマスターキー(CMK)を利用してPANデータを直接暗号化する形でKMSを利用することも出来ます。この記事では、AWS CLIを通じてKMSでCMKを使ってどのようにしてセンシティブなPANデータを保護できるかについてお伝えします。

 

データを直接暗号化するCMKの利用は、開発者が暗号化ライブラリを管理しなければならないという負担を取り除きます。加えて、CMKはKMSからエクスポート出来ないため、誰かが暗号鍵をセキュアでない場所に保存するかも知れないという懸念を緩和します。また、鍵の使用状況を記録するためにAWS CloudTrailを活用することが出来ます。
 
この記事の目的を達成するため、ここでは暗号化処理中のPANデータのセキュリティを確保するための3つの異なるIAMロールを定義します:
  1. KeyAdmin – 一般的な鍵の管理者ロール。KMSの鍵を作成し、管理する役割を持ちます。鍵管理者は直接鍵を利用して暗号化/復号化するための関数を利用する権限を持ちません。管理者は鍵のポリシーを変更できる権限を持つことに注意して下さい。鍵の直接利用を許可するよう管理者はポリシーを変更することができます。
  2. PANEncrypt – CMKを利用したオブジェクトの暗号化のみが可能なロール
  3. PANDecrypt – CMKを利用したオブジェクトの復号化のみが可能なロール
センシティブPANデータを暗号化するためのCMKをまだ持っていない場合は、以下のコマンドで作成できます。(この記事を通して、 赤字のプレースホルダテキストはお客様固有の情報に置き換える必要があることを覚えて置いて下さい。)
$ aws kms create-key --profile KeyAdmin --description "Key used to encrypt and decrypt sensitive PAN data" --policy file://Key_Policy

このコマンドで --profile KeyAdmin を利用していることに注意して下さい。 ここでは、KMSでの鍵作成を許可するように構成ファイルで指定されたロールでコマンドを実行することを強制しています。KMSの鍵を操作し、利用するために、後続のキーポリシーで定義された複数のロールが使われる場合があります(上記のコマンドでは file://Key_Policy を参照しています)。CLIにおけるロールの利用についての詳細は、Assuming a Roleを参照して下さい。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowAccessForKeyAdministrators",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/KeyAdmin"   
      },
      "Action": [
        "kms:Create*",
        "kms:Describe*",
        "kms:Enable*",
        "kms:List*",
        "kms:Put*",
        "kms:Update*",
        "kms:Revoke*",
        "kms:Disable*",
        "kms:Get*",
        "kms:Delete*",
        "kms:ScheduleKeyDeletion",
        "kms:CancelKeyDeletion"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowEncryptionWithTheKey",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/PANEncrypt"
      },
      "Action": [
        "kms:Encrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowDecryptionWithTheKey",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/PANDecrypt"
      },                             
      "Action": [
        "kms:Decrypt",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    }
  ]
}

新しいCMKを作成した後、利用する際に区別しやすいようにエイリアスをアサインすることが可能です。ここでは、次に示すコマンドで SensitivePANKey というエイリアスを定義しています。

$ aws kms create-alias --profile KeyAdmin --alias-name alias/SensitivePANKey --target-key-id arn:aws:kms:us-east-1:123456789012:key/221c9ce1-9da8-44e9-801b-faf1EXAMPLE 

ここで、管理・利用を制限した最小限の特権許可を持つCMKが出来たので、PANデータの暗号化への利用を始めることが出来ます。シンプルに進めるために、この記事では AWS CLI コマンドを利用します。もちろん、アプリケーションに組み込んだAWS SDKを通して行うことも可能です。

次のCLIコマンドは、PANEncryptロールを利用して、先ほど作成した鍵を使って文字列(ここでは、“Sensitive PAN Data”)データを暗号化し、Base64エンコードした暗号文を新しく作成したencrypted-123-1449012738というファイルに保存します。更なる暗号化データ保護の為にEncryptionContextも利用している事に注意して下さい。
$ aws kms encrypt --profile PANEncrypt --key-id alias/SensitivePANKey --plaintext "Sensitive PAN Data" --query Ciphertextblog --encryption-context UserName=user@domain.com,Date=1449012738 --output text | base64 --decode > encrypted-123-1449012738

EncryptionContextは、復号化する際に必ず一致している必要があるため、オブジェクトを復号する際にEncryptionContextを再生成しやすいようユニークな名前を付与しています。ファイル名の構造はencrypted-GUID-Dateの形式です。GUIDはユーザのUserNameを私の環境にあるディレクトリの中から検索するためのものです。また、日付をコンテキストの一部として利用しています。Greg Rubinが他のAWS Security Blog post(日本語訳)で述べているように、EncryptionContextは暗号化データの完全性を保証するのに役立ちます。

この暗号化オブジェクトをAmazon S3バケットにputするために次のコマンドを使います。

$ aws s3 cp encrypted-123-1449012738 s3://Secure-S3-Bucket-For-PAN/ --region us-west-2 --sse aws:kms
ここでは、保存するオブジェクトの更なる保護のため、SSE-S3暗号化を再度使っています。この例ではSSE-S3暗号化をそのまま利用していますが、別のKMS鍵を利用することも可能です。次に、S3内のこの暗号化オブジェクトの位置をデータベースにアップデートします。PANデータを取り出す際には、S3バケットから暗号化されたオブジェクトを取り出すために次のCLIコールを発行します。
$ aws s3 cp s3://Secure-S3-Bucket-For-PAN/ encrypted-123-1449012738 . --region us-west-2

最後に、オブジェクトを復号化するために、PANDecrypt ロールを使って次のコマンドを実行します。

$ echo “Decrypted PAN Data: $(aws kms decrypt --profile PANDecrypt --ciphertext-blob fileb://encrypted-123-1449012738 --encryption-context UserName=user@domain.com,Date=1449012738 --output text --query Plaintext | base64 --decode)”

PANデータを暗号化する際に利用したものと同じEncryptionContextを利用していることに注意して下さい。このEncryptionContextを取得するため、再度GUIDからUserNameを検索し、日付を含めています。 例としてお見せする目的で、ここではセンシティブデータを出力に表示していますが、実際の例では他のアプリケーションやサービスに渡す事になります。.

ここでは、KMSでセンシティブなPANデータを直接暗号化および復号化でき、アプリケーションの中の1つのサービスとしてロールアウトできる事をお見せしました。このサービ社、実際2つの異なるコンポーネットのサービスで構成されます:1つは暗号化を提供し、もう1つは暗号化周りの拡張されたコントロールを提供し、センシティブデータの復号に利用されます。これらのコンポーネントサービスは、暗号文、メタデータ、エラー条件等の保管場所を指し示します。CloudTrailとKMSのインテグレーションとアプリケーションのログにより、サービスの呼び出しやKMS鍵の、組織内での利用について詳細を記録することができます。

この記事について質問やコメントがある場合は、KMS forumにお問い合わせ下さい。

- Matt(翻訳はSA布目が担当しました。原文はこちら)

コメント

Twitter, Facebook

このブログの最新情報はTwitterFacebookでもお知らせしています。お気軽にフォローください。

2018年4 月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30