仕事が忙しく、なかなか更新できていませんでしたが、また徐々にためていた記事をアップできたらと思います!
事象
Lambda関数が、KMS(CMK)を利用し暗号化している環境変数の値を復号し、プログラムを実行する場面があった。 しかし、復号に失敗し続けている事象が発生。
確認したこと
- CMK
- キーのタイプ
- キーの仕様
- キーポリシー (ポリシーは、json形式で確認可能)
キーの使用("暗号化および復号化"になっているか)
Lambda
- 設定した環境変数の値(そもそも)
- 暗号化に使用したCMKは、適切なCMKで暗号化してるか(そもそも)
LmbdaにアタッチしているRole
その他関連しそうなサービスのPolicyなど
Lambdaに関しては、環境変数に編集でKMSの使用を設定できる。
転送時の暗号化に使用するヘルパーの有効化
←にチェックを入れることで、環境変数値の横に暗号化
のボタンが表示される。
暗号化したいデータを入力し、暗号化を押下すると、暗号化に使用するKMS(CMK)を選択できる。
それでも復号化に失敗した
上記の内容を何度も確認し、関連するツールなども確認したのに、同じエラーが出続けました。 (今回は、LambdaがJavaで実装されている。)
{ "errorMessage": "null (Service: AWSKMS; Status Code: 400; Error Code: InvalidCiphertextException; Request ID: xxxxxxxx-1234-5678-xxxx-xxxxxxxxxxxxx)", "errorType": "com.amazonaws.services.kms.model.InvalidCiphertextException",
Class InvalidCiphertextException
上記に記載されていた説明によると、
From the ImportKeyMaterial operation, the request was rejected because AWS KMS could not decrypt the encrypted (wrapped) key material. (AWS KMSが暗号化されたキーマテリアルを復号化できなかったため、ImportKeyMaterialオペレーションからリクエストが拒否されました。)
やはり復号化に失敗しているよ、というエラーメッセージ。
バグ発見
AWSコンソールのLmbda関数ページで、ポチポチで環境変数の編集する際、任意のKMSを指定し暗号化し保存。 暗号化した値を復号化すると、復号化に失敗しました。
つまり、AWSコンソールのLambda関数ページで表示されている値は、正しくない値ということ。
裏取り
試しにaws cliで暗号化し、暗号化されたデータをLambdaの環境変数の値にそのまま入力。 プログラムの方で復号化が成功した。
まとめ
Lambda関数ページのUIは大分アップデートされているので、その関係でバグが発生しているようでした。(2020/07時点) たしかに、以前のUIをみてみると、環境変数の編集部分のUIも変更されているようでした。
AWSで明らかに詰まっている場合、cliを使用して裏取りや、describeなどで設定項目などを確認することは改めて必須だと思いました。
以上.