Знаете, что объединяет опытного системного администратора и новичка в Linux? Оба рано или поздно столкнутся с этим коварным сообщением: "GPG error: The following signatures were invalid: NO_PUBKEY". Но если новичок паникует, то администратор знает - перед ним не катастрофа, а всего лишь потерянное доверие системы к репозиторию.
Анатомия проблемы: почему система вдруг "забыла" репозиторий
Современные Linux-дистрибутивы работают по принципу "доверяй, но проверяй". Каждый пакет в репозитории подписывается криптографическим ключом разработчика. APT проверяет эти подписи перед установкой, защищая систему от подделок и вредоносного кода. Когда появляется NO_PUBKEY, это означает простую вещь: нужного ключа для проверки подписи в системе нет.
Причина устаревания apt-key заключается в том, что добавление ключа в связку ключей применяет ключ ко всем репозиториям. Представьте ситуацию: вы добавили ключ для небольшого стороннего репозитория, а через месяц его скомпрометировали. Злоумышленник может использовать этот ключ для подписи пакетов в любом репозитории, включая официальные.
Чаще всего проблема возникает в трех случаях. Первый - добавление новых репозиториев без импорта ключей. Второй - истечение срока действия ключей. Каждые 2-3 года команда Kali либо продлевает срок действия GPG-ключа, используемого для подписи APT-репозитория, либо заменяет его новым ключом. Третий случай - системные обновления, когда старые методы управления ключами перестают работать.
Реальная история: кризис ключей Kali Linux 2025
Весна 2025 года стала настоящим испытанием для пользователей Kali Linux. К началу мая 2025 года архив Kali подписывал пакеты новым ключом, и пользователи, следовавшие инструкциям, могли обновляться нормально. Но те, кто не обновил ключи вовремя, остались без возможности получать обновления.
Плохие новости для пользователей Kali Linux! В ближайшие дни apt update будет завершаться неудачей практически для всех: отсутствует ключ 827C8569F2518CC677FECA1AED65462EC8D5E4C5. Эта ситуация показала, насколько критично правильное управление ключами в современных дистрибутивах.
Решение оказалось относительно простым:
sudo wget https://archive.kali.org/archive-keyring.gpg -O /usr/share/keyrings/kali-archive-keyring.gpg
Но история с Kali показала важный момент: даже крупные проекты могут столкнуться с проблемами управления ключами, а пользователи должны быть готовы к таким ситуациям.
Почему apt-key стал историей
apt-key устарел и был удален в Debian 13 "Trixie". Долгие годы команда apt-key add
решала проблему одной строкой, но содержала серьезную уязвимость. Ключ получал глобальное доверие для всех репозиториев системы.
После принятия решения об обновлении до 24.04.1 LTS эта проблема продолжает появляться. sudo apt-key add openvpn-repo-pkg-key.pub Предупреждение: apt-key устарел. Система выдает предупреждения, подталкивая администраторов к более безопасным методам.
Современный подход основан на принципе изолированного доверия. Каждый репозиторий получает собственный ключ через параметр signed-by
в описании источника пакетов. Это радикально повышает безопасность, минимизируя риски компрометации.
Современная методология: пошаговое руководство
Когда в терминале появляется злополучное сообщение с идентификатором ключа, например 1234ABCD5678EFGH
, начинается процесс восстановления доверия. Алгоритм действий зависит от источника ключа.
Метод первый: прямая загрузка с сервера
Когда разработчик предоставляет прямую HTTPS-ссылку на ключ, используем максимально безопасный способ:
sudo mkdir -p /usr/share/keyrings
curl -fsSL https://repo.example.com/key.asc | gpg --dearmor | sudo tee /usr/share/keyrings/example-keyring.gpg > /dev/null
sudo chmod 644 /usr/share/keyrings/example-keyring.gpg
Команда gpg --dearmor
преобразует ASCII-формат ключа в бинарный, который понимает APT. Это критически важный шаг, поскольку большинство разработчиков публикуют ключи в текстовом формате.
Метод второй: получение с keyserver
Когда прямой ссылки нет, обращаемся к серверам ключей:
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/example-keyring.gpg --keyserver keyserver.ubuntu.com --recv-keys 1234ABCD5678EFGH
Параметр --no-default-keyring
предотвращает добавление ключа в личную связку пользователя. Если основной сервер недоступен, пробуйте альтернативные: hkp://keyserver.ubuntu.com:80
или keys.openpgp.org
.
Настройка репозитория с изолированным доверием
После получения ключа настраиваем источник пакетов:
echo "deb [signed-by=/usr/share/keyrings/example-keyring.gpg] https://repo.example.com/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/example.list
sudo apt update
Параметр signed-by
- сердце новой системы безопасности. Он связывает репозиторий с конкретным ключом, предотвращая злоупотребления доверием.
Практические кейсы из реальной жизни
Docker: классический пример современного подхода
Официальный репозиторий Docker демонстрирует правильную реализацию новых стандартов:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/docker-archive-keyring.gpg > /dev/null
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
MongoDB: работа с архитектурно-специфичными ключами
Репозиторий MongoDB требует указания архитектуры и версии:
curl -fsSL https://pgp.mongodb.com/server-7.0.asc | gpg --dearmor | sudo tee /usr/share/keyrings/mongodb-server-7.0.gpg > /dev/null
echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
Elasticsearch: обработка составных ключей
Некоторые проекты используют множественные ключи для разных компонентов:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor | sudo tee /usr/share/keyrings/elasticsearch-keyring.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
Диагностика и устранение сложных случаев
Проблемы с сетевым доступом
Корпоративные сети часто блокируют стандартные порты keyserver. Решение - использование HTTP-портов:
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/example.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys KEYID
Если и это не работает, запросите у системного администратора доступ к keys.openpgp.org
через HTTPS.
Истекшие и отозванные ключи
GPG-ключ используется для подписи репозитория для обеспечения подлинности, целостности и доверия при обновлении пакетов. Когда ключ истекает, система блокирует обновления. Проверить статус ключа можно командой:
gpg --no-default-keyring --keyring /usr/share/keyrings/example.gpg --list-keys --with-subkey-fingerprints
Конфликты прав доступа
Ключи должны быть читаемыми для всех пользователей:
sudo chown root:root /usr/share/keyrings/*.gpg
sudo chmod 644 /usr/share/keyrings/*.gpg
Проблемы с архитектурой
На системах ARM или других архитектурах добавляйте соответствующие параметры:
echo "deb [arch=arm64 signed-by=/usr/share/keyrings/example.gpg] https://repo.example.com/ubuntu $(lsb_release -cs) main"
Миграция со старых систем
Я часами искал решение, но все решения предлагают использовать apt-key. Однако это больше не работает, поскольку он устарел. Пользователи, обновляющие системы с Ubuntu 18.04 или более ранних версий, сталкиваются с множественными предупреждениями.
Инвентаризация существующих ключей
Первый шаг - определить, какие ключи установлены глобально:
sudo apt-key list
Экспорт ключей в новый формат
Для каждого ключа выполняем экспорт:
sudo apt-key export KEYID | gpg --dearmor | sudo tee /usr/share/keyrings/migrated-KEYID.gpg > /dev/null
Обновление sources.list файлов
Находим все упоминания репозиториев и добавляем параметр signed-by
:
sudo find /etc/apt/sources.list.d/ -name "*.list" -exec grep -l "repo.example.com" {} \;
Очистка старых ключей
После успешной миграции удаляем устаревшие ключи:
sudo apt-key del KEYID
Автоматизация и скрипты для массового управления
Для системных администраторов, управляющих множеством серверов, ручная миграция непрактична. Создайте универсальный скрипт:
#!/bin/bash
REPO_NAME="$1"
KEY_URL="$2"
REPO_URL="$3"
COMPONENTS="$4"
curl -fsSL "$KEY_URL" | gpg --dearmor | sudo tee "/usr/share/keyrings/$REPO_NAME-keyring.gpg" > /dev/null
echo "deb [signed-by=/usr/share/keyrings/$REPO_NAME-keyring.gpg] $REPO_URL $(lsb_release -cs) $COMPONENTS" | sudo tee "/etc/apt/sources.list.d/$REPO_NAME.list"
sudo apt update
Продвинутые техники и edge cases
Работа с зеркалами и CDN
Некоторые репозитории используют географически распределенные зеркала. Ключ должен работать для всех зеркал:
echo "deb [signed-by=/usr/share/keyrings/example.gpg] https://mirror1.example.com/ubuntu $(lsb_release -cs) main
deb [signed-by=/usr/share/keyrings/example.gpg] https://mirror2.example.com/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/example-mirrors.list
Обработка составных репозиториев
Крупные проекты часто используют несколько компонентов с разными ключами:
# Основной репозиторий
curl -fsSL https://example.com/main-key.asc | gpg --dearmor | sudo tee /usr/share/keyrings/example-main.gpg > /dev/null
# Экспериментальные пакеты
curl -fsSL https://example.com/experimental-key.asc | gpg --dearmor | sudo tee /usr/share/keyrings/example-experimental.gpg > /dev/null
Проверка целостности ключей
Всегда верифицируйте fingerprint ключей:
gpg --show-keys /usr/share/keyrings/example.gpg
Сравните отпечаток с официальным сайтом разработчика.
Мониторинг и профилактика
Создайте систему мониторинга статуса ключей:
#!/bin/bash
for keyring in /usr/share/keyrings/*.gpg; do
echo "Checking $keyring:"
gpg --no-default-keyring --keyring "$keyring" --list-keys --with-colons | awk -F: '/^pub/ {print "Key ID:", $5, "Expires:", $7}'
done
Настройте регулярную проверку истечения ключей в cron:
0 6 * * 1 /usr/local/bin/check-apt-keys.sh | mail -s "APT Keys Status" Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.
Безопасность и лучшие практики
Никогда не добавляйте ключи из ненадежных источников. Всегда используйте HTTPS для загрузки ключей. Регулярно аудируйте установленные ключи и удаляйте неиспользуемые.
Новый ключ подписан несколькими разработчиками из команды Kali, и подписи доступны на сервере ключей Ubuntu OpenPGP. Это пример правильной практики - ключи должны иметь множественные подписи доверенных лиц.
Используйте принцип минимального доверия: каждый ключ должен работать только с предназначенным для него репозиторием. Регулярно обновляйте ключи согласно рекомендациям разработчиков.
Современная система управления GPG-ключами в Linux представляет собой значительный эволюционный скачок в области безопасности пакетного менеджера. Хотя новые методы требуют больше действий по сравнению с устаревшим apt-key, они обеспечивают надежную защиту от компрометации через сторонние репозитории. Инвестиции времени в освоение правильных процедур многократно окупаются повышенной безопасностью системы, спокойствием администратора и стабильной работой серверов в долгосрочной перспективе.