【发布时间】:2022-01-12 18:57:27
【问题描述】:
我正在尝试创建一个 AWS Lambda(在 python 中,尽管我的问题可能与 python 无关),除其他外,它将解密存储在 S3 中的 PGP 文件。
我有一个在本地运行良好的脚本(在 ubuntu 机器上)。我已将该脚本的相关部分改编为 lambda 脚本。我正在使用 python-gnupg,并创建了一个层来实现该功能。
我在那台 ubuntu 机器上创建了一个 CentOS 虚拟机,并将 gpg 放在上面。
我有一个我认为正确的部署 zip(内容是脚本、bin/gpg、lib/{libgpg-error.so.0、libreadline.so.7、libcrypt.so.20、libassuan.so。 0}; gpg 可执行文件和库都来自那个 CentOS VM)。例如,如果我从中删除 libassuan,我确实会收到关于缺少依赖项的错误,因此我相信 zip 是正确创建的。
当我部署 lambda 时,代码正确显示并且似乎可以运行(当然,我必须将其设置为使用 python-gnupg 层)。
这仍在基本测试中,因此我尝试解密的文件与我在 ubuntu 盒子测试中使用的文件相同,并且正在从 S3 中检索。解密密钥和密码正在从 AWS Parameter Store 中检索,并且据我所知,被正确检索(后者绝对正确;前者是正确的长度,具有正确的开始和正确的结束)。而且我在添加密钥时没有收到错误(我猜我不确定我是否会这样做)。
所以,一切看起来都不错,进来了。进入解密本身,我们有:
gpg = gnupg.GPG(gnupghome=f"{targetDir}/..", gpgbinary="./bin/gpg")
key_data = open(keyFileName, 'rb').read()
priv_key = gpg.import_keys(key_data)
decrData = gpg.decrypt_file(contents, passphrase=pgpPassphrase, always_trust=True, extra_args=[ '--yes' ])
if not decrData.ok:
logger.error (f"decryption failed: {decrData.status}")
正如我之前暗示的那样,这会失败并显示错误代码 2,并且打印的状态消息是“解密失败”。完全没有帮助。
不出所料,decrData 对象的数据为零。
如图所示,FWIW、always_true 和 extra_args 没有改变任何东西(也没有将两者都作为 extra_args=[ '--yes', '--always-trust' ] 传递)。在添加这些之前,我得到了完全相同的结果。
所以,说了这么多,问题是,有没有人对我可能做错的事情有任何建议,或者我可以检查什么以了解为什么会出现此错误?
谢谢。
更新: 好的,我在这里犯了一个错误。我在本地没有这个工作;我有一个不同的版本(使用 PGPy)在本地工作。
昨天在本地测试,我发现我的问题是密钥没有成功导入。其根源似乎是密钥格式错误(二进制,在 Parameter Store 中以 uuencoded 形式发送)。所以我重新导出了密钥,将参数 '--armor' 添加到 'gpg --export-secret-keys' 命令中,然后将 'passphrase=...' 添加到 gpg.import_keys() 调用中,然后在本地工作(至少要导入密钥;实际上我还没有检查 gpg.decrypt() 或 gpg.decrypt_file() 命令。
但是,取出导出的密钥并将其放入参数存储...看起来我正确地从参数存储中取回它(我检查了开头、结尾和中间的点 - 包括我从 Parameter Store 加入了两个参数),但是当我运行我的 lambda 时,密钥仍然没有正确导入。 FWIW,我确实尝试将“extra_args = ['--yes','--always-trust']”添加到gpg.import_keys(),但什么也没做。我还尝试将密钥文件上传到 S3,然后从那里取回,但也没有用。
再次,我欢迎任何关于其他尝试的建议。
再次感谢。
更新 2:我还尝试将密钥文件(ascii-armored)作为分发 zip 的一部分提供。这种工作(尽管我确实必须将密钥文件放入子目录;将它留在顶层会导致主 python 文件的权限问题,不知何故),因为文件在那里,并且似乎是正确阅读。但是,仍然无法导入密钥。
我似乎被困在使用 PGPy 解决方案的地方,代码在本地运行时运行良好,但在 AWS 中运行时却没有。
更新 3:终于完成了我的本地测试,正如预期的那样,文件完美解密。希望我知道为什么我不能在 AWS 上导入密钥。
【问题讨论】:
-
您不需要额外的 Lambda 层 - 为什么不直接将其与 zip 一起打包?并且代码在本地都可以正常工作吗?
-
我尝试将 python 的东西放入同一个 zip 中,但没有找到。由于我之前创建了图层,因此连接图层比找出找不到它的原因更容易(但以防万一,它位于名为“python”的目录中,与图层相同邮编)。
-
是的,它在本地运行良好
-
Python 文件需要位于根目录 - 创建一个新目录,将脚本添加到其中,
cd进入目录,然后从内部运行pip install --target ./ python-gnupg。压缩然后上传,然后重试。 -
只是为了笑,我将 python-gnupg 的东西从 python 目录移到了根目录,并删除了层引用。仍然运行,但结果相同。
标签: python amazon-web-services encryption aws-lambda