Поиск по сайту:

Как справиться с устареванием 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:

  1. 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, но подойдет любое имя:

  1. 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 без преобразования, используя команду, подобную следующему примеру:

  1. 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 или другого текстового редактора:

  1. 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, но подойдет любое имя, если оно является уникальным именем файла в каталоге:

  1. 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 . . ., но функционально идентично. Создайте новый файл:

  1. 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.

Обновите свои репозитории:

  1. sudo apt update

Затем установите свой пакет:

  1. 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. Имейте в виду, что в зависимости от трафика загрузки выполнение этой команды загрузки может занять некоторое время:

  1. 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:

  1. 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

Затем обновите список репозиториев:

  1. sudo apt update

Затем вы можете установить пакет:

  1. sudo apt install r-base

Использование gpg для добавления внешних репозиториев похоже на открытые ключи и серверы ключей, разница заключается в том, как вы вызываете gpg.

Заключение

Добавить внешний репозиторий с помощью открытого ключа или сервера ключей можно с помощью gpg без использования apt-key или add-apt-repository в качестве посредник. Используйте этот метод, чтобы убедиться, что ваш процесс не устареет в будущих версиях Ubuntu, поскольку apt-key и add-apt-repository устарели и будут удалены в будущей версии. . Добавление внешних репозиториев с помощью gpg гарантирует, что ключ будет использоваться только для авторизации одного репозитория, как вы предполагали.