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 servidores de chaves à lista de fontes confiáveis de uma instalação APT. No entanto, as chaves adicionadas usando apt-key e add-apt-repository são confiadas globalmente pelo apt. Essas chaves não se limitam a autorizar o único repositório para o qual foram destinadas. Qualquer chave adicionada desta maneira pode ser usada para autorizar a adição de qualquer outro repositório externo, o que apresenta uma preocupação importante de segurança.

Começando com o Ubuntu 20.10, o uso de apt-key resulta em 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 gpg em vez de apt-key e add-apt-repository, e nas futuras versões do Ubuntu, será a única opção. apt-key e add-apt-repository sempre atuaram como wrappers, chamando gpg nos bastidores. Utilizar 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 usado como substituto direto para apt-key.

Este tutorial irá explicar dois procedimentos que usam alternativas para apt-key e add-apt-repository, respectivamente. Primeiro, será a adição de um repositório externo usando uma chave pública com gpg, em vez de usar apt-key. Segundo, como complemento, este tutorial abordará a adição de um repositório externo usando um servidor de chaves com gpg, como alternativa ao uso de add-apt-repository.

Pré-requisitos

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

Passo 1 — Identificação dos Componentes e 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 neste 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 os tipos de arquivo 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 esta ferramenta de linha de comando com arquivos PGP, você deve convertê-los.

O Elasticsearch apresenta um cenário comum para conversão de chaves e será usado como exemplo nesta seção. Você irá baixar uma chave formatada para PGP e convertê-la em um formato compatível com apt com uma extensão de arquivo .gpg. Você fará isso executando o comando gpg com a flag --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á este processo instalando o pacote Elasticsearch.

Projetos que exigem adicionar repositórios com verificação de chave sempre fornecerão uma chave pública e um URI do repositório representando sua localização exata. Para 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 foi fornecido um arquivo PGP ou GPG para trabalhar. Você pode inspecionar o arquivo de chave abrindo o URL com curl:

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

Isso irá exibir o conteúdo do arquivo de chave, que começa com o seguinte:

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

Apesar de ter GPG no URL, a primeira linha indica que na verdade é um arquivo de chave PGP. Tome nota disso, pois o apt só aceita o formato GPG. Originalmente, o apt-key detectava arquivos PGP e os convertia automaticamente para GPG chamando gpg em segundo plano. Passo 2 abordará tanto a conversão manual de PGP para GPG, quanto o que fazer quando a conversão não é 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 apt-key, essa ordem nem sempre era seguida. Agora, é necessário fazer referência ao caminho do arquivo da chave baixada na 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ê irá convertê-lo para o formato de arquivo GPG após o download. O exemplo a seguir usa o curl para baixar a chave, com o download sendo enviado para um comando gpg. gpg é chamado com a opção --dearmor para converter a chave PGP em um arquivo de formato 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 anéis de chaves. 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 no formato GPG correto, tornando-o pronto para ser adicionado à lista de fontes para o apt.

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

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

Neste caso, a saída do comando curl seria enviada para o 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 de arquivo GPG correto, você pode adicionar o repositório à fonte de pacotes apt enquanto o vincula explicitamente à chave obtida. Existem três métodos para realizar isso, todos relacionados a como o apt encontra 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 opções e escolher o método que melhor atenda à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 o arquivo `/etc/apt/sources.list` com o `nano` ou seu editor de texto preferido:

  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 é 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 o 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 afastar-se do `apt-key`, pois vincula a chave a um repositório singular que está autorizado 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 o nome do novo arquivo a ser criado.
  • /dev/null: Isso é usado quando a saída de um comando não é necessária. Apontar 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órios. Este método permite isolar fisicamente adições de repositórios em arquivos separados. Se você precisar remover essa adição posteriormente 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 forma que afeta outros repositórios no arquivo.

Para fazer isso, redirecione 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 usa 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 depois de inserir o texto.

Isto é 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 observar é que este formato não usa vírgulas quando há múltiplos argumentos (como com amd64,arm64), e em vez disso usa espaços.

Em seguida, você verificará este 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 examine o arquivo principal sources.list, bem como todos os arquivos .list e .sources em sources.list.d. Chamar apt install sem fazer uma atualização primeiro resultará em uma instalação falha ou na 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

Não há alterações nesta etapa em comparação com o método apt-key. Quando este comando terminar, você terá concluído a instalação.

Adendo – Adicionando um Repositório Externo Usando um Keyserver

Esta seção abordará brevemente o uso do gpg com um keyserver 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 equivalente baseado em keyserver para apt-key, e ambos estão sujeitos a descontinuação. Este cenário utiliza componentes diferentes. Em vez de uma chave e repositório, é fornecido um URL de keyserver e um ID de chave. Neste caso, você pode baixar diretamente do keyserver no formato .gpg apropriado sem a necessidade de converter qualquer coisa. Como add-apt-repository em breve será descontinuado, você utilizará 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
  • ID da Chave: E298A3A825C0D65DFD57CBB651716619E084DAB9
  • Repositório: https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/

Primeiro, baixe diretamente do keyserver usando o gpg. Este comando pode demorar um pouco 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 opções, que são diferentes 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 substituir 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á gravar em /root, o que causa um erro de permissão. Em vez disso, este comando coloca os arquivos temporários no diretório adequado /tmp.

Em seguida, adicione o repositório a um arquivo .list. Isso é feito da mesma maneira que adicionar um repositório externo usando uma chave pública, através da canalização de 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

Em seguida, atualize a lista de repositórios:

  1. sudo apt update

Depois, 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 keyservers, 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 o apt-key ou add-apt-repository como intermediário. Utilize este método para garantir que o seu processo não se torne obsoleto em futuras versões do Ubuntu, uma vez que o apt-key e o add-apt-repository estão obsoletos e serão removidos em uma versão futura. Adicionar repositórios externos usando o gpg assegura que uma chave será usada apenas para autorizar um único repositório, conforme pretendido.

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