Debian 10에서 gpg-agent와 키체인을 사용하여 gpg 키 비밀번호를 캐시하는 방법은 무엇입니까?

Debian 10에서 gpg-agent와 키체인을 사용하여 gpg 키 비밀번호를 캐시하는 방법은 무엇입니까?

데비안 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로 시작되고 키의 비밀번호가 손실됩니다.

아래에서 제가 한 일을 볼 수 있을 것입니다. 이것이 유익한 정보가 되기를 바랍니다. 당신이 나를 도와주신다면 기쁘겠습니다.

내 리눅스 버전

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]> »

도움이 되었기를 바랍니다.

관련 정보