gpg-agent를 호스트에서 도커 컨테이너로 전달하고 캐시된 비밀번호를 재사용하는 방법은 무엇입니까?

gpg-agent를 호스트에서 도커 컨테이너로 전달하고 캐시된 비밀번호를 재사용하는 방법은 무엇입니까?

정보:

GPG version: 2.2.23
Docker version 20.10.5

저는 노트북에서 GPG를 사용하고 있으며 이를 도커 컨테이너에서 재사용하려고 합니다.

도커 컨테이너는 단지 PHP-FPM 알파인 이미지입니다. GPG를 사용하여 데이터를 암호화/해독할 수 있는 간단한 PHP CLI 도구가 있습니다. 호스트에서 GPG를 내보내고 컨테이너로 가져왔습니다. 하지만 문제는 데이터를 해독하기 위해 항상 PHP에 비밀번호를 제공해야 한다는 것입니다. 보안상의 이유로 컨테이너에서는 비밀번호를 사용하지 않으려고 합니다.

또한 컨테이너 내부에서 이를 발견 gpg-agent하고 사전 구성했지만 나중에 이것이 최선의 옵션이 아니라는 사실을 알게 되었습니다. 컨테이너를 다시 시작하거나 폐기하면 컨테이너를 다시 시작하고 비밀번호를 설정 gpg-preset-passphrase해야 하기 때문입니다 .gpg-agent

gpg-agent그래서 저는 docker가 데이터를 암호화/해독하는 데 이를 재사용할 수 있도록 docker 내부에 캐시된 비밀번호를 전달하는 방법이 있는지 궁금합니다 .

docker 내에서 ssh-agent를 재사용하는 것이 가능하다는 것을 알고 있지만 실제로 GPG에 대해 동일한 작업을 수행하는 방법을 찾을 수 없습니다.

아니면 더 좋고 안전한 방법이 있을까요?

답변1

나는 이 해결책이 매우 간단하다고 말하고 싶습니다.

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

제 경우에는 두 개의 키였습니다. 키 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 protected] | gpg --decrypt

[email protected]귀하의 이메일로 바꾸십시오 .

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-agentVS 에 대한 S.gpg-agent.extra일부 참고 사항은 암호화/암호 해독 작업만 허용하는 매우 제한된 버전입니다.S.gpg-agentS.gpg-agent.extra

이제 공개 키를 원격 서버로 내보내야 하며 다음 명령을 사용할 수 있습니다.

gpg --export [email protected] | ssh -p 22 user@remote-server gpg --import

[email protected]GPG 이메일로 바꾸세요 .

공개 키를 성공적으로 가져왔는지 확인하세요.

ssh -p 22 user@remote-server gpg -k

시험

이제 ssh gpgtunnel서버에서 실행하고 암호화/해독해 보세요. 이제 서버는 로컬 gpg-agent 소켓을 재사용할 수 있습니다.

echo "hello" | gpg --armor --encrypt --recipient [email protected] | gpg --decrypt

어떤 이유로든 이것이 작동하지 않으면 로컬 시스템에서 다음 SSH 명령을 실행할 수 있습니다.

ssh -fNT gpgtunnel

그러면 SSH가 백그라운드로 설정됩니다(-f 플래그). 이제 ssh gpgtunnel정상적으로 위의 암호화/암호 해독 명령을 다시 시도하십시오.

자원

관련 정보