Como Lidar com a Depreciação de apt-key e add-apt-repository Usando gpg para Adicionar Repositórios Externos no Ubuntu 22.04

Introdução

apt-key é um utilitário usado para gerenciar as chaves que o APT utiliza para autenticar pacotes. Está intimamente relacionado com o utilitário add-apt-repository, que adiciona repositórios externos usando keyservers à lista de fontes confiáveis de uma instalação do APT. No entanto, as chaves adicionadas usando apt-key e add-apt-repository são confiáveis globalmente pelo apt. Essas chaves não estão limitadas a autorizar o único repositório para o qual foram destinadas. Qualquer chave adicionada dessa maneira pode ser usada para autorizar a adição de qualquer outro repositório externo, apresentando uma preocupação de segurança importante.

Começando com o Ubuntu 20.10, o uso de apt-key gera um aviso de que a ferramenta será descontinuada em um futuro próximo; da mesma forma, add-apt-repository também será em breve descontinuado. Embora esses avisos de descontinuação não impeçam estritamente o uso de apt-key e add-apt-repository com o Ubuntu 22.04, não é aconselhável ignorá-los.

A prática recomendada atualmente é utilizar o gpg no lugar do apt-key e do add-apt-repository, e nas futuras versões do Ubuntu esta será a única opção. O apt-key e o add-apt-repository sempre atuaram como invólucros, chamando o gpg em segundo plano. Utilizar o gpg diretamente elimina o intermediário. Por esse motivo, o método gpg é retrocompatível com versões mais antigas do Ubuntu e pode ser utilizado como substituto direto do apt-key.

Este tutorial irá descrever dois procedimentos que utilizam alternativas ao apt-key e ao add-apt-repository, respectivamente. Primeiramente, será a adição de um repositório externo utilizando uma chave pública com o gpg ao invés de utilizar o apt-key. Segundo, como complemento, este tutorial irá abordar a adição de um repositório externo utilizando um servidor de chaves com o gpg como alternativa ao uso do add-apt-repository.

Pré-requisitos

Para completar este tutorial, você precisará de um servidor Ubuntu 22.04. Certifique-se de configurá-lo de acordo com o nosso guia de configuração inicial do servidor para Ubuntu 22.04, com um usuário não root com privilégios de sudo e um firewall ativado.

Passo 1 — Identificando os Componentes e o Formato Chave

O PGP, ou Pretty Good Privacy, é um programa de criptografia proprietário usado para assinar, criptografar e descriptografar arquivos e diretórios. Os arquivos PGP são arquivos de chave pública, que são usados nesse processo para autenticar repositórios como fontes válidas dentro do apt. O GPG, ou GNU Privacy Guard, é uma alternativa de código aberto ao PGP. Os arquivos GPG são geralmente arquivos de chave, que são arquivos que contêm várias chaves. Ambos esses tipos de arquivos são comumente usados para assinar e criptografar arquivos.

gpg é a ferramenta de linha de comando do GPG que pode ser usada para autorizar repositórios externos para uso com apt. No entanto, o gpg só aceita arquivos GPG. Para usar essa ferramenta de linha de comando com arquivos PGP, você deve convertê-los.

O Elasticsearch apresenta um cenário comum para conversão de chave e será usado como exemplo nesta seção. Você baixará uma chave formatada para PGP e a converterá em um formato compatível com apt com uma extensão de arquivo .gpg. Você fará isso executando o comando gpg com a opção --dearmor. Em seguida, você adicionará o link do repositório à lista de fontes de pacotes, enquanto anexa uma referência direta à sua chave convertida. Por fim, você verificará esse processo instalando o pacote Elasticsearch.

Projetos que exigem adição de repositórios com verificação de chave sempre fornecerão a você uma chave pública e uma URI de repositório representando sua localização exata. Para o nosso exemplo do Elasticsearch, a documentação fornece esses componentes em sua página de instalação.

Aqui estão os componentes fornecidos para o Elasticsearch:

  • Chave: https://artifacts.elastic.co/GPG-KEY-elasticsearch
  • Repositório: https://artifacts.elastic.co/packages/7.x/apt stable main

Em seguida, você precisa determinar se recebeu um arquivo PGP ou GPG para trabalhar. Você pode inspecionar o arquivo de chave abrindo a URL com o curl:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch

Isso fornecerá a saída do conteúdo do arquivo de chave, que começa com o seguinte:

Output
-----BEGIN PGP PUBLIC KEY BLOCK----- . . .

Mesmo tendo GPG na URL, a primeira linha indica que este é realmente um arquivo de chave PGP. Faça uma nota disso, porque o apt aceita apenas o formato GPG. Originalmente, o apt-key detectava arquivos PGP e os convertia automaticamente para GPG chamando gpg em segundo plano. Passo 2 cobrirá tanto a conversão manual de PGP para GPG, quanto o que fazer quando a conversão não for necessária.

