Как справиться с устареванием apt-key и add-apt-repository с помощью gpg для добавления внешних репозиториев в Ubuntu 22.04
Введение
apt-key
— это утилита, используемая для управления ключами, которые APT использует для аутентификации пакетов. Он тесно связан с утилитой add-apt-repository
, которая добавляет внешние репозитории с помощью серверов ключей в список доверенных источников установки APT. Однако ключи, добавленные с помощью apt-key
и add-apt-repository
, глобально доверяются apt
. Эти ключи не ограничиваются авторизацией одного репозитория, для которого они предназначены. Любой ключ, добавленный таким образом, может использоваться для авторизации добавления любого другого внешнего репозитория, что представляет собой важную проблему безопасности.
Начиная с Ubuntu 20.10, использование apt-key
приводит к предупреждению о том, что инструмент будет объявлен устаревшим в ближайшем будущем; аналогично, add-apt-repository
также скоро станет устаревшим. Хотя эти предупреждения об устаревании строго не запрещают использование apt-key
и add-apt-repository
с Ubuntu 22.04, игнорировать их не рекомендуется.
В настоящее время рекомендуется использовать gpg
вместо apt-key
и add-apt-repository
, и в будущих версиях Ubuntu это будет быть единственным вариантом. apt-key
и add-apt-repository
всегда действовали как оболочки, вызывая gpg
в фоновом режиме. Использование gpg
напрямую исключает посредника. По этой причине метод gpg
обратно совместим со старыми версиями Ubuntu и может использоваться в качестве замены apt-key
.
В этом руководстве будут описаны две процедуры, в которых используются альтернативы apt-key
и add-apt-repository
соответственно. Сначала будет добавлен внешний репозиторий с использованием открытого ключа с gpg
вместо использования apt-key
. Во-вторых, в качестве дополнения, в этом руководстве рассматривается добавление внешнего репозитория с использованием сервера ключей с gpg
в качестве альтернативы использованию add-apt-repository
.
Предпосылки
Для выполнения этого руководства вам понадобится сервер Ubuntu 22.04. Обязательно настройте это в соответствии с нашим руководством по первоначальной настройке сервера для Ubuntu 22.04 с пользователем без полномочий root с привилегиями sudo
и включенным брандмауэром.
Шаг 1 — Определение компонентов и формата ключа
PGP, или Pretty Good Privacy, — это проприетарная программа шифрования, используемая для подписи, шифрования и расшифровки файлов и каталогов. Файлы PGP — это файлы с открытым ключом, которые используются в этом процессе для аутентификации репозиториев как действительных источников в apt
. GPG или GNU Privacy Guard — это альтернатива PGP с открытым исходным кодом. Файлы GPG обычно представляют собой связки ключей, то есть файлы, содержащие несколько ключей. Оба эти типа файлов обычно используются для подписи и шифрования файлов.
gpg
— это инструмент командной строки GPG, который можно использовать для авторизации внешних репозиториев для использования с apt
. Однако gpg
принимает только файлы GPG. Чтобы использовать этот инструмент командной строки с файлами PGP, вы должны преобразовать их.
Elasticsearch представляет распространенный сценарий преобразования ключей и будет использоваться в качестве примера в этом разделе. Вы загрузите ключ, отформатированный для PGP, и преобразуете его в формат, совместимый с apt
, с расширением файла .gpg
. Вы сделаете это, запустив команду gpg
с флагом --dearmor
. Далее вы добавите ссылку на репозиторий в список источников пакетов, прикрепив прямую ссылку на ваш конвертированный ключ. Наконец, вы проверите этот процесс, установив пакет Elasticsearch.
Проекты, требующие добавления репозиториев с проверкой ключа, всегда будут предоставлять вам открытый ключ и URI репозитория, представляющий его точное местоположение. Для нашего примера Elasticsearch документация дает эти компоненты на странице их установки.
Вот компоненты, данные для Elasticsearch:
- Ключ:
https://artifacts.elastic.co/GPG-KEY-elasticsearch
- Репозиторий:
https://artifacts.elastic.co/packages/7.x/apt стабильный основной
Затем вам нужно определить, с каким файлом вы работаете: PGP или GPG. Вы можете проверить файл ключа, открыв URL-адрес с помощью curl
:
- curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch
Это выведет содержимое ключевого файла, который начинается со следующего:
Output-----BEGIN PGP PUBLIC KEY BLOCK-----
. . .
Несмотря на наличие GPG
в URL-адресе, первая строка указывает, что на самом деле это файл ключа PGP. Обратите внимание на это, потому что apt
принимает только формат GPG. Первоначально apt-key
обнаруживал файлы PGP и автоматически преобразовывал их в GPG, вызывая gpg
в фоновом режиме. Шаг 2 охватывает как ручное преобразование из PGP в GPG, так и действия, когда преобразование не требуется.
Шаг 2 — Загрузка ключа и преобразование в подходящий совместимый тип файла
При использовании метода gpg
вы всегда должны загружать ключ перед добавлением в список источников пакетов. Ранее с apt-key
этот порядок не всегда применялся. Теперь вам необходимо указать путь к загруженному ключевому файлу в списке источников. Если вы не загрузили ключ, вы, очевидно, не можете ссылаться на существующий путь.
С Elasticsearch вы работаете с файлом PGP, поэтому после загрузки вы конвертируете его в формат файла GPG. В следующем примере используется curl
для загрузки ключа, при этом загрузка передается в команду gpg
. gpg
вызывается с флагом --dearmor
для преобразования ключа PGP в формат файла GPG, с -o
, используемым для указания выходного файла .
В Ubuntu каталог /usr/share/keyrings
является рекомендуемым местом для конвертированных файлов GPG, так как это место по умолчанию, где Ubuntu хранит свои наборы ключей. В этом примере файл называется elastic-7.x.gpg
, но подойдет любое имя:
- curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-7.x.gpg
Это преобразует файл PGP в правильный формат GPG, делая его готовым для добавления в список источников для apt
.
Примечание. Если загруженный файл уже был в формате GPG, вы можете вместо этого загрузить файл прямо в /usr/share/keyrings
без преобразования, используя команду, подобную следующему примеру:
- curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo tee /usr/share/keyrings/elastic-7.x.gpg
В этом случае выходные данные команды curl
будут переданы в tee
для сохранения файла в нужном месте.
Шаг 3 — Добавление репозитория в список источников пакетов
Загрузив ключ в правильном формате файла GPG, вы можете добавить репозиторий в источник пакетов apt
, явно связав его с полученным ключом. Для этого есть три метода, каждый из которых связан с тем, как apt
находит источники. apt
извлекает исходники из центрального файла sources.list
, файлов .list
в каталоге sources.list.d
. и файлы .source
в каталоге sources.list.d
. Хотя между тремя вариантами нет функциональной разницы, рекомендуется рассмотреть три варианта и выбрать метод, который лучше всего соответствует вашим потребностям.
Вариант 1 — прямое добавление в sources.list
Первый метод включает вставку строки, представляющей источник, непосредственно в /etc/apt/sources.list
, основной файл, содержащий источники apt
. В этом файле есть несколько источников, включая исходники по умолчанию, поставляемые с Ubuntu. Вполне приемлемо редактировать этот файл напрямую, хотя вариант 2 и вариант 3 представляют собой более модульное решение, которое легче редактировать и поддерживать.
Откройте /etc/apt/sources.list
с помощью nano
или другого текстового редактора:
- sudo nano /etc/apt/sources.list
Затем добавьте внешний репозиторий в конец файла:
. . .
deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main
Эта строка содержит следующую информацию об источнике:
deb
: указывает, что исходный код использует обычную архитектуру Debian.arch=amd64,arm64
указывает архитектуры, в которые будут загружены данные APT. Здесь этоamd64
иarm64
.signed-by=/usr/share/keyrings/elastic-7.x.gpg
: указывает ключ, используемый для авторизации этого источника, и здесь он указывает на ваш.gpg
, хранящийся в папке/usr/share/keyrings
. Эта часть строки должна быть включена, хотя ранее она не требовалась в методеapt-key
. Это дополнение является наиболее важным изменением при переходе отapt-key
, поскольку оно связывает ключ с единственным репозиторием, которому разрешено авторизоваться, и устраняет первоначальную уязвимость в безопасности вapt-key
.https://artifacts.elastic.co/packages/7.x/apt stable main
: это URI, представляющий точное местонахождение данных в репозитории./etc/apt/sources.list.d/elastic-7.x.list
: это расположение и имя создаваемого нового файла./dev/null
: используется, когда вывод команды не требуется. Если указатьtee
на это место, вывод будет пропущен.
Сохраните и выйдите, нажав CTRL+O
, а затем CTRL+X
.
Вариант 2 — Создание нового файла .list в sources.list.d
С этой опцией вы вместо этого создадите новый файл в каталоге sources.list.d
. apt
анализирует как этот каталог, так и sources.list
для добавления в репозиторий. Этот метод позволяет физически изолировать добавления репозитория в отдельные файлы. Если вам когда-нибудь понадобится удалить это добавление или внести изменения, вы можете удалить этот файл вместо редактирования центрального файла sources.list
. Раздельное хранение дополнений облегчает поддержку, а редактирование sources.list
может быть более подвержено ошибкам, что повлияет на другие репозитории в файле.
Для этого передайте команду echo
в команду tee
, чтобы создать этот новый файл и вставить соответствующую строку. В следующем примере файл называется elastic-7.x.list
, но подойдет любое имя, если оно является уникальным именем файла в каталоге:
- echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list > /dev/null
Эта команда идентична ручному созданию файла и вставке соответствующей строки текста.
Вариант 3 — Создание файла .sources в sources.list.d
Третий метод записывает в файл .sources
вместо файла .list
. Этот метод является относительно новым и использует многострочный формат deb822
, который менее неоднозначен по сравнению с deb . . .
, но функционально идентично. Создайте новый файл:
- sudo nano /etc/apt/sources.list.d/elastic-7.x.sources
Затем добавьте внешний репозиторий в формате deb822
:
Types: deb
Architectures: amd64 arm64
Signed-By: /usr/share/keyrings/elastic-7.x.gpg
URIs: https://artifacts.elastic.co/packages/7.x/apt
Suites: stable
Components: main
Сохраните и выйдите после того, как вы вставили текст.
Это аналогично однострочному формату, и построчное сравнение показывает, что информация в обоих случаях идентична, просто организована по-разному. Следует отметить, что в этом формате не используются запятые при наличии нескольких аргументов (например, с amd64,arm64
), а вместо них используются пробелы.
Далее вы проверите этот процесс, выполнив тестовую установку.
Шаг 4 — Установка пакета из внешнего репозитория
Вы должны вызвать apt update
, чтобы заставить apt
просмотреть основной файл sources.list
и все файлы .list
. и .sources
в sources.list.d
. Вызов apt install
без предварительного обновления приведет к сбою установки или установке устаревшего пакета по умолчанию из apt
.
Обновите свои репозитории:
- sudo apt update
Затем установите свой пакет:
- sudo apt install elasticsearch
На этом шаге ничего не меняется по сравнению с методом apt-key
. После завершения этой команды установка будет завершена.
Приложение — Добавление внешнего репозитория с помощью сервера ключей
В этом разделе будет кратко рассмотрено использование gpg
с сервером ключей вместо открытого ключа для добавления внешнего репозитория. Этот процесс почти идентичен методу с открытым ключом, с той лишь разницей, что вызывается gpg
.
add-apt-repository
— это аналог apt-key
, основанный на сервере ключей, и оба они устарели. В этом сценарии используются разные компоненты. Вместо ключа и репозитория вам предоставляется URL-адрес сервера ключей и идентификатор ключа. В этом случае вы можете загрузить с сервера ключей напрямую в соответствующий формат .gpg
без необходимости конвертировать что-либо. Поскольку add-apt-repository
скоро станет устаревшим, вместо этого вы будете использовать gpg
для загрузки в файл, переопределяя поведение gpg
по умолчанию при импорте. к существующему брелоку.
На примере открытого языка программирования R вот приведенные компоненты, которые также можно найти в инструкции по установке на официальном сайте проекта:
- Сервер ключей:
keyserver.ubuntu.com
- Идентификатор ключа:
E298A3A825C0D65DFD57CBB651716619E084DAB9
- Репозиторий:
https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/
Сначала загрузите с сервера ключей напрямую с помощью gpg
. Имейте в виду, что в зависимости от трафика загрузки выполнение этой команды загрузки может занять некоторое время:
- sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/R.gpg --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
Эта команда включает следующие флаги, которые отличаются от использования gpg
с открытым ключом:
--no-default-keyring
в сочетании с--keyring
позволяет выполнять вывод в новый файл вместо импорта в существующую связку ключей, что является поведением по умолчанию дляgpg
в этом сценарии.--keyserver
в сочетании с--recv-keys
предоставляет конкретный ключ и место, откуда вы скачиваете.--homedir
используется для перезаписи местоположения по умолчаниюgpg
для создания временных файлов.gpg
должен создать эти файлы для выполнения команды, иначеgpg
попытается выполнить запись в/root
, что вызовет ошибку разрешения. Вместо этого эта команда помещает временные файлы в соответствующий каталог/tmp
.
Затем добавьте репозиторий в файл .list
. Это делается точно так же, как добавление внешнего репозитория с использованием открытого ключа путем передачи команды echo
в команду tee
:
- echo "deb [arch=amd64 signed-by=/usr/share/keyrings/R.gpg] https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/" | sudo tee /etc/apt/sources.list.d/R.list > /dev/null
Затем обновите список репозиториев:
- sudo apt update
Затем вы можете установить пакет:
- sudo apt install r-base
Использование gpg
для добавления внешних репозиториев похоже на открытые ключи и серверы ключей, разница заключается в том, как вы вызываете gpg
.
Заключение
Добавить внешний репозиторий с помощью открытого ключа или сервера ключей можно с помощью gpg
без использования apt-key
или add-apt-repository
в качестве посредник. Используйте этот метод, чтобы убедиться, что ваш процесс не устареет в будущих версиях Ubuntu, поскольку apt-key
и add-apt-repository
устарели и будут удалены в будущей версии. . Добавление внешних репозиториев с помощью gpg
гарантирует, что ключ будет использоваться только для авторизации одного репозитория, как вы предполагали.