web-dev-qa-db-ja.com

CLIパスワードプロンプト付きのrpmsign

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署名鍵のパスフレーズの入力を完全に自動化するための提案はありませんか?

6
Jim Fischer

__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
_

::補遺1(2016-12-17)::

これによると 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でのみ動作します。

参考文献

GnuPG ArchWiki

7
Jim Fischer

この種の問題に対する1つの解決策は、GPG秘密鍵を管理するgpg-agentを使用することです。このツールをgpg-preset-passphraseと組み合わせて使用​​して、パスフレーズをgpg-agentキャッシュにシードできます。 gpg-agent here の詳細をご覧ください。これにより、パスフレーズを手動で入力する必要がなくなるため、自動化されたタスクを実行できます。

ところで、私は GPG署名とRPMパッケージとYUMリポジトリの検証 について役立つブログ投稿を書いたので、これも役立つかもしれません。

4
Joe Damato

%__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
4