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
:
- 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:
- 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:
- 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:
- sudo nano /etc/apt/sources.list
Em seguida, adicione o repositório externo ao final do arquivo:
. . .
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ãoamd64
earm64
.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étodoapt-key
. Esta adição é a mudança mais crítica ao abandonar oapt-key
, pois vincula a chave a um único repositório que ela está autorizada a autorizar e corrige a falha de segurança original noapt-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. Direcionartee
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:
- 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:
- sudo nano /etc/apt/sources.list.d/elastic-7.x.sources
Em seguida, adicione o repositório externo usando o formato 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
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:
- sudo apt update
Em seguida, instale seu pacote:
- 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:
- 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 dogpg
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 dogpg
para a criação de arquivos temporários. Ogpg
precisa criar esses arquivos para concluir o comando, caso contrário, ogpg
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
:
- 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:
- sudo apt update
Então você pode instalar o pacote:
- 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.