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



在AWS Lambda函数内部,我有一些库可以在操作系统环境中查找敏感信息。我可以使用KMS加密env-var,但我发现自己不得不覆盖lambda处理程序模块中加密的env-var——这是一个漏洞吗?例如

# 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时,但在容器中设置它会是一个漏洞吗?据我所知,集装箱可能不会立即销毁。

此外,在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

在函数末尾取消设置相关变量是否足够(尽管很混乱)?

感谢

容器可能不会立即销毁。

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

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

然而。。。容器只能由您的的单个函数的一个单独版本重用。没有其他人,也没有其他函数或同一函数的不同版本,甚至来自同一帐户,重复使用您的容器。只有导致创建容器的函数版本。

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

这些评论引起了我的注意

注释是说,您应该将解密的变量存储在处理程序函数之外,这样它们就在全局范围内——每次调用函数时调用KMS API来解密变量的效率非常低。您可以想象这样做,但您应该将加密的环境变量存储在不同的名称下,然后将解密的值设置为代码期望的名称。

在函数末尾取消设置相关变量是否足够(尽管很混乱)?

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

加密环境变量的意义在于,当它们由Lambda基础设施静态存储时,它们是加密的。一旦它们在容器的内存空间中,它们就没有被破坏的可能,因为(如上所述)这些容器是您的功能所独有的。

最新更新