【Key Management Service】Lambda Rubyで環境変数を暗号化する

KMS(Key Management Service)を利用して、Lambdaの環境変数の暗号化・復号化を試してみます。なお、利用するランタイムはRubyを利用します。

Lambdaの環境変数の暗号化・復号化をやってみよう

KMSのカスタマーマスターキーを作成

カスタマーマスターキーをCLIから作成し、エイリアス名も設定します。キーポリシーは今回はデフォルトで作成されたままのポリシーを使用します。

カスタマーマスターキーの作成

$ aws kms create-key
{
    "KeyMetadata": {
        "Origin": "AWS_KMS",
        "KeyId": "<カスタマーマスターキーID>",
        "Description": "",
        "KeyManager": "CUSTOMER",
        "Enabled": true,
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "CreationDate": 1557209546.076,
        "Arn": "arn:aws:kms:ap-northeast-1:<AWSアカウントID>:key/<カスタマーマスターキーのキーID>",
        "AWSAccountId": "<AWSアカウントID>"
    }
}

カスタマーマスターキーにエイリアスを設定

エイリアスdemo-lambdaで設定しています。--target-key-idには上で作成したカスタマーマスターキーのキーIDを指定します。

$ aws kms create-alias --alias-name alias/demo-lambda --target-key-id <カスタマーマスターキーのキーID>

Lambda関数へKMSの復号化権限を付与

Lambda関数が暗号化した環境変数を復号化できるようにロールにkms:Decrypt権限を付与する必要があります。権限の追加に関しては、割愛します。ポリシー例は以下の通りです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DemoKms0",
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "arn:aws:kms:ap-northeast-1:<AWSアカウントID>:key/<カスタマーマスターキーID>"
        }
    ]
}

Lambda関数へ環境変数を設定

コンソール上から以下の通り環境変数を設定します。ここで登録した環境変数USERPASSWDを暗号化した後、Lambda関数上で復号化します。

環境変数を暗号化

暗号化の設定のプルダウンを開きます。伝送中の暗号化のためのヘルパーの有効化にチェックを入れ、伝送中に暗号化する AWS KMS キーに、初めに作成したカスタマーマスターキーのARNを設定します。ARNは、AWSコンソールのKMSのページ等から確認できます。

環境変数USERPASSWDの欄に暗号化のボタンが表示されるのでクリックし、暗号化します。下記は暗号化後の表示です。

Lambda関数の作成

暗号化された環境変数と、復号化した環境変数を表示する関数を作成してみます。

require 'aws-sdk'

def demo_kms(event:, context:)
  kms_client = Aws::KMS::Client.new

  # 環境変数USERの復号化
  user = kms_client.decrypt(ciphertext_blob: Base64.decode64(ENV['USER']))[:plaintext]
  # 環境変数PASSWDの復号化
  passwd = kms_client.decrypt(ciphertext_blob: Base64.decode64(ENV['PASSWD']))[:plaintext]

  puts "USER(暗号化):#{ENV['USER']}"
  puts "PASSWD(暗号化):#{ENV['PASSWD']}"
  puts "USER(復号化):#{user}"
  puts "PASSWD(復号化):#{passwd}"
end

実行結果

Lambdaのログ出力の結果です。暗号化した環境変数と復号化した環境変数が表示されました。

Lambdaの環境変数の暗号化・復号化まとめ

CloudFormationでLambdaを作成する際、AWS::Lambda::Function リソースのKmsKeyArnプロパティで環境変数の暗号化に利用するAWS Key Management Service キーは指定できるようです。ドキュメントはこちら。ただ、実際に環境変数を暗号化するところを、CloudFormationで対応するようなプロパティは見受けられませんでした。自動化して利用する際は、今回のように平文を登録してLambda上で暗号化するのではなく、暗号化済みのものをLambda上に登録する必要があるってことなのですかね。