pacman (Русский)/Package signing (Русский)

From ArchWiki
Jump to navigation Jump to search

Состояние перевода: На этой странице представлен перевод статьи pacman/Package signing. Дата последней синхронизации: 1 мая 2020. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Для определения подлинности пакетов pacman использует ключи GnuPG и сеть доверия. Действующие мастер-ключи Arch Linux можно найти здесь. Ключи разработчиков и доверенных пользователей, которыми они подписывают свои пакеты, должны быть подписаны минимум тремя мастер-ключами. У каждого пользователя также есть свой уникальный PGP-ключ, сгенерированный при настройке утилиты pacman-key. Сеть доверия связывает ключи пользователей и мастер-ключи.

Примеры сетей доверия:

  • Пользовательские пакеты: обычный пользователь создаёт пакет и подписывает его своим локальным ключом.
  • Неофициальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика; обычный пользователь подписывает ключ разработчика локальным ключом.
  • Официальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика, подписанным мастер-ключами Arch Linux; обычный пользователь подписывает локальным ключом мастер-ключ и доверяет последнему поручиться за разработчика.
Примечание: Протокол HKP использует TCP-порт 11371. Утилите pacman-key нужен этот порт для скачивания подписанных ключей с серверов.

Настройка

Настройка pacman

Опция SigLevel в файле /etc/pacman.conf определяет необходимый для установки пакета уровень доверия. Подробную информацию о SigLevel можно найти в руководстве pacman.conf и в комментариях в самом файле. Можно настроить проверку подписи как глобально, так для каждого репозитория в отдельности. Если задать SigLevel глобально в разделе [options], то абсолютно все пакеты должны быть подписаны. Пакеты, которые вы собрали сами, необходимо подписывать с помощью утилиты makepkg.

Примечание: В настоящее время все официальные пакеты подписаны, но подписывание баз данных на ноябрь 2018 не завершено. Если в параметре SigLevel задано значение Required, необходимо также указать и DatabaseOptional.

Настройка по умолчанию позволяет устанавливать только те пакеты, которые подписаны доверенными ключами:

/etc/pacman.conf
SigLevel = Required DatabaseOptional

Параметр TrustedOnly используется в pacman по умолчанию, то есть настройка ниже аналогична предыдущей:

SigLevel = Required DatabaseOptional TrustedOnly

То же самое можно задать и для отдельного репозитория далее в файле конфигурации:

[core]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist

Здесь явно задаётся проверка подписи для пакетов из этого репозитория, но подпись базы данных не проверяется. Если задать здесь значение Optional, то для этого репозитория глобальное значение Required станет недействительно.

Важно: SigLevel TrustAll даёт системе указание считать все ключи доверенными. Эта значение используется только для целей отладки. Для официальных репозиториев необходимо использовать значение TrustedOnly.

Инициализация связки ключей

Для инициализации связки ключей pacman выполните:

# pacman-key --init

Для инициализации необходима энтропия. Чтобы сгенерировать больше энтропии, активно двигайте мышью, нажимайте случайные клавиши или выполняейте действия, связанные с диском (например, запустите в другой консоли ls -R /, find / -name foo или dd if=/dev/sda8 of=/dev/tty7). Если энтропия системы недостаточна, этот этап может занять часы; активная генерация энтропии ускорит процесс.

Генерируемая последовательность случайных чисел используется для создания связки ключей (/etc/pacman.d/gnupg) и GPG-ключа вашей системы.

Примечание: Если вы запускаете pacman-key --init на компьютере, который не генерирует много энтропии (например, на удалённом сервере), создание ключа может занять очень много времени. Для выработки псевдоэнтропии установите утилиты haveged или rng-tools и запустите соответствующую службу перед командой pacman-key --init.

Управление связкой ключей

Проверка мастер-ключей

Первоначальная настройка ключей выполняется командой:

# pacman-key --populate archlinux

