【问题标题】:GPG decryption in AWS Lambda error code 2AWS Lambda 错误代码 2 中的 GPG 解密
【发布时间】: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


【解决方案1】:

这里有几件事要补充。

我对本地测试感到困惑的部分原因是我让它在 Python 3.7 运行时(它具有 GPG 作为 VM 的一部分)下运行。所以这是部分答案。

不过,我试图让它在 3.9 下运行,以保持最新状态。我曾尝试通过 Docker 映像解决此问题。我创建了映像,但由于可怕的原因,无法部署它。所以这就是我尝试通过部署 zip 进行尝试的原因。

正如我所提到的,我使用的是从 CentOS 虚拟机中提取的 GPG 版本(和附属库)。这确实比我之前使用 Ubuntu 的 GPG/库的尝试更接近。这在 libc 版本上已经崩溃了。

不过,今天我终于想到,也许我可以拆开我的 Docker 映像,并从中获取 GPG/库。使用 'docker save --output="filename.tar" image-name',我能够将文件转储出去,因此我筛选了这些文件以获取相关文件并创建一个新的部署 zip。

缺点是效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多