LoginSignup
7
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-27

はじめに

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で環境変数を暗号化までする方法が見つからなかったようで、本箇所のみ関数のコンソールから設定している。

仕方がないのでわたしもコンソールから手動で伝送中の暗号化のためのヘルパーの有効化を有効化して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/

以上

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7