Это продолжение статьи про сборку своих собственных пакетов.
Сейчас мы научимся подписывать свои пакеты через gpg и lintian, чтобы их можно было залить в свой собственный (да и в чужой, если нам разрешат хД) репозиторий. Вместе это позволит нам быть уверенным, что в наш личный репозиторий никто не залил всякой фигни.
Нам понадобится пакет gnupg:
Всё происходящее мы будем делать под пользователем (а не под рутом). Я же уже говорил, что через debuild пакеты можно собирать не под рутом)?:
Генерируем gpg-ключи:
...
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=randomfile 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
На этом генерация ключа наконец-то закончится.
Делаем
И надежно прячем сей архив. Если ключ нужно перенести на другую машину для сборки — копируем этот каталог на удаленную машину нужному пользователю.
В итоге логинимся на нужную машину нужным пользователем и проверяем, что все файлы, нужные для подписи, на месте:
gpg.conf pubring.gpg random_seed secring.gpg trustdb.gpg
Топаем в каталог, откуда мы собирали пакет в предыдущей статье:
Меняем changelog:
И сгенерированное
* Non-maintainer upload.
*
-- <inkvizitor68sl@vds113> Sun, 27 Oct 2013 19:34:07 +0400
Меняем на:
* first signed version
-- inkvizitor68sl <root@vlad.pro> Sun, 27 Oct 2013 19:34:07 +0400
В последней строчке нам нужно указать Real Name и почту из нашего GPG ключа. Сохраняем changelog, радуемся.
Теперь мы можем собрать пакет, подписав его:
В конце сборки у нас спросят пароль от GPG ключа. Если ввести его правильно, то мы увидим заветную строчку в конце лога сборки:
А сам changes-file будет выглядеть примерно так:
-----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, чтобы уж точно.
Хорошо бы еще бы почитать, как ставить пакеты только с доверенными подписями. И отбрасывать неподписанные, не ставить их.
> Хорошо бы еще бы почитать, как ставить пакеты только с доверенными подписями.
Мхм. Тут не всё так просто. Понятия «пакет» с доверенной подписью в рамках твоей системы не существует. Существует понятие «репозиторий с доверенной подписью». Про это у меня статья почти готова. В репозиторий (подписанный) может попасть пакет только подписанный «доверенным» по отношению к репозиторию pgp-ключем. А apt уже ругается на попытки поставить пакеты из тех репозиториев, подписи которых не добавлены в систему.
подскажите, а можно ли отдельно задать различную реакцию на apt-get remove и apt-get purge?
Можно, в pre/postrm это отдельные секции.
https://wiki.debian.org/MaintainerScripts