pacman (Русский)/Package signing (Русский)
Для определения подлинности пакетов pacman использует ключи GnuPG и сеть доверия. Действующие мастер-ключи Arch Linux можно найти здесь. Ключи разработчиков и доверенных пользователей, которыми они подписывают свои пакеты, должны быть подписаны минимум тремя мастер-ключами. У каждого пользователя также есть свой уникальный PGP-ключ, сгенерированный при настройке утилиты pacman-key. Сеть доверия связывает ключи пользователей и мастер-ключи.
Примеры сетей доверия:
- Пользовательские пакеты: обычный пользователь создаёт пакет и подписывает его своим локальным ключом.
- Неофициальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика; обычный пользователь подписывает ключ разработчика локальным ключом.
- Официальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика, подписанным мастер-ключами Arch Linux; обычный пользователь подписывает локальным ключом мастер-ключ и доверяет последнему поручиться за разработчика.
Настройка
Настройка pacman
Опция SigLevel в файле /etc/pacman.conf определяет необходимый для установки пакета уровень доверия. Подробную информацию о SigLevel можно найти в руководстве pacman.conf и в комментариях в самом файле. Можно настроить проверку подписи как глобально, так для каждого репозитория в отдельности. Если задать SigLevel глобально в разделе [options], то абсолютно все пакеты должны быть подписаны. Пакеты, которые вы собрали сами, необходимо подписывать с помощью утилиты makepkg.
Настройка по умолчанию позволяет устанавливать только те пакеты, которые подписаны доверенными ключами:
/etc/pacman.conf
SigLevel = Required DatabaseOptional
Параметр TrustedOnly используется в pacman по умолчанию, то есть настройка ниже аналогична предыдущей:
SigLevel = Required DatabaseOptional TrustedOnly
То же самое можно задать и для отдельного репозитория далее в файле конфигурации:
[core] SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist
Здесь явно задаётся проверка подписи для пакетов из этого репозитория, но подпись базы данных не проверяется. Если задать здесь значение Optional, то для этого репозитория глобальное значение Required станет недействительно.
Инициализация связки ключей
Для инициализации связки ключей pacman выполните:
# pacman-key --init
Для инициализации необходима энтропия. Чтобы сгенерировать больше энтропии, активно двигайте мышью, нажимайте случайные клавиши или выполняейте действия, связанные с диском (например, запустите в другой консоли ls -R /, find / -name foo или dd if=/dev/sda8 of=/dev/tty7). Если энтропия системы недостаточна, этот этап может занять часы; активная генерация энтропии ускорит процесс.
Генерируемая последовательность случайных чисел используется для создания связки ключей (/etc/pacman.d/gnupg) и GPG-ключа вашей системы.
Управление связкой ключей
Проверка мастер-ключей
Первоначальная настройка ключей выполняется командой:
# pacman-key --populate archlinux
При появлении запроса необходимо проверить подлинность мастер-ключей, поскольку они используются для подписи всех пакетов совместно с ключами разработчиков.
PGP-ключи довольно велики (2048 бит или больше), что делает их неудобными для восприятия людьми. Поэтому на основе ключа вычисляется 40-разрядная шестнадцатеричная хэш-сумма, по которой можно проверить его подлинность. Также нужно помнить, что последние восемь цифр хэш-суммы часто используют как имя или (короткий) ID ключа, а последние шестнадцать — как длинный ID ключа.
Добавление ключей разработчика
Ключи официальных разработчиков и доверенных пользователей подписываются мастер-ключами, так что вам не нужно использовать pacman-key, чтобы подписывать их самостоятельно. Когда pacman встречает в подписи пакета ключ, который не удаётся распознать, то предлагает скачать его с сервера ключей, указанного в параметре keyserver в файле /etc/pacman.d/gnupg/gpg.conf или в опции --keyserver командной строки. Перечень серверов ключей можно найти в Википедии.
Ключ разработчика нужно скачать всего единожды, после этого он будет использоваться для проверки любого пакета от этого разработчика.
Добавление неофициальных ключей
Этим способом можно добавить в связку ключей pacman свой ключ или включить подписанный неофициальный репозиторий.
В первую очередь получите у владельца ключа его ID (keyid). Добавьте полученный ключ в связку:
- Если ключ находится на сервере ключей, импортируйте его командой:
# pacman-key --recv-keys keyid
- Если у вас есть ссылка на файл ключа, скачайте его и выполните:
# pacman-key --add /путь/к/скачанному/файлу/ключа
Всегда старайтесь проверять отпечаток — как мастер-ключей, так любых других ключей, которые вы собираетесь подписать:
# pacman-key --finger keyid
Наконец, подпишите импортированный ключ локально:
# pacman-key --lsign-key keyid
Теперь этот ключ будет считаться доверенным.
Отладка при помощи gpg
При отладке доступ к связке ключей pacman можно получить напрямую с помощью gpg, например:
# gpg -- homedir /etc/pacman.d/gnupg --list-keys
Решение проблем
Не удаётся импортировать ключи
Возможные причины:
- Устаревший пакет archlinux-keyring;
- Неправильные настройки даты и времени;
- Интернет-провайдер блокирует порт, используемый для импорта PGP-ключей;
- Кэш pacman содержит неподписанные пакеты, оставшиеся с предыдущих попыток;
- Демон
dirmngrне был правильно настроен.
Давно не обновлявшийся пакет archlinux-keyring может привести к проблемам при синхронизации обновлений. В этом случае попробуйте обновить систему.
Если это не помогло, убедитесь, что в системе присутствует файл /root/.gnupg/dirmngr_ldapservers.conf, а команду # dirmngr удаётся выполнить. Если файл отсутствует, создайте пустой файл с таким же названием и снова выполните # dirmngr.
Если это тоже не помогло и ваше системное время в порядке, то можно попробовать переключиться на сервер ключей MIT, который использует другой порт. Отредактируйте файл /etc/pacman.d/gnupg/gpg.conf, изменив значение keyserver:
keyserver hkp://pgp.mit.edu:11371
Если не помогает и это, измените keyserver на kjsl, работающий на порте 80 (HTTP), который обычно открыт:
keyserver hkp://keyserver.kjsl.com:80
Если не удаётся воспользоваться портом 80 (например, компания использует прозрачный "http-only" прокси-сервер вместо маршрутизатора), попробуйте следующее:
keyserver hkps://hkps.pool.sks-keyservers.net:443
Если у вас отключен IPv6, gpg не сможет работать, если найдет какой-то адрес IPv6. В этом случае используйте сервер ключей, работающий только через IPv4:
keyserver hkp://ipv4.pool.sks-keyservers.net:11371
Если вы забыли выполнить pacman-key --populate archlinux, то возможны некоторые ошибки при импортировании ключей.
Если ничего из этого не помогает, возможно, кэш pacman в каталоге /var/cache/pacman/pkg/ содержит неподписанные пакеты. Очистите кеш вручную или выполните:
# pacman -Sc
что удалит все пакеты в кэше, которые не были установлены.
Отключение проверки подписи
Если подписи пакетов вас не интересуют, можно полностью отключить их проверку. Отредактируйте файл /etc/pacman.conf, раскомментировав следующую строку в разделе [options]:
SigLevel = Never
Также необходимо закомментировать все параметры SigLevel в настройках репозиториев, потому что они имеют приоритет над глобальными настройками. В результате подпись пакетов проверяться не будет, как это было в pacman до четвертой версии. В этом случае устанавливать связку ключей при помощи pacman-key не нужно. Позже при необходимости можно будет включить проверку подписи пакетов обратно.
Сброс ключей
Для сброса всех установленных в системе ключей необходимо удалить каталог /etc/pacman.d/gnupg. После этого выполните команды pacman-key --init и pacman-key --populate archlinux, если хотите добавить базовый набор ключей заново.
Удаление пакета из кэша
Если постоянно возникает проблема с одним и тем же пакетом и вы уверены, что дело не в pacman-key, попробуйте удалить плохой пакет из кэша командой rm /var/cache/pacman/pkg/плохой_пакет* и скачайте его заново.
Удаление пакета из кэша может помочь при ошибке error: linux: signature from "<Some.Person@example.com>" is invalid, произошедшей при обновлении. Такое сообщение не обязательно является свидетельством атаки "человек-посередине" — возможно, пакет просто был повреждён при скачивании.
Не удаётся опознать подпись пакета
Иногда при выполнении pacman -Syu вы можете столкнуться со следующей ошибкой:
error: название_пакета: signature from "создатель_пакета" is unknown trust
Такое происходит, когда ключ создателя пакета отсутствует в локальной базе данных pacman-key или не является доверенным. Pacman не всегда имеет возможность проверить, был ли ключ скачан и является ли он доверенным, перед тем как продолжить обновление. Также возможно, что срок действия ключа истёк.
Возможные решения:
- Обновить ключи командой
pacman-key --refresh-keys; - вручную подписать недоверенный ключ локально;
- сбросить ключи.
Обновление ключей через прокси
Чтобы можно было обновлять ключи через прокси-сервер, задайте параметр honor-http-proxy в файлах /etc/gnupg/dirmngr.conf и /etc/pacman.d/gnupg/dirmngr.conf. Подробнее смотрите GnuPG#Use a keyserver.