정보:
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-agent
VS 에 대한S.gpg-agent.extra
일부 참고 사항은 암호화/암호 해독 작업만 허용하는 매우 제한된 버전입니다.S.gpg-agent
S.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
정상적으로 위의 암호화/암호 해독 명령을 다시 시도하십시오.