キー管理サービス (AWS KMS) キーを使用して、OpenSSL を使用してファイルを暗号化したいと考えています。その方法を教えてください。
簡単な説明
大量のデータを RSA キーで暗号化することはできません。たとえば、2048 バイトの RSA キーペアサイズを RSAES_OAEP_SHA_256 で暗号化する場合、暗号化できる最大量は 190 バイトです。Advanced Encryption Standard (AES) キーを使用すると、暗号ブロックチェーン (CBC) を使用してデータをより小さな部分に分割できます。
解決方法
CBC を使用してキーを暗号化および復号化するには、次の手順に従います。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
RSA キーペアを作成し、パブリックキーをダウンロードして、AES 256 ビットキーを作成します。
1. AWS マネジメントコンソールで RSA キーペアを作成する手順に従います。
2. 次のような AWS CLI コマンド get-public-key を使用してパブリックキーをダウンロードします。
$ aws kms get-public-key --key-id arn:aws:kms:eu-west-1:123456789012:key/d74f5077-811b-4447-af65-71f5f64f37d3 --output text --query 'PublicKey' > RSAPublic.b64 && base64 -d RSAPublic.b64 > RSAPublic.bin
注:
--query 関数はパブリックキーのみを取得し、base64 ファイルを DER キーにデコードします。
3. 次のように、OpenSSL rand コマンドを使用して AES 256 ビットキーを作成し、ランダムデータを生成して、key.bin ファイルに出力します。
$ openssl rand -base64 32 > key.bin
データを暗号化する
1. 次のように、CBC で暗号化された OpenSSL enc コマンドを使用して key.bin ファイルを使用してデータを暗号化します。
$ openssl enc -aes-256-cbc -salt -pbkdf2 -in FILE_TO_ENCRYPT -out FILE_TO_ENCRYPT.enc -pass file:./key.bin
注:
- -pbkdf2 コマンドは OpenSSL 1.1.1 でのみ使用できます。Amazon Linux 2 AMI には OpenSSL 1.0.2 がインストールされていますが、-pbkdf2 コマンドはサポートされていません。
- CBCでは、任意のサイズのファイルを暗号化できます。
- 値 FILE_TO_ENCRYPT を、暗号化するファイルの名前に置き換えます。
2. AWS KMS パブリックキーを使用して AES 256 ビットキー key.bin を暗号化します。これにより、データのキーが安全であることが確認されます。AWS KMS プライベートキーにアクセスできるユーザーだけが key.bin キーにアクセスできます。
次のような OpenSSL pkeyutl コマンドを実行します。
$ openssl pkeyutl -in key.bin -out enc.key.bin -inkey RSAPublic.bin -keyform DER -pubin -encrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256
注: pkeyutl コマンドは、AWS KMS API (RSAES_OAEP_SHA_256) が復号化にサポートしている暗号化アルゴリズムを使用します。AWS KMS パブリックキー RSAPublic.bin は AES 256 キーを暗号化し、enc.key.bin という名前の新しいファイルを作成します。
3. key.bin ファイルを暗号化し、次のように AWS CLI コマンド rm を使用してファイル enc.key.bin を復号できない限り、ユーザーがアクセスできないようにします。
$ rm key.bin && rm FILE_TO_ENCRYPT
注: 暗号化する元のファイルを削除して、ユーザーがアクセスできないようにすることもできます。
これで、次のものができました。
- FILE_TO_ENCRYPT.enc ファイル内の暗号化されたデータ
- 暗号化された AES 256 ビットキー enc.key.bin
- AWS KMS パブリックキー RSAPublic.bin
注: 暗号化されたデータを持つユーザーは、復号化するためにこれらのファイルを送信する必要があります。
送信されたファイルを復号化する
暗号化されたデータを取得するには、AES 256 ビットキーを復号化し、そのキーを使用してデータファイル FILE_TO_ENCRYPT.enc を復号化します。
注: AWS KMS プライベートキーはプレーンテキストでは表示できないため、AWS KMS API へのアクセスが必要です。
1. 次のような AWS CLI コマンド decrypt を使用して AES 256 ビットキーを復号化し、enc.key.bin ファイルを AWS KMS API に送信します。
$ aws kms decrypt --key-id arn:aws:kms:eu-west-1:123456789012:key/d74f5077-811b-4447-af65-71f5f64f37d3 --ciphertext-blob fileb://enc.key.bin --encryption-algorithm RSAES_OAEP_SHA_256 --output text --query 'Plaintext' | base64 --decode > decryptedKey.bin
注:
--query 関数はプレーンテキストを選択し、base64 値を
decryptedKey.bin ファイルにデコードします。
2. decryptedKey.bin ファイルを使用して OpenSSL enc コマンドを実行し、次のように DECRYPTED_FILE に出力します。
$ openssl enc -d -aes-256-cbc -pbkdf2 -in FILE_TO_ENCRYPT.enc -out DECRYPTED_FILE -pass file:./decryptedKey.bin
注: 値 DECRYPTED_FILE を、復号化するファイルの名前に置き換えます。
DECRYPTED_FILE と FILE_TO_ENCRYPT を比較して、暗号化と復号化が正常に完了したことを確認できます。
関連情報
AWS 暗号化サービスとツール