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
:
- 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:
- 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:
- 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:
- 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 éamd64
earm64
.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. Apontartee
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:
- 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:
- 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 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:
- sudo apt update
Em seguida, instale seu pacote:
- 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:
- 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 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 substituir 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á 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
:
- 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:
- sudo apt update
Depois, 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 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.