[新サービス]決済用HSMの運用管理を簡素化!AWS Payment Cryptographyがリリースされました

2023.06.16

みなさん、こんにちは。

明るい笑顔がトレードマーク、ルイボスティーが大好きな芦沢(@ashi_ssan)です。

AWSのWhat's newにて、新サービスが発表されていましたのでご紹介いたします。

その名も....

AWS Payment Cryptography

名前からして、決済系の暗号化に関連したサービスだと想起させられますよね。しかし、当然のことながら名前だけでは何をやってくれるサービスなのかわかりません。

まずは、前述したWhat's newやAWSブログ、AWS公式ドキュメントの内容をからどんなサービスなのかを探ってみることにします。

AWS Payment Cryptography とは?

サービス概要

一言で言うと、支払い処理でデータを保護するために使用される暗号化やキーの管理がサーバレスでマネージドに実行できるサービスです。

暗号化やHSM(ハードウェアセキュリティモジュール)というと、AWSではKMSやCloudHSMを想起する方も多いと思いますが、Payment Cryptographyでは単純な暗号化だけでなく、特定のアルゴリズムを利用したカードデータの生成・検証やPINデータの生成・検証が可能です。より支払い用途に特化した暗号化が利用できるのです。

さらに、AWS Payment Cryptographyは、キーの作成・削除などの鍵の管理や諸々の暗号化の操作をAWS API経由で実行できます。AWSのAPIを利用しているということは、IAMやCloudTrailと統合しているため認可や監査要件にも対応しています。皆さんも馴染み深いKMSと似たようなイメージで利用できそうですね。

その他、公式ドキュメントに記載のあった、本サービスの特徴は以下です。ご確認ください。

  • TDES、AES、RSA キーを含む対称および非対称の AWS Payment Cryptography キーを作成および管理し、CVV 生成や DUKPT キー導出などの使用目的を指定します。
  • AWS Payment Cryptography キーを自動的に安全に保存し、ハードウェア セキュリティ モジュール (HSM) で保護しながら、ユースケース間でキーを分離します。
  • エイリアスを作成、削除、一覧表示、更新します。エイリアスは、AWS Payment Cryptography キーへのアクセスまたはアクセス制御に使用できる「フレンドリ名」です。
  • 暗号化キーにタグを付与し、識別、グループ化、自動化、アクセス制御、コスト追跡が可能
  • TR-31 (相互運用可能なセキュアキー交換キーブロック仕様) に準拠したキー暗号化キー (KEK) を使用して、AWS Payment Cryptography と HSM (またはサードパーティ) の間で対称キーをインポートおよびエクスポートできる
  • 非対称キーペアを使用し TR-34 (非対称技術を使用した対称キーの配布方法) などの電子的手段でAWS Payment Cryptography と他のシステムの間で対称キー暗号化キー (KEK) をインポートおよびエクスポートできる

実際に使ってみた

AWSブログでPayment Cryptographyを利用するための簡易手順が紹介されていたので、それを参考に検証してみます。

キーの作成はコンソールからできないので、AWS CLIを利用して始めていきます。現時点では、東京リージョンには対応していないため、バージニア北部リージョンを使って検証を行います。

Payment Cryptography APIのコマンドは2つあり、それぞれ用途が異なります(CLI、SDKのエンドポイントも同様に2つです)。

  • payment-cryptography: 鍵の作成やエイリアスの作成などコントロールプレーンに関する操作を行う
  • payment-cryptography-data: PIN、カード検証データの作成やキーを使用した暗号化などのデータプレーンに関する操作を行う

コントロールプレーンを操作してみる

payment-cryptography APIを利用して、鍵の作成などに関することを色々と試してみようと思います。

コントロールプレーンに関するAPIの一覧についてはこちらのCLIのドキュメントをご覧ください。

キーの作成・削除・リストア

まずはキーの作成を行なっていきます。パラメータはAWSブログと以下同じものを指定します。

  • --no-exportable: 鍵のエクスポートを禁止
  • --key-attributes: 鍵の属性を指定
    • KeyAlgorithm: 2KEY TDESを指定
    • KeyUsage: TR31_C0_CARD_VERIFICATION_KEYを指定(その他の選択肢はAWSドキュメントを参照)
    • KeyClass: 対称キー(SYMMETRIC_KEY)を指定
    • KeyModesOfUse: Generate(生成)、Verify(検証)を有効化
