gpg-agentをホストからDockerコンテナに渡し、キャッシュされたパスワードを再利用する方法は?

gpg-agentをホストからDockerコンテナに渡し、キャッシュされたパスワードを再利用する方法は?

情報:

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-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上記の暗号化/暗号化解除コマンドを再試行してください。

リソース

おすすめ記事