Passo 2 — Baixando a Chave e Convertendo para um Tipo de Arquivo Compatível com apt

Com o método gpg, você deve sempre baixar a chave antes de adicioná-la à lista de fontes de pacotes. Anteriormente, com o apt-key, essa ordem nem sempre era imposta. Agora, é necessário fazer referência ao caminho do arquivo de chave baixado em sua lista de fontes. Se você não baixou a chave, obviamente não pode fazer referência a um caminho existente.

Com o Elasticsearch, você está trabalhando com um arquivo PGP, então você o converterá para o formato de arquivo GPG após o download. O seguinte exemplo usa curl para baixar a chave, com o download sendo direcionado para um comando gpg. O gpg é chamado com a flag --dearmor para converter a chave PGP em um arquivo GPG, com -o usado para indicar a saída do arquivo.

No Ubuntu, o diretório /usr/share/keyrings é o local recomendado para seus arquivos GPG convertidos, pois é o local padrão onde o Ubuntu armazena seus keyrings. O arquivo é nomeado elastic-7.x.gpg neste exemplo, mas qualquer nome funciona:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-7.x.gpg

Isso converte o arquivo PGP para o formato GPG correto, deixando-o pronto para ser adicionado à lista de fontes do apt.

Nota: Se o arquivo baixado já estiver em formato GPG, você poderia, em vez disso, baixar o arquivo diretamente para /usr/share/keyrings sem convertê-lo usando um comando como o seguinte exemplo:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo tee /usr/share/keyrings/elastic-7.x.gpg

Nesse caso, a saída do comando curl seria direcionada para tee para salvar o arquivo no local correto.

Passo 3 — Adicionando o Repositório à Sua Lista de Fontes de Pacotes

Com a chave baixada e no formato correto de arquivo GPG, você pode adicionar o repositório às fontes de pacotes do apt enquanto o vincula explicitamente à chave que você obteve. Existem três métodos para realizar isso, todos relacionados a como o apt encontra as fontes. O apt puxa fontes de um arquivo central sources.list, arquivos .list no diretório sources.list.d, e arquivos .source no diretório sources.list.d. Embora não haja diferença funcional entre as três opções, é recomendável considerar as três e escolher o método que melhor se adequa às suas necessidades.

Opção 1 — Adicionando diretamente ao sources.list

O primeiro método envolve inserir uma linha representando a fonte diretamente em /etc/apt/sources.list, o arquivo principal que contém as fontes do apt. Existem várias fontes neste arquivo, incluindo as fontes padrão que vêm com o Ubuntu. É perfeitamente aceitável editar este arquivo diretamente, embora a Opção 2 e a Opção 3 apresentem uma solução mais modular que pode ser mais fácil de editar e manter.

Abra /etc/apt/sources.list com nano ou o editor de texto de sua preferência:

  1. sudo nano /etc/apt/sources.list

Em seguida, adicione o repositório externo ao final do arquivo:

/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

Esta linha contém as seguintes informações sobre a fonte:

  • deb: Isso especifica que a fonte usa uma arquitetura regular do Debian.
  • arch=amd64,arm64 especifica as arquiteturas para as quais os dados do APT serão baixados. Aqui são amd64 e arm64.
  • signed-by=/usr/share/keyrings/elastic-7.x.gpg: Isso especifica a chave usada para autorizar esta fonte, e aqui ela aponta para seu arquivo .gpg armazenado em /usr/share/keyrings. Esta parte da linha deve ser incluída, embora anteriormente não fosse necessária no método apt-key. Esta adição é a mudança mais crítica ao abandonar o apt-key, pois vincula a chave a um único repositório que ela está autorizada a autorizar e corrige a falha de segurança original no apt-key.
  • https://artifacts.elastic.co/packages/7.x/apt stable main: Este é o URI que representa o local exato onde os dados dentro do repositório podem ser encontrados.
  • /etc/apt/sources.list.d/elastic-7.x.list: Este é o local e nome do novo arquivo a ser criado.
  • /dev/null: Isso é usado quando a saída de um comando não é necessária. Direcionar tee para este local omite a saída.

Salve e saia pressionando CTRL+O e depois CTRL+X.

Opção 2 — Criando um Novo Arquivo .list em sources.list.d

Com esta opção, você irá criar um novo arquivo no diretório sources.list.d. O apt analisa tanto este diretório quanto o sources.list para adições de repositório. Este método permite isolar fisicamente adições de repositório em arquivos separados. Se você precisar remover posteriormente essa adição ou fazer edições, pode excluir este arquivo em vez de editar o arquivo central sources.list. Manter suas adições separadas facilita a manutenção, e editar o sources.list pode ser mais propenso a erros de uma maneira que afeta outros repositórios no arquivo.

