创建Lambda函数时,通过GUI控制台加密环境变量并不难。我只需输入密钥值对,然后打开加密助手并输入我的KMS密钥的ARN。这使我可以对值进行加密,因此如上图所示,它在发送存储之前已被加密。
我要完成的事情是完全相同的,但是假设您不是在GUI控制台中而是通过通过CloudFormation模板(正在CLI中进行部署)来部署Lamba函数。 >。
这是我在CloudFormation模板中指定相关参数的方式:
"EnvironmentVariable" : {
"Type" : "String",
"Default" : "test",
"Description" : "Environment Variable"
},
"KmsKeyArn" : {
"Type" : "String",
"Description" : "KMS Key ARN if environment variables are encrypted"
},
这是我在Lambda资源中模板的“资源”部分中引用这些参数的方式:
"Environment" : {
"Variables" : {
"SomeVariable": {
"Ref" : "EnvironmentVariable"
}
}
},
"KmsKeyArn" : { "Ref" : "KmsKeyArn" },
这是我在CLI中部署此模板的方式(更改了所有ARN和其他值以保护隐私,但保持其结构):
aws cloudformation deploy --template-file lambda-template.json --stack-name“ CLI-lambda-stack” --parameter-overrides S3BucketName =“ theBucket” S3FileLocation =“ lambda_function.zip” S3ObjectVersion =“ ZuB0eueEgh2yh5q00.DiykLNudujdsc5” DeadLetterArn =“ arn:aws:sns:us-west-2:526598937246:CloudFormationTests” EnvironmentVariable =“测试” KmsKeyArn =“ arn:aws:kms:us-west-2:227866537246:key / b24e7c79-a14d-4a3e-b848-165115c86210” HandlerFunctionName =“ lambda_function.lambda_handler” MemorySize =“ 128” 角色=“ arn:aws:iam :: 507845137246:role / serverless-test-default-us-east-1-lambdaRole” FuncName =“ myCLILambda”
在CLI中运行此命令后,没有任何错误,但是当我在控制台中打开Lambda函数以检查结果时,我看到的是这样的东西:
我要去哪里错了?感谢您的见解。
答案 0 :(得分:4)
$ aws kms encrypt --key-id $KEY_ID --plaintext secretpassword --output text --query CiphertextBlob
AQICAHjZ + JlI8KKmiVc ++ NhnBcO0xX3LFAaCfsjH8Yjig3Yr2AFPIyKCp3XVOEDlbiTMWiejAAAAbDBqBgkqhkiG9w0BBwagXTBbAgEAMFYGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMhai9vkA2KdU5gd + qAgEQgCnWW4F3fb7pTwmA2ppskJhUl0dJGEXIE5oDCr3ZsH7TlN5X381juPg0LA ==
像这样将其保存在您的CF模板中
"environment_variables": {
"SECRET_DATA": "AQICAHjZ+JlI8KKmiVc++NhnBcO0xX3LFAaCfsjH8Yjig3Yr2AFPIyKCp3XVOEDlbiTMWiejAAAAbDBqBgkqhkiG9w0BBwagXTBbAgEAMFYGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMhai9vkA2KdU5gd+qAgEQgCnWW4F3fb7pTwmA2ppskJhUl0dJGEXIE5oDCr3ZsH7TlN5X381juPg0LA=="
}
3。在Lambda函数内部解密
kms = boto3.client('kms')
response = kms.decrypt(CiphertextBlob=os.environ['SECRET_DATA'].decode('base64'))
secret_data = response['Plaintext']
secret_data
答案 1 :(得分:1)
总结我们的评论:
有两种加密类型:传输中和静止。在CloudFormation上配置KmsKeyArn
属性时,您正在AWS Lambda上设置“静态”配置,这使AWS在存储之前对其服务器上的信息进行加密。您永远不会看到这种情况,也不会看到加密的值。
“传输中”加密是您在控制台上看到的一种。正如他们所说,GUI具有 helpers 来加密您的文本。这甚至可以为您加密文本,他们将其更改为*****。为了在函数中使用此变量,您需要编写代码以解密该值。在How to use encrypted environment variables in AWS Lambda?上有一个例子。
要使用CLI从GUI获得相同的结果,需要在调用aws cloudformation deploy
命令之前 手动加密变量。
答案 2 :(得分:1)
AWS改变了它的内部工作方式,因此Paul的答案现在不完整。 Lambda现在使用加密上下文解密变量,因此在加密值时需要使用它。 例如这样的
FUNCTION_NAME=lambda-function-name
PLAINTEXT=my-secret-variable
aws kms encrypt --key-id alias/the-alias \
--plaintext fileb://<(echo -n ${PLAINTEXT}) \
--encryption-context LambdaFunctionName=${FUNCTION_NAME} \
--output text --query CiphertextBlob
“ echo -n”是唯一对我有用的。使用cat file-path或指定路径名会直接产生一个稍有不同的版本,并带有一个使解密失败的尾随新行。
我建议使用aws控制台加密值,并确保可以解密该值。例如,将控制台生成的值放在token-console.base64enc中,然后尝试:
aws kms decrypt --region ap-southeast-2 \
--ciphertext-blob fileb://<(cat token-console.base64enc | base64 --decode ) \
--query Plaintext --output text --encryption-context \
LambdaFunctionName=${FUNCTION_NAME} | base64 --decode