Когда менеджер пакетов устанавливает программу из системного репозитория, он должен быть уверен в двух вещах: пакет действительно пришёл с того сервера, которому вы доверяете, и по пути его никто не изменил. За это отвечает проверка криптографической подписи. Если она настроена правильно, подмена пакета или зеркала атакующим будет обнаружена ещё до установки. В этой статье разберём, как устроен механизм подписей в основных семействах дистрибутивов Linux, как добавить ключ стороннего репозитория без ошибок и что делать, когда проверка вдруг падает.
- Зачем подписывать пакеты и что именно защищает подпись
- Как устроена проверка в разных семействах дистрибутивов
- Цепочка доверия в apt
- Цепочка доверия в dnf и rpm
- Подключение стороннего репозитория: правильный порядок действий
- Частые ошибки проверки и как их устранять
- Проверка вручную: как убедиться в подлинности конкретного пакета
- Ограничения механизма и что он не заменяет
- Практические рекомендации
Зачем подписывать пакеты и что именно защищает подпись
Репозиторий — это обычный набор файлов на HTTP-сервере или зеркале. Сам протокол доставки не гарантирует ни подлинности, ни целостности: зеркало может быть скомпрометировано, трафик — перехвачен, а DNS — подменён. Подпись решает обе проблемы: разработчик дистрибутива подписывает метаданные репозитория и сами пакеты своим закрытым ключом, а ваша система проверяет их соответствующим открытым ключом, который хранится локально в доверенном хранилище.
Важно понимать границы защиты. Подпись подтверждает, что пакет создан владельцем ключа и не изменён после подписания. Она не означает, что пакет безопасен: если сам разработчик выпустил версию с уязвимостью, подпись честно подтвердит её подлинность. Также подпись не защищает от ситуации, когда злоумышленник убедил вас установить чужой ключ — поэтому источник ключа так же важен, как и сама проверка.
Как устроена проверка в разных семействах дистрибутивов
Механизм везде опирается на OpenPGP (GPG), но реализация отличается. Ниже — устойчивая картина по основным экосистемам; детали команд могут меняться между версиями, поэтому при расхождениях сверяйтесь с документацией вашего дистрибутива.
| Семейство | Менеджер пакетов | Где хранятся ключи | Что подписывается |
|---|---|---|---|
| Debian, Ubuntu и производные | apt / dpkg | Связка ключей apt (файлы в формате armored в каталоге trusted.gpg.d или отдельные файлы keyrings) | Файлы Release с метаданными репозитория; подпись покрывает контрольные суммы всех пакетов |
| RHEL, Fedora, CentOS, Rocky, Alma | dnf / yum / rpm | База ключей RPM (импортированные открытые ключи) | Каждый RPM-пакет подписан отдельно; дополнительно может подписываться metadata репозитория |
| openSUSE, SLES | zypper / rpm | База ключей RPM плюс собственное хранилище zypper | RPM-пакеты и метаданные репозиториев |
| Arch Linux | pacman | Отдельная связка pacman-key (web of trust с мастер-ключами дистрибутива) | Базы данных репозиториев и пакеты |
Принципиальная разница между подходами Debian и RPM-семейства: в первом случае достаточно подделать один подписанный файл Release, чтобы вся цепочка метаданных считалась доверенной, но сам этот файл защищён подписью. Во втором случае каждый пакет несёт собственную подпись, и dnf или rpm проверяют её при установке независимо от источника.
Цепочка доверия в apt
Когда вы запускаете обновление, apt загружает из каждого подключённого репозитория файлы InRelease или Release вместе с подписью. Система ищет среди доверенных ключей тот, которым сделана подпись, затем сверяет контрольные суммы скачанных индексов и только потом — самих пакетов. Если ключ неизвестен, истёк или подпись не сходится, обновление блокируется целиком для этого репозитория, а не для отдельных пакетов.
Цепочка доверия в dnf и rpm
Здесь проверка происходит на уровне пакета. При установке rpm сравнивает подпись внутри файла с ключами в своей базе. Если ключ отсутствует, по умолчанию установка прерывается с запросом на импорт ключа — и вот здесь нужна внимательность: принимать стоит только те отпечатки, которые вы сверили с официальным сайтом проекта или документацией дистрибутива.
Подключение стороннего репозитория: правильный порядок действий
Большинство проблем с подписями возникает не в штатных репозиториях дистрибутива, а при добавлении сторонних источников — Docker, NodeSource, различных PPA и vendor-репозиториев. Безопасная последовательность выглядит так:
- Найдите официальную страницу проекта с инструкцией по подключению репозитория. Избегайте копирования команд со случайных блогов и форумов: там нередко предлагают скачать ключ по небезопасной ссылке или вообще отключить проверку.
- Скачайте открытый ключ способом, который предлагает сам проект, и сверьте его отпечаток (fingerprint) с опубликованным на официальном сайте. Отпечаток — короткая строка вида нескольких групп шестнадцатеричных символов; совпадение всех символов подтверждает, что перед вами нужный ключ.
- Сохраните ключ в отдельный файл связки ключей (keyring), а не в общее хранилище. Современный apt рекомендует класть такие файлы в каталог с именем вида имя-проекта.asc рядом с описанием источника, чтобы ключ одного репозитория не мог «легализовать» другой.
- Добавьте описание репозитория, указав путь к этому файлу ключа явно.
- Обновите индексы и убедитесь, что предупреждений о подписях нет. Первое обновление — контрольная точка: если система ругается, разбирайтесь до установки чего-либо.
Типичная ошибка старых инструкций — загрузка ключа через незащищённый канал или через серверы ключей без сверки отпечатка. Атакующий, который контролирует сеть в момент загрузки, может подсунуть свой ключ, и дальше вся проверка будет проходить «успешно» уже против поддельного источника. Поэтому правило простое: отпечаток ключа сверяется всегда, независимо от того, насколько известен проект.
Частые ошибки проверки и как их устранять
Сообщение об ошибке подписи выглядит пугающе, но почти всегда имеет бытовую причину. Прежде чем предпринимать что-то, прочитайте текст ошибки полностью: обычно там указан идентификатор ключа и характер проблемы.
- NO_PUBKEY / ключ не найден. Репозиторий подключён, но его ключ не импортирован или сохранён не туда. Решение — импортировать ключ заново по официальной инструкции, а не гуглить первую попавшуюся команду с ID ключа из ошибки: злоумышленники иногда специально провоцируют такую ошибку, чтобы администратор сам импортировал подменённый ключ.
- Истёк срок действия ключа. Ключи проектов имеют срок жизни и продлеваются. Обновите ключ из официального источника; если проект забросил ротацию — это повод задуматься о доверии к репозиторию.
- Подпись не сходится (BADSIG). Часто виноват повреждённый кэш или промежуточный прокси, отдавший битые файлы. Очистите кэш списков пакетов и повторите загрузку. Если ошибка повторяется на разных машинах и сетях — возможна проблема на стороне зеркала, попробуйте другое зеркало.
- Предупреждение об устаревшем формате ключей. Старые инструкции предлагали добавлять ключи в общее доверенное хранилище apt; современные версии считают такой подход небезопасным и предупреждают. Перенесите ключ в отдельный keyring, привязанный к конкретному source-файлу.
- Ошибка даты на вашей системе. Криптография чувствительна ко времени: если системные часы сильно сбиты, валидная подпись может считаться просроченной. Проверьте синхронизацию времени — это банальная, но реальная причина ложных сбоев.
Чего делать точно не стоит: отключать проверку подписей глобально, добавлять флаги доверия «на всё» или удалять ключи, вызывающие ошибки, чтобы сообщения исчезли. Каждое из этих действий превращает механизм защиты в формальность: система продолжит работать, но перестанет замечать подмену.
Проверка вручную: как убедиться в подлинности конкретного пакета
Иногда нужно проверить отдельный файл вне менеджера пакетов — например, RPM, скачанный напрямую с сайта производителя. Для этого:
- Импортируйте открытый ключ производителя в свою связку GPG или базу RPM, сверив отпечаток.
- Для RPM используйте команду проверки подписи пакета (rpm -K или —checksig): вывод покажет, какие подписи и дайджесты присутствуют и прошли ли они проверку.
- Для deb-пакетов прямая проверка сложнее, поскольку подпись обычно стоит на метаданных репозитория, а не на самом файле; надёжнее ставить такие пакеты через настроенный репозиторий, а не скачивать вручную.
- Сверьте контрольную сумму файла с опубликованной производителем, если она есть — это дополнительный, хотя и менее строгий уровень проверки.
Если производитель публикует подпись отдельно (файл .asc или .sig рядом с архивом), проверьте её стандартными средствами GPG против импортированного ключа. Успешный результат выглядит как пометка о хорошей подписи от ожидаемого ключа; предупреждение о том, что ключ не сертифицирован доверенной подписью, нормально для прямой проверки и само по себе не признак подделки.
Ограничения механизма и что он не заменяет
Даже идеально настроенная проверка подписей — лишь один слой защиты. Полезно трезво понимать его пределы:
- Подпись подтверждает происхождение, но не отсутствие уязвимостей. Патчи безопасности всё равно нужны вовремя.
- Компрометация ключа разработчика компрометирует всю схему до момента отзыва ключа; дистрибутивы имеют процедуры ротации, и важно применять обновления ключей, которые они рассылают.
- Сторонние репозитории расширяют круг доверия: каждый добавленный источник — это ещё одна организация, чьи ключи ваша система считает достаточными для установки кода с правами root. Минимизируйте их количество и убирайте неиспользуемые.
- На серверах без регулярного аудита устаревшие ключи и забытые репозитории живут годами. Периодическая ревизия списка источников и связок ключей — недорогая профилактика.
Практические рекомендации
Главный принцип: доверие должно явно привязываться к проверенному ключу, а не возникать «по умолчанию». На практике это означает несколько привычек:
- Никогда не обходить проверку подписи ради «быстро поставить пакет» — найдите причину сбоя.
- Каждому стороннему репозиторию — свой файл ключа и явная привязка в описании источника.
- Отпечаток ключа сверять с официальным сайтом проекта, а не с текстом ошибки или случайной инструкцией.
- Следить за сообщениями о ротации ключей дистрибутива и своевременно обновлять связки.
- Раз в несколько месяцев пересматривать список подключённых репозиториев: то, чем вы не пользуетесь, лучше отключить.
Конкретный следующий шаг, если вы настраиваете новый сервер: прежде чем ставить что-либо сверх базовой системы, приведите список источников к минимально необходимому, проверьте, что штатное обновление проходит без предупреждений о подписях, и зафиксируйте отпечатки ключей сторонних репозиториев в своей документации. Это займёт минуты, а при инциденте сэкономит часы диагностики.
Материал носит информационный характер и описывает общий порядок работы с подписями пакетов. Конкретные команды, пути к файлам ключей и поведение менеджеров пакетов зависят от версии дистрибутива; при работе на критичных системах сверяйтесь с официальной документацией вашего дистрибутива и привлекайте профильного специалиста.
