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
아래 스크립트를 사용하여 WORKERNUM
8 미만으로 설정하면(내 컴퓨터에서는 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)
--batch
decrypt 명령을 전달하려고 시도했지만 아무 것도 변경되지 않았습니다. 이와 관련된 언급이 있는지 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.