Введение
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:
Key: https://artifacts.elastic.co/GPG-KEY-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, поэтому после загрузки вы конвертируете его в формат JPG. В следующем примере для загрузки ключа используется 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, явно связав его с полученным ключом. Для достижения этой цели существует три метода, все из которых связаны с тем, как apt находит источники. apt извлекает исходные файлы из центрального файла sources.list, файлов .list в каталоге sources.list.d и .исходные файлы в каталоге 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: исходный код использует обычную архитектуру 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.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 гарантирует, что ключ будет использоваться только для авторизации одного репозитория, как вы предполагаете.