Debian.pro

Блог для пользователей и администраторов Debian


Подписываем свои собственные deb-пакеты.

Это продолжение статьи про сборку своих собственных пакетов.

Сейчас мы научимся подписывать свои пакеты через gpg и lintian, чтобы их можно было залить в свой собственный (да и в чужой, если нам разрешат хД) репозиторий. Вместе это позволит нам быть уверенным, что в наш личный репозиторий никто не залил всякой фигни.

Нам понадобится пакет gnupg:

root@server:~# apt-get install gnupg

Всё происходящее мы будем делать под пользователем (а не под рутом). Я же уже говорил, что через debuild пакеты можно собирать не под рутом)?:

root@server:~# su user

Генерируем gpg-ключи:

root@server:~# LANG=C gpg --gen-key
...
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
# Нам нужен "DSA and Elgamal"
Your selection? 2
...
DSA keys may be between 1024 and 3072 bits long.
# нам сойдет и 2048, просто жмем enter
What keysize do you want? (2048)
...
Please specify how long the key should be valid.
    0 = key does not expire
...
# здесь нас просят выбрать время, в течении которого наш ключ будет валиден.
# если хотите вечно - пишите 0
# если напишете, например, 700 - то через 700 дней нужно будет пересобирать все пакеты (иначе apt будет ругаться на неподписанный пакет). С другой стороны - чем меньше время, тем безопаснее (если ключ у вас сопрут, то им смогут подписывать пакеты в течении ограниченного срока).
# я использую 0

Key is valid for? (0) 0
Key does not expire at all
# дада, мы точно уверены...
Is this correct? (y/N) y
...
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) "
# У нас тут спрашивают имя и фамилию. Хотя, я буду в своём стиле:
Real name: inkvizitor68sl
# Ещё спросят почту:
Email address: root@vlad.pro
# и комментарий к ключам (мне он не нужен, жму просто enter)
Comment:
# и ещё раз всё переспросят:
You selected this USER-ID:
    "inkvizitor68sl "

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
# И спросят пароль:
Enter passphrase: yourverysecretpassword
# А потом ещё и переспросят:
Retype passphrace: yourverysecretpassword
...
# Ещё может случиться такое:
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: WARNING: some OpenPGP programs can't handle a DSA key with this digest size
..+++++.+++++++++++++++.++++++++++..+++++...++++++++++++++++++++++++++++++.++++++++++++++++++++.+++++...+++++..+++++.++++++++++..++++++++++...+++++++++++++++>.+++++.......................................+++++

Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 282 more bytes)
# это на самом деле печально. Ваш компутер нифига не делает!
# Запускаем в соседней консоли:
# cat /dev/urandom > randomfile
# ждем пару минут, чтобы на диск записалась пара гигабайт.
# потом жмем ctrl-C
# и запускаем такое:
# dd if=random of=/dev/null iflag=direct
# и смотрим в файл /proc/sys/kernel/random/entropy_avail
# В какой-то момент энтропия скаканет до восьми сотен и GPG таки сможет сгенерировать свой ключ.
# учтите, что такой способ подходит только в "научных" целях.
# настоящий GPG ключ стоит генерировать на высоконагруженном сервере или вашем десктопе, где энтропия генерируется не нашими наглыми ручками, а действительно случайными действиями системы.
# например, на моём ноутбуке с открытым браузером и играющей музыкой из флеш-плеера она скачет в промежутке 200-400 без всяких дополнительных действий.

...
gpg: ~/.gnupg/trustdb.gpg: trustdb created
gpg: key XXXXXXXX marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
pub XXXXX/XXXXXXXX 2013-10-27
    Key fingerprint = XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
uid inkvizitor68sl <root@vlad.pro>
sub removed

На этом генерация ключа наконец-то закончится.

Делаем

user@server:~$ tar -czvf gnupg.tar.gz ~/.gnupg

И надежно прячем сей архив. Если ключ нужно перенести на другую машину для сборки — копируем этот каталог на удаленную машину нужному пользователю.

В итоге логинимся на нужную машину нужным пользователем и проверяем, что все файлы, нужные для подписи, на месте:

user@server:~$ ls ~/.gnupg/
gpg.conf pubring.gpg random_seed secring.gpg trustdb.gpg

Топаем в каталог, откуда мы собирали пакет в предыдущей статье:

user@server:~$ cd example-package

Меняем changelog:

user@server:~$ dch --vendor=debian --distribution=unstable -i

И сгенерированное

example-package (0.2+nmu1) unstable; urgency=low
  
  * Non-maintainer upload.
  *
  
 -- <inkvizitor68sl@vds113> Sun, 27 Oct 2013 19:34:07 +0400

Меняем на:

example-package (0.3) unstable; urgency=low
  
  * first signed version
  
 -- inkvizitor68sl <root@vlad.pro> Sun, 27 Oct 2013 19:34:07 +0400

В последней строчке нам нужно указать Real Name и почту из нашего GPG ключа. Сохраняем changelog, радуемся.

Теперь мы можем собрать пакет, подписав его:

user@server:~$ debuild -b

В конце сборки у нас спросят пароль от GPG ключа. Если ввести его правильно, то мы увидим заветную строчку в конце лога сборки:

Successfully signed changes file

А сам changes-file будет выглядеть примерно так:

user@server:~$ cat ../example-package_0.3_amd64.changes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

...
Maintainer: Zhivotnev Vladislav
Changed-By: inkvizitor68sl <root@vlad.pro>
...
.
* first signed version
Checksums-Sha1:
0ccf0596a20491c90b32a5e000bdbc635a0766d7 2986 example-package_0.3_amd64.deb
Checksums-Sha256:
236ab3e259e0f1ad5e2bcacd74ab1f7f352c9366b773c9febc4c43dd829070b7 2986 example-package_0.3_amd64.deb
Files:
41dd70d128602c5e61a0a9778d146df6 2986 misc extra example-package_0.3_amd64.deb

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)

...
-----END PGP SIGNATURE-----

Всё, теперь мы умеем подписывать наши пакеты.

Следующим будет создание своего репозитория, чтобы наши машинки могли ставить пакеты через apt-get, чтобы уж точно.


Комментарии (3):

  1. Хорошо бы еще бы почитать, как ставить пакеты только с доверенными подписями. И отбрасывать неподписанные, не ставить их.

  2. > Хорошо бы еще бы почитать, как ставить пакеты только с доверенными подписями.
    Мхм. Тут не всё так просто. Понятия «пакет» с доверенной подписью в рамках твоей системы не существует. Существует понятие «репозиторий с доверенной подписью». Про это у меня статья почти готова. В репозиторий (подписанный) может попасть пакет только подписанный «доверенным» по отношению к репозиторию pgp-ключем. А apt уже ругается на попытки поставить пакеты из тех репозиториев, подписи которых не добавлены в систему.

  3. mousemaster :

    подскажите, а можно ли отдельно задать различную реакцию на apt-get remove и apt-get purge?

Написать комментарий