Debian 10でgpg-agentとキーチェーンを使用してgpgキーパスワードをキャッシュする方法は?

Debian 10でgpg-agentとキーチェーンを使用してgpgキーパスワードをキャッシュする方法は?

Debian 10 サーバーがあります。 msmtpを使用して電子メールを送信したいので、gpgキーのパスワードをキャッシュする必要があります。 msmtpに必要なsmtpパスワードは、このgpgキーを使用してファイル内で暗号化されます。 msmtpはgpgを使用してファイルを復号化し、smtpパスワードを取得します。

次の行は /etc/msmtprc ファイルにあります。

passwordeval gpg --no-tty -q -d /etc/.msmtp-password.gpg

gpg-agentとキーチェーンを使用してgpgキーのパスワードをキャッシュしようとしています。。これにより、システムはパスワードを要求せずに電子メールを送信できます。

サーバーを起動するたびに必要です。gpgキーのパスワードを一度だけ送信すると、そのキーのパスワードは次回再起動するまでキャッシュされます。。 (ログアウトして再度ログインすると、次の再起動前にgpgキーのパスワードを送信する必要はありません。)

リモートホスト(Debianサーバー)からログアウトしたときにgpg-agentが停止し、成功しませんでした。 SSHキーチェーンを介して新しい接続を確立すると、新しいエージェントが新しいPIDで開始され、キーのパスワードが失われます。

以下で私がしたことを見ることができます。これが有益な情報になることを願っています。あなたが私を助けてくれたら嬉しいです。

私のLinuxバージョン

cat /etc/issue
Debian GNU/Linux 10 \n \l

GPバージョン

gpg --version
gpg (GnuPG) 2.2.12
libgcrypt 1.8.4

シークレットGPGキーを生成し、そのキーのパスワードを求めるメッセージが表示されます

gpg --gen-key
...
Nom réel : [email protected]
Adresse électronique : [email protected]
Vous avez sélectionné cette identité :
    « [email protected] <[email protected]> »
...
les clefs publique et secrète ont été créées et signées.

pub   rsa3072 2020-10-15 [SC] [expire : 2022-10-15]
      3C82AB1E9384F4A92CEBCE7077B1EDA25A942746
uid                      [email protected] <[email protected]>
sub   rsa3072 2020-10-15 [E] [expire : 2022-10-15]

私達はキーを確認します

gpg --list-secret-keys --with-keygrip
...
sec   rsa3072 2020-10-15 [SC] [expire : 2022-10-15]
      3C82AB1E9384F4A92CEBCE7077B1EDA25A942746
      Keygrip = 47CF9E2C933761CF1021731F72603B8291BB211C
uid          [  ultime ] [email protected] <[email protected]>
ssb   rsa3072 2020-10-15 [E] [expire : 2022-10-15]
      Keygrip = 4133708B3FA225C4732A0F9FBD0053DEF937B46A

gpg-agentプロセスのPIDを確認してください。

ps aux | grep gpg-agent
root       738 17.1  0.0  81204  3864 ?        SLs  16:55   0:04 /usr/bin/gpg-agent --supervised
root       745  0.0  0.0   6092   824 pts/0    S+   16:56   0:00 grep gpg-agent

gpg-agentに知られているキーを確認してください。

gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 47CF9E2C933761CF1021731F72603B8291BB211C D - - - P - - -
S KEYINFO 4133708B3FA225C4732A0F9FBD0053DEF937B46A D - - - P - - -
OK

gpg-agentオプションを確認してください

gpgconf --list-options gpg-agent
Monitor:1:0:Options contrôlant la sortie de diagnostique:0:0::::
...
default-cache-ttl:24:0:oublier les codes personnels après N secondes:3:3:N:600::
default-cache-ttl-ssh:24:1:oublier les clefs SSH après N secondes:3:3:N:1800::
max-cache-ttl:24:2:définir la durée maximale du cache de code personnel à N secondes:3:3:N:7200::
max-cache-ttl-ssh:24:2:définir la durée maximale du cache de clef SSH à N secondes:3:3:N:7200::
...
pinentry-timeout:24:1:set the Pinentry timeout to N seconds:3:3:N:0::

default-cache-ttlとmax-cache-ttlが低すぎると、gpg-agentは10分間だけパスワードをキャッシュします。キーチェーンを使用する予定の場合、この期間は短すぎます。ログファイルを追加することもできます。 gpg-agent.conf ファイルを追加してデフォルトのオプションを変更できます。

cat ~/.gnupg/gpg-agent.conf
default-cache-ttl 31536000
max-cache-ttl 31536000
log-file /var/log/gpg-agent
debug-level basic

新しいgpg-agentオプションが追加されたことを確認してください。

gpgconf --list-options gpg-agent

Monitor:1:0:Options contrôlant la sortie de diagnostique:0:0::::
...
default-cache-ttl:24:0:oublier les codes personnels après N secondes:3:3:N:600::31536000
default-cache-ttl-ssh:24:1:oublier les clefs SSH après N secondes:3:3:N:1800::
max-cache-ttl:24:2:définir la durée maximale du cache de code personnel à N secondes:3:3:N:7200::31536000
max-cache-ttl-ssh:24:2:définir la durée maximale du cache de clef SSH à N secondes:3:3:N:7200::
...
pinentry-timeout:24:1:set the Pinentry timeout to N seconds:3:3:N:0::

