Lambdaの環境変数をKMSで暗号化して、Pythonで復号化する


今回のお題

IAMの暗号化キーを生成し、その暗号キーを用いてLambdaの環境変数を暗号化する。
暗号化したものをPythonで複合化して、表示してみる。

暗号化キーを作成する

IAM > 暗号化キーを選択する。

リージョンを東京に変更する

画面上部のキーの作成を押下する

エイリアスを入力し、KMSを選択する。

今回はテストなので「test/key」としました。
入力・選択を終えたら、画面下部の「次のステップ」押下

タグキーを入力

入力したら画面下部の「次のステップ」押下

キー管理者を設定

本来は、ちゃんと設定するのでしょうが、今回はlambdaのデフォルトで用意されている「lambda_basic_execution」を設定しました。
あと、自分のAWSのログインIDも設定します(変更したりできるようにするため)

キーの使用者の設定

こちらも同じく「lambda_basic_execution」とAWSの自分のIDを設定しておきます。

完了

作成が終えると、キーの一覧に表示されます。

Lambdaの環境変数を設定し、暗号化する

サービス > lambdaを選択し、ソースインラインの下にある環境変数に値を入れ、暗号化を設定していきます。

環境変数に値を入れる

暗号化の設定を開く

「伝送中の暗号化のためのヘルパーの有効化」のチェックをONにすると、伝送中に暗号化するKMSキーが表示されます。

前手順で作成したKMSキーを選ぶ

リスト式ですので、クリックすると設定されている一覧が表示されます。
先ほど作成したKMSキーを選択しましょう。

環境変数の暗号化を押下する

KMSキーを設定すると、環境変数に暗号化ボタンが表示されますので、押下します。

Pythonで環境変数を読み込んでみる。

Lambdaで、下記のようなソースを記載します。

# coding: UTF-8

import os

def lambda_handler(event, context):
    print('~~~~~環境変数表示~~~~~')
    print(os.environ['test'])

保存して、実行します。
ログには、下記のように表示されました。
無事に暗号化できているようです。

復号化してみる

復号化は、簡単でした。
下記のようなソースを記載し、実行して見ます。

# coding: UTF-8
from base64 import b64decode
import boto3
import os

def lambda_handler(event, context):
    kms = boto3.client('kms')
    decrypt_text = kms.decrypt(CiphertextBlob=b64decode(os.environ['test']))['Plaintext']

    print("~~~~~~~~~~~~~~復号化確認~~~~~~~~~~~~~~~~")
    print(os.environ['test'])
    print(decrypt_text)

実行結果

まとめ。

環境変数に対する暗号化・復号化が非常に簡単にできました。
すごい便利ですねこれ。ロールをきちんと考えれば、セキュリティ的にも大丈夫な気がします。