CLIパスワードプロンプトを含むrpmsign

CLIパスワードプロンプトを含むrpmsign

私はFedora 25(F25)ワークステーション(KDEスピン)で作業しています。自動化されたテストを実行するためにいくつかのスクリプトを書いています。

自動化されたテストの1つにはRPMSIGN(8)プログラム呼び出しが含まれていました。これはGPG(1)を呼び出して、私が作成しているいくつかのRPMファイルにデジタル署名を追加しました。もちろん、GPGはpinentry(PIN入力)を使用して、ユーザーにRPM署名キー(RSAキーペア)のパスワードを求めるメッセージを表示します。私は人間をループから外し、RPM署名キーのパスワード提供を完全に自動化したいと思います。 (はい、セキュリティへの影響を知っています。これは本番ホストではなく自動化されたテスト環境にすぎず、セキュリティについてはあまり心配しません。本番ビルドでは、ユーザーは手動でRPM署名キーのパスワードを入力します。)

以前は、EXPECT(1)スクリプトを使用して、GPGが "Enter passphrase:"というテキストをコンソールに出力するのを待ち、続行する前に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モジュールを永久に変更したり無効にしたくありません。ただpinentryの干渉なしにGPGのCLIプロンプト「Enter Password:」(または現在のプロンプト文字列)を返すために一時的に無効にしたいと思います。

Pinentry干渉なしにCLIを介してRPM署名キーのパスワード入力を完全に自動化するための提案はありますか?

答え1

このgpg-preset-passphraseユーティリティを教えてくれた@Joe Damatoに感謝します。以下のソリューションは、インストールされているFedora 25ホストで開発およびテストされていますgnupg2-2.1.x

(参考までに、以前のバージョンのGnuPGを実行しているプラ​​ットフォームではそのオプションをサポートしていないため、RPM署名キーのキーグリップ値を決定する方法をまだ理解していません。誰--with-keygripもがこのソリューションについてコメントしたい場合はそうします。 )

~/.gnupg/gpg-agent.confこの行を含める必要があります。

allow-preset-passphrase

修正後、~/.gnupg/gpg-agent.confgpg-agentを再ロードしてください。

$ gpg-connect-agent reloadagent /bye
OK

RPM署名キーの8つの16進キーIDを取得するには、GPGキーをリストします。この例では、キーIDはです0123ABCD

$ gpg --list-keys
/home/me/.gnupg/pubring.gpg
-----------------------------------
pub   1024R/0123ABCD 2015-06-13
uid                  Test (rpm-sign)

RPM署名キーを取得するためのキーグリップコード。 (テストに使用した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の問題2331 Webページ:

gpg1はキーグリップについて知りません。 gpg1 は、キーグリップの代わりに指紋を gpg-agent のキャッシュ ID として使用します。 gpg1 で使用されるプロキシコマンド GET_PASSPHRAE は、gpg-preset-passphrases で使用されるものとは異なるキャッシュモードを使用します。そのため、キーハンドルを(サブ)キーの指紋に交換しても機能しません。

とにかく、RHEL7ホストでGnuPGバージョン2.0.xを使用していくつかのテストを実行しましたが、gpg-preset-passphraseサポートされていないようです。gpg-preset-passphraseGnuPG バージョン 2.1.x のみ使用できます。

引用する

GnuPGアーチウィキ

答え2

%__gpg_sign_cmdファイルにマクロを追加/変更することで、.rpmmacrosgpgにファイルからパスワードを読むように指示できます。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

答え3

これらの問題を解決する1つの方法は、gpg-agentGPGによって管理されるGPGキーを使用することです。キャッシュにgpg-preset-passphraseパスワードフレーズをシードすることでこのツールを使用できます。gpg-agentgpg-agentについて詳しく読んでください。ここ。これにより、自動化されたタスクを実行するために手動でパスワードを入力する必要がなくなります。

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

答え4

GPG 2.0がインストールされているCentOS7(RedHat7のようです)の場合はpinentry-mode機能しませんgpg-preset-passphrase

私はそれを使用して動作させました。予想される

#!/usr/bin/expect -f

### rpm-sign.exp -- Sign RPMs by sending the passphrase.
 
spawn rpm --addsign {*}$argv
expect -exact "Enter pass phrase: "
send -- "Secret passphrase\r"
expect eof

## end of rpm-sign.exp

使用法

$ ./rpm-sign.exp PACKAGE-FILE

Aaron S. Hawley 提供GPG署名RPM無人

関連情報