AWS Lambdaの環境変数をKMSを使って暗号化/復号化してみた
はじめに
Lambdaの環境変数を利用することはよくあると思います。
パスワード情報などを暗号化した状態で保存したいと思い、お作法を学んだので共有します。
いつものことながら、一番シンプルな構成で検証しています。
KMSをセットアップ
https://aws.amazon.com/jp/kms/
AWS Key Management Service (KMS)
データの暗号化やデジタル署名に使用するキーを簡単に作成して管理する
「AWS Key Management Service (KMS) を使用することで、暗号化キーを簡単に作成して管理し、幅広い AWS のサービスやアプリケーションでの使用を制御できるようになります。」
だそうです。
今回はカスタマー管理型のキーを作成します。
「キーの作成」をクリック。
一番シンプルな構成で検証するので、デフォルトのまま次へ。
(キータイプ:対称、マテリアルオリジン:KMS、リージョン:単一)
エイリアス名を決定。次へ。
キー管理者は指定せず。次へ。
キーの使用アクセス許可定義。
KMSを利用するLambda関数のロールを指定します。
ついでにサンプルのIAMユーザも追加しておきます。次へ。
確認して問題なければ完了。
これでKMSの準備は完了しました。
Lambda環境変数をセットアップ
Lambdaの環境変数を編集します。
暗号化の設定を開き、「転送時の暗号化に使用するヘルパーの有効化」にチェックを入れます。
すると環境変数キー/値の右側に「暗号化」ボタンが表示されるので押下。
「転送時の暗号化を行うための AWS 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を使った暗号化と復号化両方行う
ローカルで復号化する事ができたので、暗号化もローカルでしてみます。
先にソースは以下。
先程の内容に加え、KMS_KEY_IDが追加されています。
KMS_KEY_IDには、KMSのARNを設定しておきます。
実行してみます。
$ python KmsTest3.py
ENCRYPTED : AQICAHgRBaBbh...
DECRYPTED : hoge
ということで、暗号化と復号化に成功しました。
暗号化の際にEncryptionContextを省略することができ、その場合は復号化でもEncryptionContextを省略する必要があります。
さいごに
難易度高くなく暗号化/復号化を実施できました。
復号化の際はKMSの「キーの使用アクセス許可定義」で許可されたユーザのみ復号化することができるので安心かと思います。
現場からは以上です。