私は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.conf
gpg-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-passphrase
GnuPG バージョン 2.1.x のみ使用できます。
引用する
答え2
%__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
答え3
これらの問題を解決する1つの方法は、gpg-agent
GPGによって管理されるGPGキーを使用することです。キャッシュにgpg-preset-passphrase
パスワードフレーズをシードすることでこのツールを使用できます。gpg-agent
gpg-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無人