如何将 gpg-agent 从主机转发到 docker 容器并重用缓存的密码?

如何将 gpg-agent 从主机转发到 docker 容器并重用缓存的密码?

信息:

GPG version: 2.2.23
Docker version 20.10.5

我正在我的笔记本电脑上玩 GPG 并尝试在 docker 容器中重用它。

docker 容器只是一个 PHP-FPM alpine 镜像。我有简单的 PHP CLI 工具,可以使用 GPG 加密/解密数据。我从主机导出 GPG 并将其导入容器内。但问题是,我总是需要为 PHP 提供密码来解密数据。为了安全起见,我想避免在容器中使用密码。

此外,我发现了 gpg-agentwithgpg-preset-passphrase并在容器内预配置了它,但后来发现这不是最佳选择,因为一旦我重新启动容器或销毁它,我将需要gpg-agent再次启动并设置密码。

所以,我想知道,是否有一种方法可以gpg-agent在 docker 内部传递缓存的密码,以便 docker 重用它来加密/解密数据?

我知道有可能在 docker 内重用 ssh-agent,但无法真正找到一种方法来为 GPG 做同样的事情。

或者也许有更好/安全的方法来做到这一点?

答案1

我想说这个决议非常简单。

GPG

首先,您需要开始gpg-agent

gpg-agent --verbose --daemon --log-file /tmp/gpg-agent.log --allow-preset-passphrase --default-cache-ttl=31536000

这将在后台启动 gpg-agent。您可以验证它是否正在运行:

ps aux | grep gpg

现在您需要使用gpg-preset-passphrase私钥预设密码。gpg-preset-passphrase不在 中/usr/local/bin,因此您需要找到它:

sudo find / -name gpg-preset-passphrase

就我而言,它是/usr/local/Cellar/gnupg/2.3.1_1/libexec/gpg-preset-passphrase,所以现在运行以下命令来找出私有 KEYID:

gpg-connect-agent 'keyinfo --list' /bye

示例输出:

S KEYINFO 4B86D9FBE0D9617C6EB4B42015C9B2AC8XXXXXXX D - - - P - - -
S KEYINFO 8960D3408E09A1A111AA862DBFB1B16CFXXXXXXX D - - - P - - -
OK

就我而言,它是两个密钥,选择其中一个密钥 ID。

echo "your-secret-passphrase" | /your/path/to/gpg-preset-passphrase --verbose --preset 4B86D9FBE0D9617C6EB4B42015C9B2AC8XXXXXXX

替换your-secret-passphrase为您的密码、/your/path/to/您的路径和4B86D9FBE0D9617C6EB4B42015C9B2AC8XXXXXXX您自己的 KEYID。

现在再次运行以下命令以验证密码是否已成功设置:

gpg-connect-agent 'keyinfo --list' /bye

如果您在所选的 KEYID 附近看到“1”,则表示密码设置成功。

我们通过加密和解密来验证一下:

echo "hello" | gpg --armor --encrypt --recipient [email protected] | gpg --decrypt

替换[email protected]为您的电子邮件。

通过 SSH 的 GPG 代理转发

将以下内容添加到您的~/.ssh/config

Host gpgtunnel
    User user
    HostName server-ip
    Port 22
    RemoteForward /root/.gnupg/S.gpg-agent /home/user/.gnupg/S.gpg-agent
    IdentityFile ~/.ssh/id_rsa

RemoteForward具有以下签名:<remote path> <local path>.您可以通过运行以下命令找到本地路径的位置:

gpgconf --list-dir agent-extra-socket

ssh 到您的服务器并通过运行以下命令查找远程路径:

gpgconf --list-dir agent-socket

关于S.gpg-agentvs 的S.gpg-agent.extra一些注意事项S.gpg-agent允许导出私钥和使用密钥进行其他操作,这S.gpg-agent.extra是一个非常有限的版本,仅允许加密/解密操作。

现在需要将公钥导出到远程服务器,可以使用以下命令:

gpg --export [email protected] | ssh -p 22 user@remote-server gpg --import

替换[email protected]为您的 GPG 电子邮件。

确保您已成功导入公钥:

ssh -p 22 user@remote-server gpg -k

测试

现在尝试ssh gpgtunnel在服务器上运行并进行加密/解密。现在服务器应该能够重用您的本地 gpg-agent 套接字。

echo "hello" | gpg --armor --encrypt --recipient [email protected] | gpg --decrypt

如果由于某种原因这不起作用,您可以从本地计算机运行以下 SSH 命令:

ssh -fNT gpgtunnel

这会将 SSH 置于后台(-f 标志)。现在ssh gpgtunnel正常情况下,再次重试上面的加密/解密命令。

资源

相关内容