Fedora 25(F25)ワークステーション、KDEスピンで作業しています。自動テストを実行するスクリプトを書いています。
自動化されたテストの1つには、RPMSIGN(8)プログラムを呼び出し、次に、GPG(1)を呼び出して、作成中のいくつかのRPMファイルにデジタル署名を添付します。もちろん、GPGはpinentry(PINエントリ)を使用して、RPM署名キー(RSAキーペア)のパスフレーズを入力するように人間に促します。人間がループから抜け出し、RPM署名キーのパスフレーズを提供するタスクを完全に自動化したいと考えています(そうです、セキュリティへの影響については知っています。これは、自動化されたテスト環境であり、運用ホストではないので、セキュリティについてはあまり心配していません。製品版では、ユーザーはRPM署名キーのパスワードを手動で入力します。)
以前は、GPGがテキストを入力するのを待つEXPECT(1)スクリプトをコンソールに入力しました。その後、EXPECTスクリプトがパスフレーズを入力し、そのまま進みました。よく働きました。
F25のpinentry機能は、RPM署名鍵のパスフレーズを自動入力するための既存のEXPECTベースのソリューションを壊します。
このF25ホストのGUIコンソールウィンドウでRPMSIGNを実行すると、GPGはpinentryを使用して、ユーザー(私)にRPM署名キーのパスフレーズの入力を求めるGUIダイアログボックスをポップアップ表示します。もちろん、このピンエントリの動作は、パスフレーズの自動入力を妨げ、防止します。
DISPLAY環境変数を一時的に設定解除するBashスクリプトを作成すると、GUIダイアログが表示されなくなります。
#!/bin/bash
DISPLAY_SAVE=$DISPLAY
unset DISPLAY
rpmsign --resign "/path/to/test-1.0.0-1.fc25.noarch.rpm"
export DISPLAY=$DISPLAY_SAVE
しかし、今度はコンソールにダイアログのncursesバージョンが表示されます。
+----------------------------------------------------------------+
| Please enter the passphrase to unlock the OpenPGP secret key: |
| "Testing (rpm-sign)" |
| 1024-bit RSA key, ID 0123456789ABCDEF, |
| created 2016-12-02. |
| |
| |
| Passphrase: __________________________________________________ |
| |
| <OK> <Cancel> |
+----------------------------------------------------------------+
繰り返しになりますが、pinentry-cursesのコンソールの「ダイアログ」は、パスフレーズの自動入力を妨害し、防止します。
Pinentryモジュールを永続的に変更または無効にしたくありません。それらを一時的に無効にして、GPTのCLIプロンプト「パスフレーズを入力してください:」(または現在のプロンプト文字列)に戻ります。
CLIを介してRPM署名鍵のパスフレーズの入力を完全に自動化するための提案はありませんか?
__Joe Damatoに_gpg-preset-passphrase
_ユーティリティを教えてくれてありがとう。以下で説明するソリューションは、_gnupg2-2.1.x
_がインストールされたFedora 25ホストで開発およびテストされました。
(nbは、古いバージョンのGnuPGを実行しているプラットフォームで_--with-keygrip
_オプションをサポートしていないため、RPM署名キーのキーグリップ値を判別する方法をまだ理解していません。この解決策についてコメントしたい場合、 してください。)
_~/.gnupg/gpg-agent.conf
_に行が含まれていることを確認します。
_allow-preset-passphrase
_
_~/.gnupg/gpg-agent.conf
_を変更した後、gpg-agentをリロードします。
_$ gpg-connect-agent reloadagent /bye
OK
_
GPGキーを一覧表示して、RPM署名キーの8桁の16進数のキーIDを取得します。この例では、キーIDは_0123ABCD
_です。
_$ gpg --list-keys
/home/me/.gnupg/pubring.gpg
-----------------------------------
pub 1024R/0123ABCD 2015-06-13
uid Test (rpm-sign)
_
RPM署名鍵のキーグリップコードを取得します。 (n.b.テストに使用するRHEL 7.2およびFedora 20ホストでは、それらのホストのGPG2(1)
プログラムは_--with-keygrip
_オプションを認識しませんでした。)
_$ gpg2 --with-keygrip -K 0123ABCD
sec rsa1024 2015-06-13 [SCEA]
0A1B2C3D4E5F6A7B8C9D0E0F1A2B3C4D0123ABCD
Keygrip = 2EACA0C5A4B46168EB91970B6715AF1AA52968BE
uid [ unknown] Test (rpm-sign)
_
RPM署名キーのパスフレーズをキャッシュします。以下に示すコマンドラインで、_'PASSPHRASE'
_をRPM署名鍵の実際のパスフレーズに置き換えます。
_$ /usr/libexec/gpg-preset-passphrase --passphrase 'PASSPHRASE' --preset 2EACA0C5A4B46168EB91970B6715AF1AA52968BE
_
署名されていないテストRPMファイルを作成します。テストRPMファイルが署名されていないことを確認します。
_$ rpm --checksig test-1.0.0-1.f25.noarch.rpm
test-1.0.0-1.fc25.noarch.rpm: sha1 md5 OK
_
テストRPMファイルに署名するときに、RPMSIGN(8)
がキャッシュされたパスワードを使用すること、つまりRPMSIGN(8)
がRPM署名キーのパスフレーズの入力を求めないことを確認します。
_$ rpmsign --resign test-1.0.0-1.f25.noarch.rpm
_
テストRPMファイルが署名されていることを確認します。
_$ rpm --checksig test-1.0.0-1.f25.noarch.rpm
test-1.0.0-1.fc25.noarch.rpm: rsa sha1 (md5) pgp md5 OK
_
これによると GnuPG Issue 2331 webpage :
gpg1はキーグリップについては認識していません。キーグリップの代わりに、gpg1はgpg-agentのキャッシュIDとしてフィンガープリントを使用します。エージェントのコマンドGET_PASSPHRAEは、gpg1によって使用される場合、gpg-preset-passphrasesが使用するものとは異なるキャッシュモードを使用します。したがって、キーグリップを(サブ)キーの指紋に置き換えても機能しません。
価値のあるものとして、RHEL7ホストでGnuPGバージョン2.0.xを使用していくつかのテストを行いましたが、_gpg-preset-passphrase
_はサポートされていないようです。 _gpg-preset-passphrase
_はGnuPGバージョン2.1.xでのみ動作します。
この種の問題に対する1つの解決策は、GPG秘密鍵を管理するgpg-agent
を使用することです。このツールをgpg-preset-passphrase
と組み合わせて使用して、パスフレーズをgpg-agent
キャッシュにシードできます。 gpg-agent here の詳細をご覧ください。これにより、パスフレーズを手動で入力する必要がなくなるため、自動化されたタスクを実行できます。
ところで、私は GPG署名とRPMパッケージとYUMリポジトリの検証 について役立つブログ投稿を書いたので、これも役立つかもしれません。
%__gpg_sign_cmd
ファイルに.rpmmacros
マクロを追加/変更することで、ファイルからパスフレーズを読み取るようにgpgに指示できます。 rpm --showrc
を使用して、現在の%__gpg_sign_cmd
がどのように見えるかを確認し、次に.rpmmacros
ファイルに次のように追加します。
--batch --pinentry-mode loopback --passphrase-file /path/to/passphrase-file
複数行の値がある場合は、最後の行を除く各行を必ず\
で終了してください。
これにより、gpgはパスフレーズを一切要求せず、代わりに定義されたファイルからそれを読み取ります。これはセキュリティリスクをもたらすので、これがあなたがやりたいことかどうかを検討し、それを保護するために必要な手順(所有権と許可など)を実行してください。
%__gpg_sign_cmd
の完全な.rpmmacros
の例:
%__gpg_sign_cmd %{__gpg} \
gpg --no-verbose --no-armor --batch --pinentry-mode loopback \
--passphrase-file /path/to/passphrase-file \
%{?_gpg_digest_algo:--digest-algo %{_gpg_digest_algo}} \
--no-secmem-warning \
-u "%{_gpg_name}" -sbo %{__signature_filename} %{__plaintext_filename}
パッケージに署名する:
$ rpm --checksig somepackage.rpm
somepackage.rpm: sha1 md5 OK
$ rpmsign --addsign somepackage.rpm
somepackage.rpm:
$ rpm --checksig somepackage.rpm
somepackage.rpm: rsa sha1 (md5) pgp md5 OK