Внимание: Эта статья была передена с помощью yandex translate я постарался сделать ее читабильной, я пречитал ее как минимум один раз после перевода и правок, приношу извинения за возможные неудобства при чтении, в комментариях оставил краткий пресказ статьи.
Введение
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 обычно представляют собой брелоки (keyrings), которые представляют собой файлы, содержащие несколько ключей. Оба этих типа файлов обычно используются для подписи и шифрования файлов.
gpg - это инструмент командной строки GPG, который можно использовать для авторизации внешних репозиториев для использования с apt. Однако gpg принимает только файлы GPG. Чтобы использовать этот инструмент командной строки с файлами PGP, вы должны преобразовать их.
Elasticsearch представляет общий сценарий преобразования ключей и будет использоваться в качестве примера в этом разделе. (Прим. перев. пакет Elasticsearch будет использоваться как пример который будем устанвливать с помощью новых средств описанных в этой статье) Вы загрузите ключ, отформатированный для PGP, и конвертируете его в формат, совместимый с apt, с расширением файла .gpg. Сделаете это, выполнив команду gpg с флагом --dearmor. Затем добавите ссылку на репозито��ий в список источников пакетов, прикрепив при этом прямую ссылку на ваш преобразованный ключ. И наконец, вы проверите этот процесс, установив пакет Elasticsearch.
Проекты, требующие добавления репозиториев с проверкой ключа, всегда будут предоставлять вам открытый ключ и URI репозитория, представляющий его точное местоположение. Для нашего примера Elasticsearch документация содержит эти компоненты на странице их установки.
Вот компоненты, указанные для Elasticsearch:
Repository: https://artifacts.elastic.co/packages/7.x/apt stable main
Далее вы должны определить, предоставляется ли вам файл 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 — Загрузка Ключа и преобразование в файл, совместимый с apt
При использовании метода 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 packages sources, явно связав его с полученным ключом. Для достижения этой цели существует три метода, все из которых связаны с тем, как apt находит источники. apt извлекает sources файлы из центрального файла sources.list, файлов .list в каталоге sources.list.d и .sources файлы в каталоге sources.list.d. Хотя между этими тремя вариантами нет функциональной разницы, рекомендуется рассмотреть три варианта и выбрать метод, который наилучшим образом соответствует вашим потребностям.
Вариант 1 — Добавление в sources.list напрямую
Первый метод включает в себя вставку строки, представляющей источник, непосредственно в /etc/apt/sources.list, основной файл, содержащий apt sources. В этом файле есть несколько источников, включая источники по умолчанию, поставляемые с Ubuntu. Вполне допустимо редактировать этот файл напрямую, хотя варианты 2 и 3 представляют собой более модульное решение, которое может быть проще редактировать и поддерживать.
Откройте файл /etc/apt/sources.list с помощью nano или предпочитаемого вами текстового редактора:
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: source использует обычную архитектуру 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: URI, представляющий точное местоположение, в котором могут быть найдены данные в репозитории.
/etc/apt/sources.list.d/elastic-7.x.list: местоположение и имя нового файла, который будет создан.
/dev/null: вывод команды не является необходимым. Указание tee на это местоположение приводит к пропуску выходных данных.
Сохраните и завершите работу, нажав CTRL + O, затем CTRL + X.
Вариант 2 — Создание нового файла .list в sources.list.d
С помощью этого параметра вы вместо этого (Прим. перев. вместо создания файла в каталоке /etc/apt/sources.list как было в предыдущем варианте) создадите новый файл в каталоге 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.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 просмотреть файл main 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: keyserver.ubuntu.com
Key ID: E298A3A825C0D65DFD57CBB651716619E084DAB9
Repository: 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 гарантирует, что ключ будет использоваться только для авторизации одного репозитория, как вы предполагаете.