Как обрабатывать устаревание 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, с нерутовым пользователем с привилегиями 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 stable main

Затем вам нужно определить, предоставлен ли вам файл 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 — Загрузка ключа и конвертация в совместимый с apt тип файла

С методом 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

Затем добавьте внешний репозиторий в конец файла:

/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:

/etc/apt/sources.list.d/elastic-7.x.sources
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 обеспечивает, что ключ будет использоваться только для авторизации единственного репозитория, как вы намерены.

Source:
https://www.digitalocean.com/community/tutorials/how-to-handle-apt-key-and-add-apt-repository-deprecation-using-gpg-to-add-external-repositories-on-ubuntu-22-04