Para fazer isso, encaminhe um comando echo para um comando tee para criar este novo arquivo e inserir a linha apropriada. O arquivo é nomeado elastic-7.x.list no exemplo a seguir, mas qualquer nome funciona, desde que seja um nome de arquivo único no diretório:

  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

Este comando é idêntico à criação manual do arquivo e à inserção da linha de texto apropriada.

Opção 3 — Criando um arquivo .sources em sources.list.d

O terceiro método escreve em um arquivo .sources em vez de um arquivo .list. Este método é relativamente novo e utiliza o formato de várias linhas deb822, que é menos ambíguo em comparação com a declaração deb . . ., embora seja funcionalmente idêntico. Crie um novo arquivo:

  1. sudo nano /etc/apt/sources.list.d/elastic-7.x.sources

Em seguida, adicione o repositório externo usando o formato 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

Salve e saia após inserir o texto.

Isso é análogo ao formato de uma linha, e uma comparação linha por linha mostra que as informações em ambos são idênticas, apenas organizadas de maneira diferente. Uma coisa a notar é que este formato não usa vírgulas quando há múltiplos argumentos (como com amd64,arm64), e em vez disso, utiliza espaços.

Em seguida, você verificará esse processo fazendo uma instalação de teste.

Passo 4 — Instalando o Pacote do Repositório Externo

Você deve chamar apt update para que o apt verifique o arquivo principal sources.list e todos os arquivos .list e .sources em sources.list.d. Chamar apt install sem uma atualização primeiro causará uma instalação falhada ou a instalação de um pacote padrão desatualizado do apt.

Atualize seus repositórios:

  1. sudo apt update

Em seguida, instale seu pacote:

  1. sudo apt install elasticsearch

Nada muda nesta etapa em comparação com o método apt-key. Uma vez que este comando termine, você terá concluído a instalação.

Adendo – Adicionando um Repositório Externo Usando um Servidor de Chaves

Esta seção abordará brevemente o uso do gpg com um servidor de chaves em vez de uma chave pública para adicionar um repositório externo. O processo é quase idêntico ao método da chave pública, com a diferença sendo como o gpg é chamado.

add-apt-repository é o correspondente baseado em keyserver para apt-key, e ambos estão prestes a serem descontinuados. Este cenário utiliza componentes diferentes. Em vez de uma chave e repositório, é fornecido um URL de keyserver e ID de chave. Neste caso, você pode baixar diretamente do keyserver para o formato .gpg apropriado sem precisar converter nada. Como add-apt-repository em breve será descontinuado, você usará gpg para baixar para um arquivo, substituindo o comportamento padrão do gpg de importar para um keyring existente.

Usando a linguagem de programação de código aberto R como exemplo, aqui estão os componentes fornecidos, que também podem ser encontrados nas instruções de instalação no site oficial do projeto:

  • Keyserver: keyserver.ubuntu.com
  • Key ID: E298A3A825C0D65DFD57CBB651716619E084DAB9
  • Repositório: https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/

Primeiro, baixe diretamente do keyserver usando gpg. Este comando pode levar algum tempo para ser concluído, dependendo do tráfego de download:

  1. sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/R.gpg --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

Este comando inclui as seguintes flags, que diferem do uso do gpg com uma chave pública:

  • --no-default-keyring combinado com --keyring permite a saída para um novo arquivo, em vez de importar para um keyring existente, que é o comportamento padrão do gpg neste cenário.
  • --keyserver combinado com --recv-keys fornece a chave específica e a localização de onde você está baixando.
  • --homedir é usado para sobrescrever a localização padrão do gpg para a criação de arquivos temporários. O gpg precisa criar esses arquivos para concluir o comando, caso contrário, o gpg tentará escrever em /root, o que causa um erro de permissão. Em vez disso, este comando coloca os arquivos temporários no diretório /tmp apropriado.

Em seguida, adicione o repositório a um arquivo .list. Isso é feito da mesma maneira exata que adicionar um repositório externo usando uma chave pública, canalizando um comando echo em um comando 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

Depois, atualize sua lista de repositórios:

  1. sudo apt update

Então você pode instalar o pacote:

  1. sudo apt install r-base

O uso do gpg para adicionar repositórios externos é semelhante entre chaves públicas e servidores de chaves, com a diferença sendo como você chama o gpg.

Conclusão

Adicionar um repositório externo usando uma chave pública ou um servidor de chaves pode ser feito através do gpg, sem usar apt-key ou add-apt-repository como intermediário. Use este método para garantir que o seu processo não se torne obsoleto em futuras versões do Ubuntu, pois apt-key e add-apt-repository estão obsoletos e serão removidos em uma versão futura. Adicionar repositórios externos usando gpg garante que uma chave será usada apenas para autorizar um único repositório conforme o desejado.

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