はじめに
AWS Key Management Serviceを利用してAWS Lambdaに設定する環境変数をKMS暗号化して利用しようとした際にハマったことのメモ。
ハマったこと
CloudFormationで「伝送中の暗号化のためのヘルパーの有効化」を設定できない
CloudFormationでKMSキーの作成からLambda関数の環境変数への適用までを行いたい。
そこで以下のようなスタックテンプレートを作成してスタックを作成してみた。
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 キー
は指定されているが、伝送中の暗号化のためのヘルパーの有効化
は無効のままのため、環境変数は暗号化されず平文が丸見えである。
調べてみるとクラスメソッドの下記の記事でも、同箇所でCloudFormationで環境変数を暗号化までする方法が見つからなかったようで、本箇所のみ関数のコンソールから設定している。
仕方がないのでわたしもコンソールから手動で伝送中の暗号化のためのヘルパーの有効化
を有効化してKMSキーを指定し、環境変数を平文で表示されないようにした。
環境変数の復号結果がbytes型になる
KMS暗号化された環境変数をコード内で復号すると既定でbytes型の文字列になる。
文字列として扱いたい場合はdecode('utf-8')
などでバイト列から文字列にデコードする必要がある。
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/
以上