2016-07-24 14 views
-1

当社の製品をお客様の環境に展開するためにRPMパッケージを使用しています。 RPMを完全に自己完結させるために、特定の顧客の環境に合わせてRPMをカスタマイズしています。この方法では、顧客は、ウィザードに従って構成ファイルを編集することなく、RPMをインストールすればよいだけです。RPM - 署名後にパッケージを変更する

私の問題は次のとおりです。 RPMパッケージをパーソナライズする前に署名します。パーソナライゼーションプロセスでは、RPMファイルに情報を追加します(実際にはRPMヘッダーを追加することなく、生データを追加するだけです)。この変更により(当然)パッケージの署名が破られます。

私が探しているのは、署名を破棄することなくファイルを修正できるトリックです。パッケージの

  1. 「リード」部分を使用することができます予約バイトが含まれていますが、それは非常に大きさでかつスケーラブルではない制限されます。

    は、ここで私はこれまで試したものです。

  2. 拡張ファイル属性を追加すると非常に使いやすいですが、ファイルをコピーすると属性が消えます(属性を保持する特別なフラグがありますが、その使用を強制することはできません)。
  3. ダミーヘッダーをRPMに挿入し、RPMコードをチェックしないように欺くことを考えましたが、それでもやり方はまだ分かりません。
  4. パッケージに署名するパーソナライゼーションが行われた後でも、一度ではなく各顧客のパッケージに署名する必要があるため、スケーラビリティもありません。

署名がファイルの内容を変更しないようにする必要があることはわかっています(期待どおりに動作します)。しかし、RPM データを変更したくない場合は、ファイルに追加情報を入れてください。

アイデア?

ありがとうございます!

+0

誰にでも私の質問を落としてくれました。正当な理由なしにダウンボートするだけでは建設的ではありません。私の質問は、尋ねる前に研究が行われていなかったという印象を与えますか? – kernelony

答えて

2

既存のシグネチャを保持しながら* .rpmを変更する必要がある場合は、タグ番号を10進数〜275〜999の範囲で署名ヘッダーに追加することをお勧めします。既存の署名平文(ヘッダーのみとヘッダー+ペイロード)署名ヘッダー内の追加タグ/データの影響を受けません。

最近のバージョンのRPMでは、ファジー化によって発見されたセグメンテーションを防ぐために、タグと型およびデータを明示的に列挙しなければならないことに注意してください。しかしその場合でも、追加のデータを取り込むことができるパディングタグ(メモリから0x3fffffff)があります。再び - iirc - rpmの最新バージョンは、パディングがすべて0x00であることを確認して、emptorを警告します。

一方、「パーソナライゼーション」は何も記述されておらず、パッケージのインストール時に署名ヘッダーに追加されたタグは破棄されます。 * .rpmのシグネチャヘッダを書き換えるコードは、署名ヘッダに続くメタデータヘッダが8バイトアライメントされていることを保証するために、パディングのためにややこしいことに注意してください。

「パーソナライゼーション」を含む追加ファイルが、より良いエンジニアリングアプローチであることがわかります。ハッキングの技術では、パーソナライゼーションが行われた後、パッケージの署名;-)

+0

私は確かに設定のための別のファイルを使用することを好むだろう...それは方法クリーナーです。今日の製品が他のOSで動作する方法とちょうど矛盾するので、私はこのようにしておくことを強くお勧めします。お返事ありがとうございます、私はそれを調べます(私からの+1) – kernelony

+0

私が尋ねるかもしれない、どのように署名ヘッダーにタグを追加しますか?私はそれのためのツールを見つけませんでした。そのために私は独自のコードを書くべきですか? – kernelony

+0

ツールはありませんが、ヘッダーのロード/アンロードとタグの追加/削除用のRPM APIがあります。それほど複雑ではないコーディングです。 * .rpmパッケージを辞めることなく拡張する必要がほとんどないため、ツールはありません。 –

3

5番目の選択肢は、変更内容を組み込んだパッケージを作成し、署名されたパッケージに依存することです。 パッケージに署名するかどうかは、配布方法によって異なります。

あなたのパッケージは、元のRPM内のファイルを変更した場合、あなたは%pre%preunスクリプトレットがバックアップバージョンに元のファイルの名前を変更することや、あなたの代替品へのシンボリックリンクを追加することによって、この(ファイル名の矛盾使用)を回避することができます。これは元のパッケージの内容を確認することには影響しますが、変更はケースバイケースで確認できるものでなければなりません。

+0

あなたの答えをありがとう。私があなたを正しく理解していれば、追加のRPMパッケージを作成して配布することを意味します。しかし、私は単一のファイルを使用したいと思います。私はパックされたファイルを変更する必要はありません。 – kernelony

+0

この答えはそれを行う方法です。 OSベンダーからの 'httpd' RPMを再パッケージ化しないのは、あなたがセキュリティパッチビジネスに入っているからです。 'httpd'が必要なRPMを' httpd-config-myorg'のように作成し、設定ファイルにドロップします。他のRPMが設定ファイルに正しくフラグを立てていない場合は、上記のように '%pre'、'%post'、 '%triggerin'を使用します。 –

+0

多分、私はここで何か不足していますが、 'httpd-config-myorg'パッケージはどうですか?それにも署名する必要はありませんか?あなたがそうしたら、再び、あなたは各顧客のために署名手順を繰り返さなければならないでしょう。 – kernelony

1

を停止する際に知っている - また それは我々が一度だけ、各 顧客のためのパッケージに署名の代わりにする必要が意味するので、スケーラブルではありません。

なぜこれは縮尺されていないのですか? rpmsignがあなたにパスフレーズを入力してもらいたいからです。 obs-signを見る https://en.opensuse.org/openSUSE:Build_Service_Signer (Suse、FedoraとEpelで利用可能)それは署名を自動化し、それを安全に保つことができます。

+0

いいえ、署名プロセスが完全に自動化されていないためです。さらに、パーソナライゼーションを追加するエンティティ(および顧客のデータを保持するエンティティ)は、現在のところ署名できません(プライベートキーへのアクセス権はありません)。リンクをありがとう、私は見てみましょう(+1) – kernelony

+0

obs-signを使うと、秘密鍵はあなたがアクセスしていない別のマシンに(できます)保存されます。クライアント上でダイジェストを計算するだけで、署名したサーバーに送信し(ホワイトリストに登録されたIPをチェックします)、クライアントがRPMヘッダーに挿入する署名を返送します。公開鍵を取得することはできますが、秘密鍵は署名サーバから離れることはありません。おかげさまで、ありがとうございます。 – msuchy

+0

ダイジェストをRPMにどのように注入しますか?そのためのコマンドが組み込まれていますか? (rpm --addsign?のような) – kernelony

関連する問題