在AWS Lambda函数中解密和设置环境变量是一个漏洞吗?

时间:2017-11-16 22:26:28

标签: amazon-web-services security encryption environment-variables aws-lambda

在AWS Lambda函数内部,我有一些库在os环境中查找敏感信息。我可以使用KMS对env变量进行加密,但我发现自己必须覆盖lambda处理程序模块中的加密env变量 - 这是一个漏洞吗?例如

# lambda_handler.py

encrypted_env_var = os.environ["SECRET_KEY"]
decrypted_env_var = decrypt(encrypted_env_var)
os.environ["SECRET_KEY"] = decrypted_env_var

def lambda_function(event, context):
    ... libs get and use SECRET_KEY ...

我知道加密它们会覆盖你,例如。使用awscli时,但是可以在容器中设置这个漏洞吗?据我所知here,容器可能不会立即销毁。

此外,在AWS提供给你的建议的解密代码片段中(在lambda仪表板中),这些评论引起了我的注意:

# lambda_handler.py

ENCRYPTED = os.environ['SECRET_KEY']
# Decrypt code should run once and variables stored outside of the function
# handler so that these are decrypted once per container
DECRYPTED = boto3.client('kms').decrypt(CiphertextBlob=b64decode(ENCRYPTED))['Plaintext']

def lambda_handler(event, context):
  # handle the event here

在功能结束时取消设置相关变量是否足够(虽然很麻烦)?

由于

1 个答案:

答案 0 :(得分:2)

  

容器不得立即销毁。

容器几乎肯定不会立即销毁......但这还不错。

容器可以持续数分钟到数小时,并且可以重复使用 - 这就是Lambda函数通常能够如此快速地执行的原因,因为在理想条件下,大多数函数调用都会找到一个可以重用的空闲容器。

但是......容器只能由您的一个单一功能的单个版本重复使用。没有其他人,也没有其他功能或相同功能的不同版本,即使是来自同一个帐户,也可以重用您的容器。只有导致容器创建的函数版本。

基础设施会销毁不再需要的容器,并根据您的功能看到(或未看到)的流量来执行此操作。轶事观察表明,如果您完全停止调用您的功能,所有闲置容器将在10-15分钟后完全消失,但这没有记录,可能会有所不同。

  

这些评论引起了我的注意

评论说你应该将解密的变量存储在处理函数之外,这样它们就在全局范围内 - 调用KMS API来解密变量是非常低效的。调用函数。您可以想象,但是您应该使用不同的名称存储加密的环境变量,然后将解密的值设置为您的代码所期望的名称。

  

在功能结束时取消设置相关变量是否足够(虽然很麻烦)?

除非您将原始加密值存储在其他地方(例如使用不同的初始环境变量名称),否则这将无效,因为您的示例代码将覆盖加密值,并且下次您的函数在该容器中运行时,它将无法解密那些未设置的值。

加密环境变量的要点是,当它们由Lambda基础架构静态存储时,它们是加密的。一旦它们进入容器的存储空间,就没有可能被它们泄露,因为(如上所述)这些容器是你的功能所独有的。