Amazon Web Services ブログ
Amazon Connectで作るセキュアなIVRソリューション
Amazon Connectで作るセキュアなIVRソリューション
Amazon Connectの問い合わせフローを使用して、ダイナミックな自動音声応答(IVR)ソリューションを作成できます。 Amazon Connectを使用すると、適切に個人情報を収集し、IVRによる顧客体験をカスタマイズすることができます。 個人情報として、社会保障番号、クレジットカード情報、および住所などが考えられます。 コンプライアンス上の理由から、個人情報など機密性の高い情報は通信時および保管時に暗号化する必要があります。 常に個人情報は暗号化しましょう。
このブログでは、Amazon Connectの[顧客の入力を保存する]ブロックを使用して機密な個人情報を収集し、ご自身でお持ちの暗号化キーを使用してデータを自動的に暗号化する方法について説明します。 この機能により、暗号化の要求に応えることができます。
この目的のために、Amazon ConnectはAWS Encryption SDKを使用して顧客提供データを暗号化します。 SDKはエンベロープ暗号化アプローチを使用します。 これにより、生データとそれらの暗号化に使用されるデータキーの両方が保護されます。 AWS Encryption SDKの機能の詳細については、Envelope Encryptionを参照してください。
この記事では、以下の手順を説明しています。
- クレジットカード番号を収集するようにAmazon Connectを設定します。
- クレジットカードの番号を暗号化します。
- ご自身でお持ちの復号化キーを使って復号化するために、バックエンドのAWS Lambdaに暗号化されたクレジットカード番号を送信します。
次の図に示すAmazon Connect問い合わせフローを使用します。
セキュアなIVRの作成
このセキュアなIVRを作るために、以下を実施する必要があります。
- 新しい暗号化キーと復号化キーを作成するか、既存のものをインポートします。
- 復号化キーをAWSパラメータストアに安全に保存する
- 収集した番号を復号化するためのAWS Lambda関数を作成します。
- 収集したクレジットカード番号を暗号化するために、Amazon Connectに公開鍵をアップロードします。
- 前のセクションで説明した問い合わせフローを作成します。
注意
セキュアなIVRを作るために、AWS Command Line Interface(AWS CLI)がインストールされ、セットアップされ、Amazon Connectインスタンスと同じリージョンに設定されていることを確認しましょう。 ターミナルウィンドウから“ aws configure”を実行できることを確認し、デフォルトのリージョンパラメータに正しい値が設定されていることを確認します。
Amazon Connectの顧客入力を暗号化する機能は、ご自身でお持ちの公開鍵を使用してデータを暗号化するように設計されています。 これにより、自分の秘密鍵を使用してデータを復号化し、データを後続処理に利用できます。 顧客だけが知っている秘密鍵を使用すると、要求されるプライバシーを保護するのに役立ちます。 既存の鍵ペアを使用することも、新しい鍵ペアを作成することもできます。 鍵情報が利用可能であるかぎり、このプロセスは変わりません。
この演習で既存のキーを使用する場合は、STEP2に進んでください。
STEP1:暗号化キーと復号化キーを作成する
このステップではOpenSSLを利用します。 macOSを使用している場合は、OpenSSLがすでにインストールされているはずです。 OpenSSLのインストールについては、このOpenSSLサイトを参照してください。
ターミナルとOpenSSLコマンドライン暗号化ユーティリティを使用して、自己署名証明書と秘密鍵を生成しましょう。 秘密鍵と証明書は同じステップで作成します。 その結果、2つのファイルが生成されます。
- 秘密鍵ファイル:blog.connect.private.key
- 証明書ファイル:blog.connect.certificate.pem
次のコマンドを実行し、証明書に通常必要な情報を入力します。 国、地域名、組織名など:
$ openssl req -x509 -sha256 -nodes -newkey rsa:4096 -keyout blog.connect.private.key -days 730 -out blog.connect.certificate.pem
2年間有効な証明書を作成しました(730日)。 証明書の有効期限のモニタリングは今後ご自身の責任であることを忘れないでください。
次に、OpenSSLユーティリティを使用して証明書ファイルから公開鍵を抽出します。 次のコマンドは、blog.connect.public.keyという名前のファイルを生成します。このファイルには、Amazon Connectにアップロードする必要がある暗号化キーが含まれています。
$ openssl x509 -pubkey -noout -in blog.connect.certificate.pem > blog.connect.public.key
これで、次のステップで使用する3つのファイルを用意することが出来ました。
STEP2:復号化秘密鍵をAWS パラメータストアに安全に保存する
このステップは、復号化キーが安全に保管されていることを確認するのに役立ちます。 復号化キーはトレーサビリティがあり、IAMを使用したアクセス権管理のもとに保存されます。 このアプローチによって、プロセスとユーザーへのアクセスを選択的に許可し、秘密鍵へのアクセスを管理できます。 また、監査のためにシステムが秘密鍵へのすべてのアクセスを記録するようにすることもできます。
次のコマンドは、秘密鍵をAWS Systems Manager パラメータストアに安全にアップロードします。 これにより、キーはCONNECT_INPUT_DECRYPTION_KEYという名前のパラメータに保存されます。 このパラメータを使用して、実行時にAWS Lambdaから秘密鍵を安全に取得できます。
$ aws ssm put-parameter --type SecureString --name CONNECT_INPUT_DECRYPTION_KEY --description "Private key for decryption of Amazon Connect collected data" --value "$(<blog.connect.private.key)"
このコマンドを実行するには、AWS Systems Managerへのアクセス権とパラメータを作成するためのアクセス権限を持つAWSユーザーである必要があります。 あなたの組織のAWS SysOpsチームと協力して適切なアクセスを権限が有ることを確認してください。
このコマンドは、デフォルトのキー alias/aws/ssmを使用して秘密鍵を暗号化します。 ここで別のAWS KMSキーを指定する場合は、このコマンドに–key-idオプションを追加します。
この手順を完了したら、AWS Systems Managerコンソールのパラメータストアの画面を開きます。 次のスクリーンショットのように、秘密鍵用に新しく作成されたパラメータが表示されます。 キーが表示されていない場合は、おそらく権限の問題ですので、ターミナルウィンドウの出力を見直して解決しましょう。
STEP3:AWS CloudFormationを使用して復号化用のLambda関数を作成する
このステップでは、AWS CloudFormationを使用してIAMロールとAWS Lambda関数を自動的に作成します。 この機能は、クレジットカード番号の復号化のために使用されます。
復号化用のLambda関数を作成する:
- AWSコンソールにログインします。
- 選択したAWSリージョンでAmazon Connectサービスが利用可能であることを確認してください。
- [Launch Stack]のボタン(右図)をクリックしてください。
- AWS CloudFormationページで、別の名前を使用する場合はスタック名を変更します。 他のオプションはデフォルトのままでかまいません。
- このテンプレートは変換(Transforms)を使用してAWSサーバーレスアプリケーションモデル(AWS SAM)を利用するため、変更セットの作成(次のスクリーンショットに表示)を選択して必要な宣言の変更を行います。この手順が完了すると、出力にAWS Lambdaリソース名(ARN)の値が表示されます。 ARNをコピーして保存しておきます。
- 残りのステップに従って、Amazon Connectインスタンスがこの新しく作成されたAWS Lambda関数にアクセスできることを確認しましょう。
- Amazon Connectコンソールで、[問い合わせフロー]を選択し、AWS Lambdaセクションのページの一番下までスクロールします。
- 次のスクリーンショットに示すように、関数ドロップダウンメニューで、DecryptCustomerInput関数を選択し、[+ Lambda関数の追加](図中では+Add Lambda Function)をクリックします。
この手順が完了すると、出力にAWS Lambdaリソース名(ARN)の値が表示されます。 ARNをコピーして保存しておきます。
STEP4:公開鍵をAmazon Connectにアップロードする
このステップでは、暗号化キーをアップロードします。これにより、Amazon Connectは顧客入力を暗号化するときにそのキーを使用するようになります。
- Amazon Connectコンソールを開きます。
- インスタンスを開き、左側のペインで[問い合わせフロー]を選択します。
- [キーの追加](図中ではAdd key)を選択して、公開鍵ファイルblog.connect.public.keyの内容を貼り付けます。 ファイルを開いてその内容をコピーするには、任意のテキストエディタを使用できます。
- 次の例に示すように、[追加](図中ではAdd)を選択して公開鍵を保存します。 これで公開鍵用のキーIDが生成されました。 コピーして後の手順で使用します。
STEP5:番号を収集し、暗号化するための問い合わせフローを作成する
このステップではまず、ここから使用する問い合わせフローをダウンロードし、ファイルに保存します。 以下の手順に従って、保存したファイルをインポートして変更し、クレジットカード番号を暗号化するために使用するキーをAmazon Connectに認識させます。
- Amazon Connectコンソールを開きます。
- 概要をクリックしてから、管理者としてログインを選択します。
- 左側の[ルーティング]メニューで、[問い合わせフロー]を選択して問い合わせフローのリストを表示します。
- 問い合わせフローの作成をクリックします。
- 次のスクリーンショットに示すように、右側の[保存]ボタンの横にあるドロップダウンメニューから、[フローのインポート]を選択します。 ここでこのステップの始めにダウンロードしたフローをロードします。
- インポートが完了したら、[顧客の入力を保存する]ブロックを選択し、次の例に示すように、STEP3で作成したキーIDとblog.connect.certificate.pemファイルの内容を入力します。
- 次に、問い合わせフローの[AWS Lambda関数を呼び出す]ブロックにDecryptCustomerInputを設定します。そのためには、CloudFormationスタックの出力から返された値で[関数のARN](スクリーンショット中ではFunction ARN)フィールドを更新します。 次のスクリーンショットの例を参考にしてください。
- すべての変更が完了したら、問い合わせフローを保存して発行します。
- 次の例に示すように、問い合わせフローをテスト用の電話番号に関連付けます。 電話番号の設定の詳細については、[電話番号を請求]を参照してください。
- テスト用の電話番号をダイヤルしてフローを確認します。 呼び出しが完了したら、Amazon CloudWatch Logsを確認して、入力した数字が暗号化され、復号化のためにAWS Lambda関数に渡されることを確認します。
注意
復号化が期待どおりに機能することを確認するために、復号化されたテキストを記録します。 ただし、機密データがログファイルから漏洩しないようにするために、本番環境でこれを実行するのは避けてください。
以下の抜粋は、問い合わせフローログとAWS Lambda関数ログの両方に格納されている情報を示しています。
Contact flow logs
収集した情報
{
"ContactFlowModuleType": "StoreUserInput",
"ContactFlowId": "arn:aws:connect:us-east-1:098145436134:instance/1f5e58e8-4c0e-414d-bf3e-2bb5411a8799/contact-flow/6845a578-1226-458d-910f-6549251f3471",
"Timestamp": "2018-12-06T01:44:20.143Z",
"ContactId": "c4955beb-1aaf-4be9-a77e-44affab094a6",
"Results": "AYADeChksVCWzXiOV5r3lqTOgNwAXwABABVhd3MtY3J5cHRvLXB1YmxpYy1rZXkAREF2QXlYMzJOZ1ByTFdZRkNGUEo1K1RsM1l2RE9IZ2IvZzV6Z0h5RnVJTmpudHpVcTl1VlI5OEljOHRjb2RSS3RSQT09AAEADUFtYXpvbkNvbm5lY3QAJGEyNWMzNWY4LThiZTYtNDgwOS1iYjQ2LWU5Yjk2NDAyMjY0ZgIALWU7lQ/BvMDejcjotBY41kwqFZh+mmlY6Uob+VpwlinLWTKoxo+4alK7cLOgXLHp8sEKbaZFvR+HIsjJYccpgS6e8KIljfrpFrz+/xAIxt9oE3u0RCN11/SW7gcZ93fZryKoF77ki1RdMlNFRkram5Sb2IPQ43X4YhdFD/GUEKKFb6EBwwsglOE+KYstJFUJ7hc0AAILpGQDPA+EelymG8BF7CBlpZByvxPQH66Dnh4ypw3ANfW0Tg5dwHDC0+78RYOqnVVJohQ0g9SlqH5oGx/08CeTNfnvICvPdd//9Le51xu8mddqYEZJHBLOMkecIbiQo51eD2d99aaN4Byv3wYsFx7ENBdqcD1khiAHAsJdc570VJbKgrmbLu99359BABiWjlcBIF8ss6Vul13FgCbsQGQT9RaRud6BR+xv4KZekI3xJhTgcxP/BDoi6ITQxR+bq+Go0IbX4Lv5MDTZ+dl+FiTV1Yeyr6apWpeeRgJUVDptaoiPwWIP8SPdxtJs479fz+kN8JEWg16PZD16WiRjS+nO6zwyxjTOpoUImbOMSBqXIdiKIPcEH00aI1LwjUemQoFE1oQeYI+aSVYUdK1vLjNHfW8mzJxUSN7++uT4Ano2xfehza13i71ERHTo83a4Dn+pQkwjmU04lE5pL+da6V1Bk/tlpoZmNn2FAcgCAAAAAAwAABAASYbegRD39l1dwH1s7o3QmAYAONZqZhBArr50hv////8AAAAB/JtEZVJ2Ns41DlxjAAAACvSX4W1TeTUFi/mExfmasoTIhIBQcEigWL9uAGcwZQIwS24mN0dgkK5Iu77iZ/tGbzm//+vSMt4QFhOGNMMPBhRUXg0oZ/W8bLEe7tS2JQ1oAjEA3hRWm6FZvEuOeR+HGrkb22Woe05qYG3Dxbjl2ajUy0FtjQ2FTBYY9T7AX8S3RSjV"
}
AWS Lambda 関数の呼び出し
{
"ContactFlowModuleType": "InvokeExternalResource",
"ContactId": "c4955beb-1aaf-4be9-a77e-44affab094a6",
"Parameters": {
"FunctionArn": "arn:aws:lambda:us-east-1:098145436134:function:ConnectEncryption",
"Parameters": {
"EncryptedCreditCard": "AYADeChksVCWzXiOV5r3lqTOgNwAXwABABVhd3MtY3J5cHRvLXB1YmxpYy1rZXkAREF2QXlYMzJOZ1ByTFdZRkNGUEo1K1RsM1l2RE9IZ2IvZzV6Z0h5RnVJTmpudHpVcTl1VlI5OEljOHRjb2RSS3RSQT09AAEADUFtYXpvbkNvbm5lY3QAJGEyNWMzNWY4LThiZTYtNDgwOS1iYjQ2LWU5Yjk2NDAyMjY0ZgIALWU7lQ/BvMDejcjotBY41kwqFZh+mmlY6Uob+VpwlinLWTKoxo+4alK7cLOgXLHp8sEKbaZFvR+HIsjJYccpgS6e8KIljfrpFrz+/xAIxt9oE3u0RCN11/SW7gcZ93fZryKoF77ki1RdMlNFRkram5Sb2IPQ43X4YhdFD/GUEKKFb6EBwwsglOE+KYstJFUJ7hc0AAILpGQDPA+EelymG8BF7CBlpZByvxPQH66Dnh4ypw3ANfW0Tg5dwHDC0+78RYOqnVVJohQ0g9SlqH5oGx/08CeTNfnvICvPdd//9Le51xu8mddqYEZJHBLOMkecIbiQo51eD2d99aaN4Byv3wYsFx7ENBdqcD1khiAHAsJdc570VJbKgrmbLu99359BABiWjlcBIF8ss6Vul13FgCbsQGQT9RaRud6BR+xv4KZekI3xJhTgcxP/BDoi6ITQxR+bq+Go0IbX4Lv5MDTZ+dl+FiTV1Yeyr6apWpeeRgJUVDptaoiPwWIP8SPdxtJs479fz+kN8JEWg16PZD16WiRjS+nO6zwyxjTOpoUImbOMSBqXIdiKIPcEH00aI1LwjUemQoFE1oQeYI+aSVYUdK1vLjNHfW8mzJxUSN7++uT4Ano2xfehza13i71ERHTo83a4Dn+pQkwjmU04lE5pL+da6V1Bk/tlpoZmNn2FAcgCAAAAAAwAABAASYbegRD39l1dwH1s7o3QmAYAONZqZhBArr50hv////8AAAAB/JtEZVJ2Ns41DlxjAAAACvSX4W1TeTUFi/mExfmasoTIhIBQcEigWL9uAGcwZQIwS24mN0dgkK5Iu77iZ/tGbzm//+vSMt4QFhOGNMMPBhRUXg0oZ/W8bLEe7tS2JQ1oAjEA3hRWm6FZvEuOeR+HGrkb22Woe05qYG3Dxbjl2ajUy0FtjQ2FTBYY9T7AX8S3RSjV"
},
"TimeLimit": "8000"
},
"ContactFlowId": "arn:aws:connect:us-east-1:098145436134:instance/1f5e58e8-4c0e-414d-bf3e-2bb5411a8799/contact-flow/6845a578-1226-458d-910f-6549251f3471",
"Timestamp": "2018-12-06T01:44:20.208Z",
"ExternalResults": {
"body": "Successfully Decryption",
"statusCode": "200"
}
}
AWS Lambda ログ
body: { frames: [], lastFrame: { seq: 1, text: '4444444444444444' } },
この場合、入力された数字は4444444444444444でした。
結論
以上です!
このブログでは、Amazon Connectで発信者から数字を収集し、提供された独自のキーペアを使ってそれらを暗号化する方法について説明しました。 また、AWS Systems Managerを使用して復号化キーを安全に保存する方法についても説明しました。
これで、Amazon Connectを使ってセキュアなIVRを構築することができるようになりました。
このソリューションを使って皆さまが何を構築されたか、ぜひ教えてください。
原文:https://thinkwithwp.com/jp/blogs/contact-center/creating-a-secure-ivr-solution-with-amazon-connect/
翻訳:ソリューションアーキテクト 深森 広英