新しいオプションを有効にするためにgpg-agent設定を再ロードします。

gpg-connect-agent reloadagent /bye
OK

私たちがキーホルダーを設置していることに注意してください

apt install -y keychain

キーチェーンバージョン

keychain -V

 * keychain 2.8.5 ~ http://www.funtoo.org

GPGキーを復号化するためにキーチェーンキャッシュを使用します。

keychain --eval --agents gpg 3C82AB1E9384F4A92CEBCE7077B1EDA25A942746

 * keychain 2.8.5 ~ http://www.funtoo.org
 * Inheriting gpg-agent (738)
GPG_AGENT_INFO=/run/user/0/gnupg/S.gpg-agent:738:1; export GPG_AGENT_INFO;

 * Adding 1 gpg key(s): 3C82AB1E9384F4A92CEBCE7077B1EDA25A942746

パスワードを入力したので、復号化されたGPGキーはgpg-agentによってキャッシュされます(1を参照)。

gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 47CF9E2C933761CF1021731F72603B8291BB211C D - - 1 P - - -
S KEYINFO 4133708B3FA225C4732A0F9FBD0053DEF937B46A D - - - P - - -
OK

.bashrc ファイルを変更します。次にキーチェーンにログインすると、gpg-agentによってキャッシュされた復号化されたGPGキーが見つかります。次の再起動時に、キーチェーンは次の再起動までキーのパスワードを一度尋ねます。

cat ~/.bashrc
...
# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022
...
eval $(keychain --agents gpg)

default-cache-ttlとmax-cache-ttlを確認するために、gpg-agentのデフォルト設定を超えて700秒待ちます。

jeudi 15 octobre 2020, 16:56:32 (UTC+0200)

jeudi 15 octobre 2020, 17:08:12 (UTC+0200)

gpg-agentに知られているキーを確認し、復号化されたGPGキーはまだgpg-agentにキャッシュされています(1を参照)。

gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 47CF9E2C933761CF1021731F72603B8291BB211C D - - 1 P - - -
S KEYINFO 4133708B3FA225C4732A0F9FBD0053DEF937B46A D - - - P - - -
OK

ファイルを生成し、それをキーで暗号化します(暗号化にはパスワードは必要ありません)。

touch file.txt && gpg -e -r [email protected] file.txt

ファイルのパスワードを復号化します。復号化されたGPGキーは700秒後でもgpg-agentによってキャッシュされるため、パスワードは必要ありません。

gpg --decrypt file.txt.gpg > file.txt
gpg: chiffré avec une clef RSA de 3072 bits, identifiant 4E40A1918B514393, créée le 2020-10-15
      « [email protected] <[email protected]> »

私たちログアウトしてもう一度ログインしてください。SSHを介してリモートホストに接続します。新しくログインすると、キーチェーンはキャッシュされたキーを使用して古いgpg-agentを見つけることができません。その後、キーチェーンは新しいgpg-agentを起動しますが、キャッシュされたキーは失われます。

* keychain 2.8.5 ~ http://www.funtoo.org
* Starting gpg-agent...

挨拶

答え1

ついに解決策を見つけました。

gpg-agentはbashセッションからログアウトして閉じます。監督モデル

ファイルを見る:

/usr/share/doc/gpg-agent/README.Debian

システム=======

2.1.17以降、systemdを持つシステムのユーザーは、予想されるgpg-agentソケット(sshソケットを含む)に初めてアクセスすると、systemdのユーザーセッションによってgpg-agentプロセスが自動的に開始されます。 systemdは、セッションがログオフするとプロセスを完全に終了します。

これでgpg-agentを起動する必要があります。デーモンモードgpg-agentのPIDをセッション全体で同じにしてください。

これを行う前に、systemdでgpg-agentを「ブロック」する必要があります。

systemctl --user mask --now gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket gpg-agent-browser.socket

これは「unmask」オプションでキャンセルできます(README.Debianファイルを参照)。

次回、gpg-agent が要求されると(キーの生成時やキーチェーンの使用など)、デーモンモードで起動され、複数のセッションで実行されます。

ps aux | grep gpg-agent
root       816  0.2  0.0  81356  3624 ?        Ss   17:19   0:04 gpg-agent
--homedir /root/.gnupg --use-standard-socket --daemon

.bashrc ファイルに以下を追加します。

eval $(keychain --eval --agents gpg secretkey)

ログアウトして再度ログインすると、キーチェーンは正しいgpg-agent(PID確認)を見つけてパスワードを要求しません。

keychain 2.8.5 ~ http://www.funtoo.org
Found existing gpg-agent: 816
Known gpg key: 677AAEB080C1045F3D3D3532B5AE92F1F49350D1

パスワードなしでファイルを復号化できます

gpg --decrypt file.txt.gpg > file.txt
gpg: chiffré avec une clef RSA de 3072 bits, identifiant F1B9BB72AAECF1C7,
créée le 2020-10-16
« [email protected] <[email protected]> »

お役に立てば幸いです。

関連情報