【问题标题】:Set environment variables from gpg encrypted shell script?从 gpg 加密的 shell 脚本设置环境变量?
【发布时间】:2015-04-05 12:39:27
【问题描述】:

我正在尝试将 S3 的一些环境变量存储在加密的 shell 脚本中(因此这些密钥不会未加密地存储在我的驱动器上),如下所示:

export AWS_ACCESS_KEY_ID="example_key_id"
export AWS_SECRET_ACCESS_KEY="example_secret_access_key"

这被保存为一个shell脚本setenv.sh,我已经加密为setenv.sh.gpg

我正在尝试使用 eval $(gpg --decrypt ./setenv.sh.gpg) 运行文件脚本,它会解密文件,但不会相应地加载环境变量(printenv 确认了这一点)。

我觉得可能和这个问题有关:Shell script to set environment variables

但是,我尝试了 source 的许多不同变体,但都无济于事,因为我认为 source 需要一个文件而不是脚本的内容。

如何使用 gpg 加密的 shell 脚本设置环境变量?

【问题讨论】:

  • Bash 中的 Process substitution 可能会这样做;这在 Zsh 中可用吗? source <( gpg --decrypt ./setenv.sh.gpg )。如此获得的安全是虚幻的吗?是什么阻止您的用户运行 GPG 命令并查看输出?
  • 我想这样设置脚本的原因是我可以为不同的项目加载不同的 S3 密钥,而不必每次都手动输入它们。安全方面,我认为这将是一个好主意,以防我的笔记本电脑被盗或被盗。 (我有全盘加密,但解锁时也可能被盗等)
  • 我认为它符合“通过默默无闻的安全”的条件,但只要您认识到这一点,并意识到它的局限性,就不会造成太大的伤害。特别是,在我看来,你不应该依赖它来保证一切安全。

标签: shell encryption zsh


【解决方案1】:

正如第一位评论者所说,source <(gpg --decrypt ./setenv.sh.gpg) 将完成您所追求的目标。它应该可以在 Zsh 和 bash 中工作。

注意Zsh 也有 =(...) 用于进程替换,但这会在某个地方留下一个未加密的临时文件,这会破坏使用加密的目的。坚持使用命名管道的

如果目标是保护凭据不被用户使用,那么这是徒劳的。另一方面,如果您想在笔记本电脑被盗时保护凭证,那么这里有一些真正的保护。将凭证加密保存在磁盘上并仅在需要时将其加载到内存中是一种相当常见的策略。

鉴于您的硬盘已加密,我不确定您会从中获得多少收益。我能想到的唯一现实的好处是,如果您保留未加密的备份并且它们被盗。根据你的偏执程度,它可能值得也可能不值得麻烦。

【讨论】:

  • 出于某种原因,运行它会回显几行,说明它需要一个密码来进行 gpg 解密,但从不提示输入密码?我什至不能按 ctrl+c 回到 shell。
  • 奇怪的是,它在 bash 中有效,但在 zsh 中无效,即使暂时完全删除了我的 .zshrc 配置文件
  • 我认为你需要在 zsh 中使用 . 而不是 source
【解决方案2】:

在 Zsh 中,您应该可以调用:

$(gpg --decrypt ./setenv.sh.gpg)

或者在脚本中弹出该行,然后使用. 调用它,例如:

. decrypt-and-setenv.sh

这会将环境变量导出到您当前的 shell 中,并使文件保持加密状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 2013-09-04
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多