$ aws payment-cryptography create-key \
          --no-exportable \
          --key-attributes KeyAlgorithm=TDES_2KEY,KeyUsage=TR31_C0_CARD_VERIFICATION_KEY,KeyClass=SYMMETRIC_KEY,KeyModesOfUse='{Generate=true,Verify=true}'

{
    "Key": {
        "CreateTimestamp": "2023-06-16T11:15:23.307000+09:00",
        "Enabled": true,
        "Exportable": false,
        "KeyArn": "arn:aws:payment-cryptography:us-east-1:123456789012:key/e6cetu4e3n2tvquo",
        "KeyAttributes": {
            "KeyAlgorithm": "TDES_2KEY",
            "KeyClass": "SYMMETRIC_KEY",
            "KeyModesOfUse": {
                "Decrypt": false,
                "DeriveKey": false,
                "Encrypt": false,
                "Generate": true,
                "NoRestrictions": false,
                "Sign": false,
                "Unwrap": false,
                "Verify": true,
                "Wrap": false
            },
            "KeyUsage": "TR31_C0_CARD_VERIFICATION_KEY"
        },
        "KeyCheckValue": "C9B06C",
        "KeyCheckValueAlgorithm": "ANSI_X9_24",
        "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
        "KeyState": "CREATE_COMPLETE",
        "UsageStartTimestamp": "2023-06-16T11:15:23.285000+09:00"
    }
}

鍵の削除はdelete-key --key-identifier "キーのARN"コマンドで実行できます。即時での削除は行われず、KeyStateがDELETE_PENDINGというステータスに変更されてそのまま残ります。削除対象としてマークされ、実際の削除は7日後に実行されます。誤って削除してしまっても安心ですね。

$ aws payment-cryptography delete-key --key-identifier "arn:aws:payment-cryptography:us-east-1:123456789012:key/cqmdbqoxgc3ukl7v"

