情報:
GPG version: 2.2.23
Docker version 20.10.5
私はラップトップでGPGを使用しており、これをDockerコンテナで再利用しようとしています。
Dockerコンテナは、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
私の場合は2つの鍵でした。キー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]
あなたのEメールに置き換えてください。
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
上記の暗号化/暗号化解除コマンドを再試行してください。