너무 많은 요청을 받으면 gpg-agent가 키 비밀번호를 "잊어버립니다"

너무 많은 요청을 받으면 gpg-agent가 키 비밀번호를 "잊어버립니다"

Regolith를 통해 Ubuntu를 실행 중이고 로그인하면 gpg 키가 잠금 해제됩니다. 여러 개의 암호 해독 작업을 병렬로 실행하고 있는데 7을 초과하면 gpg-agent키가 잠금 해제되었다는 사실을 "잊고" pinentry를 묻는 메시지가 표시됩니다.

❯ gpg --version
gpg (GnuPG) 2.2.27
libgcrypt 1.10.1

나는 이것을 파이썬으로 보여주기 위해 최소한의 작업 예제를 만들었습니다.

해독할 테스트 파일을 만듭니다. . 암호를 묻지 않고 echo "something" | gpg --encrypt -o test.gpg셸에서 실행합니다 .gpg --decrypt test.gpg

아래 스크립트를 사용하여 WORKERNUM8 미만으로 설정하면(내 컴퓨터에서는 1로 설정하면 모든 컴퓨터에서 작동할 것 같습니다) 스크립트는 암호를 묻지 않고 행복하게 암호를 해독합니다. 그러나 8 이상으로 늘리면 모든 프로세스에서 나오는 것은 아니고 일부 프로세스에서 나오는 것 같지만 비밀번호에 대한 요청을 받기 시작합니다. 프로세스 실행도 분명히 중단되기 시작합니다(대기 중이라고 가정합니다 gpg-agent).

import subprocess
import multiprocessing as mp
import time



the_queue = mp.Queue()
WORKERNUM = 7

def worker_main(queue):
    while True:
        msg = queue.get(True)
        print(time.time(), msg)
        out = subprocess.run(["gpg", "--decrypt", "test.gpg"], capture_output=True)
        print(msg, time.time(), out.stdout)


the_pool = mp.Pool(WORKERNUM, worker_main, (the_queue,))

counter = 0
while True:
    counter += 1
    the_queue.put(counter)
    print(the_queue.qsize())
    while the_queue.qsize() > 10:
        time.sleep(0.1)

--batchdecrypt 명령을 전달하려고 시도했지만 아무 것도 변경되지 않았습니다. 이와 관련된 언급이 있는지 gpg알아보기 위해 매뉴얼 페이지를 살펴봤지만 gpg-agent아무것도 찾을 수 없습니다. 두 가지 질문이 있습니다.

a) 왜 이런 일이 발생하는지, b) 이를 방지하기 위해 처리 풀의 최대 크기를 파악할 필요 없이 대신 gpg이를 처리하고 pinentry를 얻지 않도록 구성할 수 있습니까?

답변1

꼼꼼히 관찰한 끝에 journalctl찾아낸실제오류는 입니다 Cannot allocate memory. 기반으로이 토론, gpg-agent여러 스레드가 보안 메모리에 액세스하려고 하면 보안 메모리가 소진될 수 있습니다. 설정하면 문제가 해결 auto-expand-secmem 100됩니다 .~/.gnupg/gpg-agent.conf

       --auto-expand-secmem n                                                                                                                                  Allow Libgcrypt to expand its secure memory area as required. The optional
value n is a non-negative integer with a suggested size in bytes of each
additionally allocated secure memory area. The value is rounded up to the next
32 KiB; usual C style prefixes are allowed. For an heavy loaded gpg-agent with
many concurrent connection this option avoids sign or decrypt errors due to out
of secure memory error returns.

관련 정보