バナーナナブログ

宮城県仙台市より、日々思ったことを綴っていくウェブログです。

AWS Lambdaの環境変数をKMSを使って暗号化/復号化してみた

はじめに

Lambdaの環境変数を利用することはよくあると思います。
f:id:smdbanana:20210705160939p:plain

パスワード情報などを暗号化した状態で保存したいと思い、お作法を学んだので共有します。
いつものことながら、一番シンプルな構成で検証しています。

KMSをセットアップ

https://aws.amazon.com/jp/kms/
AWS Key Management Service (KMS)
データの暗号化やデジタル署名に使用するキーを簡単に作成して管理する
AWS Key Management Service (KMS) を使用することで、暗号化キーを簡単に作成して管理し、幅広い AWS のサービスやアプリケーションでの使用を制御できるようになります。」
だそうです。

今回はカスタマー管理型のキーを作成します。

 

f:id:smdbanana:20210705173848p:plain

「キーの作成」をクリック。

 

f:id:smdbanana:20210705173858p:plain

一番シンプルな構成で検証するので、デフォルトのまま次へ。
(キータイプ:対称、マテリアルオリジン:KMS、リージョン:単一)

 

f:id:smdbanana:20210705173907p:plain

エイリアス名を決定。次へ。

 

f:id:smdbanana:20210705173916p:plain

キー管理者は指定せず。次へ。

 

f:id:smdbanana:20210705173929p:plain

キーの使用アクセス許可定義。
KMSを利用するLambda関数のロールを指定します。
ついでにサンプルのIAMユーザも追加しておきます。次へ。

 

f:id:smdbanana:20210705173938p:plain

確認して問題なければ完了。

これでKMSの準備は完了しました。

Lambda環境変数をセットアップ

f:id:smdbanana:20210705173952p:plain

Lambdaの環境変数を編集します。
暗号化の設定を開き、「転送時の暗号化に使用するヘルパーの有効化」にチェックを入れます。
すると環境変数キー/値の右側に「暗号化」ボタンが表示されるので押下。

 

f:id:smdbanana:20210705174005p:plain

「転送時の暗号化を行うための AWS KMS キー」が求められます。
先程作成したエイリアスを指定し、「暗号化」ボタンを押下。
(復号化する手順は「シークレットスニペットの復号」を開くと例が表示されます。)

 

f:id:smdbanana:20210705174015p:plain

「値」の部分が暗号化されたことがわかるので、保存を押下。

 

f:id:smdbanana:20210705174025p:plain

「シークレットスニペットの復号」を参考にして復号化の検証を実施。
サンプルのソースは以下です。

AWS LambdaでKMS復号化を行うサンプル

正しく復号化されていることがわかります。

ということで最もシンプルな構成での検証は完了です。

 

ローカルで上記暗号化の値を復号化する

先程の検証ではKMSとLambdaを使ってのパターンでしたが、Lambda以外から先程の暗号化値を復号化する方法も検証してみます。

ローカルで検証する際はboto3を使うのでinstallしておきます。

$ pip install -t . boto3

ソースは以下。

AWS LambdaのKMS復号化をローカル環境で行うサンプル

ENCRYPTED に先程のLambda環境変数の暗号化値を入れておきます。
AWS_KEY/AWS_SECRETにはKMSのキーの使用アクセス許可定義に追加しておいたサンプルユーザのアクセスキー&シークレットを設定。
EncryptionContextにはLambdaの関数名を指定します。

実行してみます。

$ python KmsTest2.py
DECRYPTED : password_here!

ということで、復号化に成功しました。

 

ローカルでKMSを使った暗号化と復号化両方行う

ローカルで復号化する事ができたので、暗号化もローカルでしてみます。

先にソースは以下。

AWS KMSの暗号化/復号化をローカル環境で行うサンプル

先程の内容に加え、KMS_KEY_IDが追加されています。
KMS_KEY_IDには、KMSのARNを設定しておきます。

実行してみます。

$ python KmsTest3.py
ENCRYPTED : AQICAHgRBaBbh...
DECRYPTED : hoge

ということで、暗号化と復号化に成功しました。
暗号化の際にEncryptionContextを省略することができ、その場合は復号化でもEncryptionContextを省略する必要があります。

 

さいごに

難易度高くなく暗号化/復号化を実施できました。
復号化の際はKMSの「キーの使用アクセス許可定義」で許可されたユーザのみ復号化することができるので安心かと思います。

現場からは以上です。