Security

如何將 gpg-agent 從主機轉發到 docker 容器並重用記憶體的密碼?

  • July 8, 2021

資訊:

GPG version: 2.2.23
Docker version 20.10.5

我在筆記型電腦上玩 GPG 並嘗試在 docker 容器中重用它。

docker 容器只是一個 PHP-FPM 高山映像。我有簡單的 PHP CLI 工具,它使用 GPG 加密/解密數據。我從主機導出 GPG 並將其導入容器中。但問題是,我總是需要為 PHP 提供密碼來解密數據。為了安全起見,我想避免在容器中使用密碼。

此外,我在容器中發現了 gpg-agentwithgpg-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.extraS.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正常並再次從上面重試加密/解密命令。

資源

引用自:https://unix.stackexchange.com/questions/656738