2016-04-20 3 views
1

Я работаю над созданием локального зеркала CentOS на локальном экземпляре Artifactory, и я построил скрипт Python3, чтобы проверить различия между удаленным и локальным репозиториями и соответствующим образом обновить локальные.Как проверить rpm подпись GPG с помощью Python3?

В качестве требования, я должен добавить шаг, который проверяет правильность загруженных пакетов rpm, прежде чем добавлять их в локальное зеркало.

Хотя я мог это сделать, позвонив «rpm -K» (после импорта ключей CentOS GPG), мне было интересно, будет ли лучший способ реализовать это, возможно, не полагаясь на внешние пакеты.

ответ

1

Вот короткий сценарий оболочки, который извлекает «открытый текст» (т. Е. Область, подписанную) из файла * .rpm. Это для заголовка + сигнатура полезной нагрузки, только открытый заголовок сигнатуры, похожий только на заголовок).

Вам понадобится подпись (вы можете использовать привязки rpm-python, см. Примечание ниже), и вам понадобятся привязки python к gpg, чтобы проверить подпись пакета.

Обратите внимание, что проверка загруженного и, возможно, несанкционированного доступа, требующая разбора для поиска открытого текста и получения подписи, уже является сложной задачей: вы можете быть использованы, прежде чем сможете проверить подпись.

==============================/USR/Библиотека/об/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

Спасибо для этого ответа. -qf в команде rpm является эквивалентом --queryformat, правильно? Я предполагаю, что сложная часть при работе с потенциально взломанным пакетом - это извлечение выделенной сигнатуры с использованием rpm. Что можно сделать для минимизации рисков безопасности при извлечении подписи? Я полагаю, что chroot не поможет? – rasebo

+0

Да -qf - псевдоним для -queryformat. Более сложная проблема заключается в том, что функции --queryformat с загруженным заголовком и предполагается, что заголовок может быть загружен, так что -queryformat может извлекать значения. На практике вы, вероятно, прекрасны: между тем есть потенциал для эксплойтов, прежде чем заголовок может быть загружен. Chroot минимизирует ущерб, но это не правильное инженерное решение. Чтобы выполнить проверку подписи, вам нужно 3 элемента: 1) открытый текст 2) подпись и 3) паблик, который может поставляться через внешние средства. –

Смежные вопросы