如何將 gpg-agent 從主機轉發到 docker 容器並重用記憶體的密碼?
資訊:
GPG version: 2.2.23 Docker version 20.10.5
我在筆記型電腦上玩 GPG 並嘗試在 docker 容器中重用它。
docker 容器只是一個 PHP-FPM 高山映像。我有簡單的 PHP CLI 工具,它使用 GPG 加密/解密數據。我從主機導出 GPG 並將其導入容器中。但問題是,我總是需要為 PHP 提供密碼來解密數據。為了安全起見,我想避免在容器中使用密碼。
此外,我在容器中發現了
gpg-agent
withgpg-preset-passphrase
並對其進行了預配置,但後來發現這不是最佳選擇,因為一旦我重新啟動容器或銷毀它,我將需要重新啟動gpg-agent
並設置密碼。所以,我想知道,有沒有辦法
gpg-agent
在 docker 中使用記憶體的密碼片語,所以 docker 會重用它來加密/解密數據?我知道有可能在 docker 中重用 ssh-agent,但真的找不到對 GPG 做同樣事情的方法。
或者也許有更好/更安全的方式來做到這一點?
我會說決議非常簡單。
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
在我的情況下,它是兩個鍵,選擇一個 KEY 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@example.com | gpg --decrypt
替換
email@example.com
為您的電子郵件。通過 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-agent
關於vs的一些註釋S.gpg-agent.extra
。S.gpg-agent
允許導出私鑰和使用密鑰進行其他操作,這S.gpg-agent.extra
是一個非常有限的版本,僅允許加密/解密操作。現在您需要將公鑰導出到遠端伺服器,您可以使用以下命令:
gpg --export email@example.com | ssh -p 22 user@remote-server gpg --import
替換
email@example.com
為您的 GPG 電子郵件。確保您已成功導入公鑰:
ssh -p 22 user@remote-server gpg -k
測試
現在嘗試
ssh gpgtunnel
在伺服器上執行並進行加密/解密。現在伺服器應該能夠重用您的本地 gpg-agent 套接字。echo "hello" | gpg --armor --encrypt --recipient gpg.for.testing.in.docker@example.com | gpg --decrypt
如果由於某種原因這不起作用,您可以從本地電腦執行以下 SSH 命令:
ssh -fNT gpgtunnel
這會將 SSH 置於後台(-f 標誌)。現在
ssh gpgtunnel
正常並再次從上面重試加密/解密命令。資源