2016-04-20 9 views
1

ローカルのArtifactoryインスタンスでローカルのCentOSミラーを作成する作業をしており、リモートとローカルリポジトリの違いをチェックし、それに応じてローカルのものを更新するPython3スクリプトを作成しました。Python3を使ってrpm GPG署名をチェックするには?

必要に応じて、ローカルのミラーに追加する前に、ダウンロードしたrpmパッケージの有効性をチェックするステップを追加する必要があります。

"rpm -K"(CentOS GPGキーをインポートした後)を呼び出すことでこれを行うことができましたが、おそらく外部パッケージに頼ることなくこれを実装するより良い方法があるのだろうかと思いました。

答えて

1

ここには、*。rpmファイルから「平文」(署名された領域)を抽出する短いシェルスクリプトがあります。これはヘッダー+ペイロードシグネチャー、ヘッダーのみのシグネチャーplaintextは似ていますが、ヘッダーBLOBのみです)。

署名が必要です(rpm-pythonバインディングを使用することができます、以下の注意を参照してください)。パッケージの署名を検証するにはgpgへのPythonバインディングが必要です。

プレーンテキストを検索して署名を取得するために解析が必要な、ダウンロードされた可能性のある改ざんされたパッケージを検証することは、すでに手間のかかるビジネスであることに注意してください。

==============================は/ usr/libに/回転数/ tgpg

#!/bin/sh 

for pkg in $* 
do 
     if [ "$pkg" = "" -o ! -e "$pkg" ]; then 
      echo "no package supplied" 1>&2 
      exit 1 
     fi 

     plaintext=$(mktemp /tmp/tgpg-$$.XXXXXX) 
     detached=$(mktemp /tmp/tgpg-$$.XXXXXX) 

    # --- Extract detached signature 

     rpm -qp -vv --qf '%{siggpg:armor}' $pkg > $detached 

    # --- Figger the offset of header+payload in the package 

     leadsize=96 
     o=$(expr $leadsize + 8) 

     set $(od -j $o -N 8 -t u1 $pkg) 
     il=$(expr 256 \* \(256 \* \(256 \* $2 + $3 \) + $4 \) + $5) 
     dl=$(expr 256 \* \(256 \* \(256 \* $6 + $7 \) + $8 \) + $9) 

     sigsize=$(expr 8 + 16 \* $il + $dl) 
     o=$(expr $o + $sigsize + \(8 - \($sigsize \% 8 \) \) \% 8) 

    # --- Extract header+payload 

     dd if=$pkg ibs=$o skip=1 2>/dev/null > $plaintext 

    # --- Verify DSA signature using gpg 

     gpg --batch -vv --debug 0xfc02 --verify $detached $plaintext 

    # --- Clean up 

     rm -f $detached $plaintext 
    done 
+0

ありがとうこの答えのために。 rpmコマンドの--qfは--queryformatと同等です。潜在的に改ざんされたパッケージを扱うときには、分離された署名をrpmを使って抽出するときに厄介な部分があると私は推測します。署名を抽出する際にセキュリティ上のリスクを最小限に抑えるためには何ができますか?私はchrootがそれほど助けにならないと思いますか? – rasebo

+0

あり-qfは--queryformatのシングルダッシュエイリアスです。より困難な問題は、--queryformatがロードされたヘッダで機能し、--queryformatが値を取得できるようにヘッダをロードできると仮定していることです。実際には、あなたはうまくいくでしょう:一方で、ヘッダーをロードする前に悪用の可能性があります。 chrootは損傷を最小限に抑えますが、それは正しいエンジニアリングの解決策ではありません。署名検証を実行するには、1)平文2)署名、3)外部手段を介して供給できるpubkeyの3つの項目が必要です。 –

関連する問題