Help us understand the problem. What is going on with this article?

AWS Lambdaで環境変数のKMS暗号化を利用した際にハマったこと

More than 1 year has passed since last update.

はじめに

AWS Key Management Serviceを利用してAWS Lambdaに設定する環境変数をKMS暗号化して利用しようとした際にハマったことのメモ。

ハマったこと

CloudFormationで「伝送中の暗号化のためのヘルパーの有効化」を設定できない

CloudFormationでKMSキーの作成からLambda関数の環境変数への適用までを行いたい。
そこで以下のようなスタックテンプレートを作成してスタックを作成してみた。

stack-template.yml
Parameters:
  AccessToken:
    Type: String
  (中略)
  Key00:
    Type: AWS::KMS::Key
    Properties:
      KeyPolicy:
        Version: "2012-10-17"
        Id: !Sub ${appName}-aws-apikey-00-keypolicy
        Statement:
          -
            Sid: "Allow administration of the key"
            Effect: "Allow"
            Principal:
              AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
            Action: "*"
            Resource: "*"
          -
            Sid: "Allow use of the key"
            Effect: "Allow"
            Principal:
              AWS: !GetAtt Role00.Arn
            Action: 
              - "kms:Encrypt"
              - "kms:Decrypt"
              - "kms:ReEncrypt*"
              - "kms:GenerateDataKey*"
              - "kms:DescribeKey"
            Resource: "*"
  Function00:
    Type: AWS::Lambda::Function
    Properties:
      Environment:
        Variables:
          access_token: hogehogetokun
      KmsKeyArn: !GetAtt Key00.Arn
      (中略)

しかし、CloudFormationにより作成されたLambda関数のコンソールを見てみると、保管時に暗号化する AWS KMS キーは指定されているが、伝送中の暗号化のためのヘルパーの有効化は無効のままのため、環境変数は暗号化されず平文が丸見えである。
img.png

調べてみるとクラスメソッドの下記の記事でも、同箇所でCloudFormationで環境変数を暗号化までする方法が見つからなかったようで、本箇所のみ関数のコンソールから設定している。

https://dev.classmethod.jp/cloud/aws/lambda-slack-cloudwatch-cloudformation/

仕方がないのでわたしもコンソールから手動で伝送中の暗号化のためのヘルパーの有効化を有効化してKMSキーを指定し、環境変数を平文で表示されないようにした。
img.png

環境変数の復号結果がbytes型になる

KMS暗号化された環境変数をコード内で復号すると既定でbytes型の文字列になる。
文字列として扱いたい場合はdecode('utf-8')などでバイト列から文字列にデコードする必要がある。

lambda_function.py
import boto3,os
from base64 import b64decode

def lambda_handler(event, context):
    ENCRYPTED = os.environ['access_token']
    DECRYPTED = boto3.client('kms').decrypt(CiphertextBlob=b64decode(ENCRYPTED))['Plaintext']
    print(DECRYPTED)
    print(DECRYPTED.decode('utf-8'))
# 実行結果
b'hogehogetokun'
hogehogetokun

環境変数を暗号化した際に「コード」ボタンで表示できる「シークレットスニペットの復号」のコード内では特にutf-8デコードはされていなかったので、DECRYPTEDが後続の処理にうまくわたせずにハマった。

参考

https://qiita.com/seisyu1985/items/880c5e49e8c8677bc9e3
https://qiita.com/FGtatsuro/items/f45c349e06d6df95839b
https://python.civic-apps.com/python3-bytes-str-convert/

以上

r-wakatsuki
クラウド技術(主にAWS)、Docker、Pythonなどの小ネタ中心。
https://dev.classmethod.jp/author/wakatsuki-ryuta/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away