При появлении запроса необходимо проверить подлинность мастер-ключей, поскольку они используются для подписи всех пакетов совместно с ключами разработчиков.

PGP-ключи довольно велики (2048 бит или больше), что делает их неудобными для восприятия людьми. Поэтому на основе ключа вычисляется 40-разрядная шестнадцатеричная хэш-сумма, по которой можно проверить его подлинность. Также нужно помнить, что последние восемь цифр хэш-суммы часто используют как имя или (короткий) ID ключа, а последние шестнадцать — как длинный ID ключа.

Добавление ключей разработчика

Ключи официальных разработчиков и доверенных пользователей подписываются мастер-ключами, так что вам не нужно использовать pacman-key, чтобы подписывать их самостоятельно. Когда pacman встречает в подписи пакета ключ, который не удаётся распознать, то предлагает скачать его с сервера ключей, указанного в параметре keyserver в файле /etc/pacman.d/gnupg/gpg.conf или в опции --keyserver командной строки. Перечень серверов ключей можно найти в Википедии.

Ключ разработчика нужно скачать всего единожды, после этого он будет использоваться для проверки любого пакета от этого разработчика.

Примечание: Пакет archlinux-keyring, являющийся зависимостью для pacman, содержит самые свежие на момент последнего обновления ключи. При необходимости ключи можно также обновить вручную командой pacman-key --refresh-keys с правами root. При выполнении этой команды pacman-key попытается найти на сервере ключей также и ваш локальный ключ, после чего выдаст сообщение, что ключ не найден — это нормально.

Добавление неофициальных ключей

Этим способом можно добавить в связку ключей pacman свой ключ или включить подписанный неофициальный репозиторий.

В первую очередь получите у владельца ключа его ID (keyid). Добавьте полученный ключ в связку:

  1. Если ключ находится на сервере ключей, импортируйте его командой:
    # pacman-key --recv-keys keyid
  2. Если у вас есть ссылка на файл ключа, скачайте его и выполните:
    # pacman-key --add /путь/к/скачанному/файлу/ключа

Всегда старайтесь проверять отпечаток — как мастер-ключей, так любых других ключей, которые вы собираетесь подписать:

# pacman-key --finger keyid

Наконец, подпишите импортированный ключ локально:

# pacman-key --lsign-key keyid

Теперь этот ключ будет считаться доверенным.

Отладка при помощи gpg

При отладке доступ к связке ключей pacman можно получить напрямую с помощью gpg, например:

# gpg -- homedir /etc/pacman.d/gnupg --list-keys

Решение проблем

Важно: Работа pacman-key зависит от настроек системного времени. Если системные часы неверны, при обновлении вы получите следующую ошибку:
error: PackageName: signature from "User <email@archlinux.org>" is invalid
error: failed to commit transaction (invalid or corrupted package (PGP signature))
Errors occured, no packages were upgraded.

Не удаётся импортировать ключи

Возможные причины:

  • Устаревший пакет 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

что удалит все пакеты в кэше, которые не были установлены.

Отключение проверки подписи

Важно: Используйте с осторожностью. Отключение проверки подписи приведёт к тому, что pacman будет без возражений устанавливать любые пакеты, в том числе и недоверенные.

Если подписи пакетов вас не интересуют, можно полностью отключить их проверку. Отредактируйте файл /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 не всегда имеет возможность проверить, был ли ключ скачан и является ли он доверенным, перед тем как продолжить обновление. Также возможно, что срок действия ключа истёк.

Возможные решения:

Обновление ключей через прокси

Чтобы можно было обновлять ключи через прокси-сервер, задайте параметр honor-http-proxy в файлах /etc/gnupg/dirmngr.conf и /etc/pacman.d/gnupg/dirmngr.conf. Подробнее смотрите GnuPG#Use a keyserver.

Примечание: Если pacman-key был запущен без опции honor-http-proxy и все равно завершился с ошибкой, попробуйте перезагрузиться.

Смотрите также