我已经从AWS Secrets中检索了我的ssh私钥,并将在paramiko中传递它用于ssh。但是,由于库只接受文件名,因此不能传递从秘密管理器检索到的私钥字符串。因此,我想将字符串写入/tmp
中的文件。
但是我想知道在lambda中向/tmp
写入敏感数据是否存在安全隐患。
每个Lambda执行环境都包括一个可写文件系统,可在/tmp
中获得。其他执行环境无法访问此存储
与进程状态一样,写入/tmp
的文件在执行环境的生命周期内保持不变。
/tmp
存储是通过Amazon Elastic Block Store (Amazon EBS)或Lambda worker实例上的本地存储实现的。
这样在Lambda中使用/tmp
是比较安全的,这意味着您的/tmp
文件夹将不会与其他AWS客户端共享。
另外,如果您想确保数据被擦除,而不是在同一帐户和不同客户帐户中的功能之间共享,您可以将数据保存在内存中。
根据AWS文档:
Lambda在分配内存之前擦洗内存到一个执行环境,这有效地防止内存共享属于同一帐户和不同客户帐户的功能。为了方便执行环境重用时,Lambda不会在后续执行环境之间擦洗内存同一函数在同一执行环境上的调用。你可以在功能终止前实现自己的内存加密和擦除过程。
关于AWS Lambda的安全性概述,您可以查看AWS Lambda的安全性概述,在第7页我们有关于存储和状态的概述。
但是由于库只接受文件名,所以我不能传递私钥字符串…
这并不完全正确,paramiko.RSAKey.from_private_key也可以从字符串缓冲区中读取:
import io
import paramiko
# Read private key from AWS secrets
private_key = ...
private_key_buffer = io.StringIO()
private_key_buffer.write(private_key)
private_key_buffer.seek(0)
private_key = paramiko.RSAKey.from_private_key(private_key_buffer)
ssh = paramiko.SSHClient()
ssh.connect(pkey = private_key, ...)
这意味着你不必为了让库读取它而把它写到一个临时位置。
如果您仍然喜欢使用/tmp
,请记住,该位置可能在调用相同函数之间持续存在。除此之外,当/tmp
位置被分配给另一个函数执行时,它将被清理。