{
    "Key": {
        "CreateTimestamp": "2023-06-16T11:14:34.879000+09:00",
        "DeletePendingTimestamp": "2023-06-23T11:19:28.118000+09:00",
        "Enabled": true,
        "Exportable": false,
        "KeyArn": "arn:aws:payment-cryptography:us-east-1:123456789012:key/cqmdbqoxgc3ukl7v",
        "KeyAttributes": {
            "KeyAlgorithm": "TDES_2KEY",
            "KeyClass": "SYMMETRIC_KEY",
            "KeyModesOfUse": {
                "Decrypt": false,
                "DeriveKey": false,
                "Encrypt": false,
                "Generate": true,
                "NoRestrictions": false,
                "Sign": false,
                "Unwrap": false,
                "Verify": true,
                "Wrap": false
            },
            "KeyUsage": "TR31_C0_CARD_VERIFICATION_KEY"
        },
        "KeyCheckValue": "C11BE0",
        "KeyCheckValueAlgorithm": "ANSI_X9_24",
        "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
        "KeyState": "DELETE_PENDING",
        "UsageStartTimestamp": "2023-06-16T11:14:34.835000+09:00"
    }

list-keysコマンドで鍵の一覧を取得できます。

$ aws payment-cryptography list-keys

{
    "Keys": [
        {
            "Enabled": true,
            "Exportable": false,
            "KeyArn": "arn:aws:payment-cryptography:us-east-1:123456789012:key/e6cetu4e3n2tvquo",
            "KeyAttributes": {
                "KeyAlgorithm": "TDES_2KEY",
                "KeyClass": "SYMMETRIC_KEY",
                "KeyModesOfUse": {
                    "Decrypt": false,
                    "DeriveKey": false,
                    "Encrypt": false,
                    "Generate": true,
                    "NoRestrictions": false,
                    "Sign": false,
                    "Unwrap": false,
                    "Verify": true,
                    "Wrap": false
                },
                "KeyUsage": "TR31_C0_CARD_VERIFICATION_KEY"
            },
            "KeyCheckValue": "C9B06C",
            "KeyState": "CREATE_COMPLETE"
        },
        {
            "Enabled": true,
            "Exportable": false,
            "KeyArn": "arn:aws:payment-cryptography:us-east-1:123456789012:key/cqmdbqoxgc3ukl7v",
            "KeyAttributes": {
                "KeyAlgorithm": "TDES_2KEY",
                "KeyClass": "SYMMETRIC_KEY",
                "KeyModesOfUse": {
                    "Decrypt": false,
                    "DeriveKey": false,
                    "Encrypt": false,
                    "Generate": true,
                    "NoRestrictions": false,
                    "Sign": false,
                    "Unwrap": false,
                    "Verify": true,
                    "Wrap": false
                },
                "KeyUsage": "TR31_C0_CARD_VERIFICATION_KEY"
            },
            "KeyCheckValue": "C11BE0",
            "KeyState": "DELETE_PENDING"
        }
    ]
}

削除対象としてマークされた鍵のリストアはrestore-key --key-identifier "キーのARN"で実行できます。リストア実行後、KeyStateがCREATE_COMPLETEに変更されていることがわかります。

$ aws payment-cryptography restore-key --key-identifier "arn:aws:payment-cryptography:us-east-1:123456789012:key/cqmdbqoxgc3ukl7v"

{
    "Key": {
        "CreateTimestamp": "2023-06-16T11:14:34.879000+09:00",
        "Enabled": true,
        "Exportable": false,
        "KeyArn": "arn:aws:payment-cryptography:us-east-1:123456789012:key/cqmdbqoxgc3ukl7v",
        "KeyAttributes": {
            "KeyAlgorithm": "TDES_2KEY",
            "KeyClass": "SYMMETRIC_KEY",
            "KeyModesOfUse": {
                "Decrypt": false,
                "DeriveKey": false,
                "Encrypt": false,
                "Generate": true,
                "NoRestrictions": false,
                "Sign": false,
                "Unwrap": false,
                "Verify": true,
                "Wrap": false
            },
            "KeyUsage": "TR31_C0_CARD_VERIFICATION_KEY"
        },
        "KeyCheckValue": "C11BE0",
        "KeyCheckValueAlgorithm": "ANSI_X9_24",
        "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
        "KeyState": "CREATE_COMPLETE",
        "UsageStartTimestamp": "2023-06-16T11:14:34.835000+09:00"
    }
}

エイリアスの作成・更新・削除

create-alias --alias-name "alias/任意の名前" --key-arn "キーのARN"コマンドでエイリアスを作成できます。

$ aws payment-cryptography create-alias --alias-name "alias/test-ashisan" --key-arn "arn:aws:payment-cryptography:us-east-1:123456789012:key/cqmdbqoxgc3ukl7v"

{
    "Alias": {
        "AliasName": "alias/test-ashisan",
        "KeyArn": "arn:aws:payment-cryptography:us-east-1:123456789012:key/cqmdbqoxgc3ukl7v"
    }
}

エイリアスはキーのARNを指定しなくとも作成できます。

$aws payment-cryptography create-alias --alias-name "alias/alias-test"

{
    "Alias": {
        "AliasName": "alias/alias-test"
    }
}

一旦ARN指定なしで作成しておいて、エイリアスの情報をupdate-aliasコマンドを使って後で更新することもできます。

$ aws payment-cryptography update-alias --alias-name "alias/alias-test" --key-arn "arn:aws:payment-cryptography:us-east-1:123456789012:key/e6cetu4e3n2tvquo"

{
    "Alias": {
        "AliasName": "alias/alias-test",
        "KeyArn": "arn:aws:payment-cryptography:us-east-1:123456789012:key/e6cetu4e3n2tvquo"
    }
}

エイリアスの削除はdelete-alias --alias-name "エイリアス名"で実行できます。

$ aws payment-cryptography delete-alias --alias-name "alias/alias-test"

(出力なし)

エイリアスの一覧はlist-aliasesコマンドで取得できます

$ aws payment-cryptography list-aliases

{
    "Aliases": [
        {
            "AliasName": "alias/test-ashisan",
            "KeyArn": "arn:aws:payment-cryptography:us-east-1:123456789012:key/cqmdbqoxgc3ukl7v"
        }
    ]
}

注意点としてここで指定できるエイリアスは、APIを実行した際のCloudWatch Logsや他の出力に表示されてしまうことがある点に気をつけてください。センシティブな情報や機密情報をエイリアスに含めないように気をつけましょう。

※create-aliasのAWS CLIドキュメントに注意書きがありました。

その他できること

その他payment-cryptographyAPIを利用して以下のようなことができるようです。ぜひ試してみてください。

  • 鍵の利用の停止/開始(start-key-usage, stop-key-usage)
  • パラメータのエクスポート/インポート(get-parameters-for-export, get-parameters-for-import)
  • 鍵のエクスポート/インポート(export-key, import-key)

データプレーンを操作してみる

続いて、payment-cryptography-data APIを利用してデータプレーンに関する操作を色々と試してみます。

データプレーンに関するAPIの一覧についてはこちらのCLIのドキュメントをご覧ください。

前述した手順でクレジットカードデータに関するキーの作成を行なっていたこともあり、今回はそのキーを使った検証を行います。

クレジットカードセキュリティコード(CVV2)の生成と認証

クレジットカードセキュリティコードとは、クレジットカードの裏面に存在する3桁の数字を指し、カード会社や用途によって名前が少し異なります(CVV、CVV2、CVC、CVC2などたくさんある)

※CVV2は、VISAのクレジットカードセキュリティコードのことを指し、CVVと異なりオンラインでの決済に使用されます。(参考リンク: マネカツ - クレジットカードのCVV番号とは?CVCとの違いや記載場所を紹介)

generate-card-validation-dataコマンドでCVV2(Credit Validation Value)を生成します。

以下のパラメータを指定しています。

  • --key-identifier: 使用するキーのARNを指定
  • --primary-account-number: クレジットカード番号を指定
  • --generation-attributes: カード情報の属性を指定
    • CardVerificationValue2: CVV2のカードパラメータを指定(今回はカードの有効期限)
$ aws payment-cryptography-data generate-card-validation-data \
    --key-identifier alias/test-ashisan \
    --primary-account-number 171234567890123 \
    --generation-attributes CardVerificationValue2={CardExpiryDate=0124}

{
    "KeyArn": "arn:aws:payment-cryptography:us-east-1:123456789012:key/cqmdbqoxgc3ukl7v",
    "KeyCheckValue": "C11BE0",
    "ValidationData": "055"
}

上記コマンドの出力でKeyのARNの他に2つのパラメータが表示されていますね。

KeyCheckValueは、暗号化キーのキーチェック値です。これはキーを保持している人たちが同じキーを持っていることを特定するために利用でき、キーの変更検知の用途で使用できます。 ValidationDataとして、Payment Cryptography APIが生成したCVV値が出力されています。

続いて、生成したCVV値を利用して、カード情報の検証を行います。

CVVの生成で利用したパラメータの他にAPIで生成したCVV値を入力しています。

$ aws payment-cryptography-data verify-card-validation-data \
    --key-identifier alias/test-ashisan \
    --primary-account-number=171234567890123 \
    --verification-attributes CardVerificationValue2={CardExpiryDate=0124} \
    --validation-data 055

{
    "KeyArn": "arn:aws:payment-cryptography:us-east-1:123456789012:key/cqmdbqoxgc3ukl7v",
    "KeyCheckValue": "C11BE0"
}

結果、コマンドが正常終了し、キーに関するパラメータが出力されました。

CVV値が誤っていると以下のようにエラーとなります。

$ aws payment-cryptography-data verify-card-validation-data \
                --key-identifier alias/test-ashisan \
                --primary-account-number=171234567890123 \
                --verification-attributes CardVerificationValue2={CardExpiryDate=0124} \
                --validation-data 999

An error occurred (com.amazonaws.paymentcryptography.exception#VerificationFailedException) when calling the VerifyCardValidationData operation: Card validation data verification failed.

その他できること

今回の検証が以上としますが、generate-card-validation-dataコマンドを利用するとその他以下のようなことが可能です。

  • 平文データの暗号化・複合化(例: encrypt-data, decrypt-data)
  • PIN(Personal Identification Number)の生成・検証(例: generate-pin-data, verify-pin-data)
  • MAC(Message Authentication Code)の生成・検証(例: generate-mac, verify-mac)

ぜひご自身の環境でお試しください!

対応リージョン

リリース直後の現在の対応リージョンは以下2つのみで、東京リージョンは非対応です。

  • 米国東部 (バージニア北部)
  • 米国西部 (オレゴン)

料金

料金ページはこちらです。

利用料金は以下のようにとてもシンプルです。

API呼び出し/月 料金
0〜20,000,000リクエストまで $2.00 (10,000 API呼び出し毎)
20,000,000リクエスト以降 $0.75 (10,000 API呼び出し毎)
リソース 料金
キー $1.00(1つあたり)

サーバレスの従量課金サービスなので、CloudHSMのようにHSMインスタンスにかかる利用料金がかからず、実際に作成したキーやAPI呼び出し量のみの課金となるため、こちらの方がお安く使えることもあるかもしれませんね。

最後に

今回は新サービスであるAWS Payment Cryptographyについて紹介させていただきました。

決済系のサービスを運用されている方で暗号化キーの管理や運用で悩まれている方に、特に刺さるサービスかなと思います。ぜひとも使ってみてください。

以上、芦沢(@ashi_ssan)でした。