Jump to content
From ArchWiki
< Pacman (Português)

Status de tradução: Esse artigo é uma tradução de Pacman/Package signing. Data da última tradução: 2022-08-10. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Artigos relacionados

- GnuPG
- DeveloperWiki:Package signing

Um pacote pode se tornar malicioso (consideramos as fontes originais seguras) intencionalmente ou não. No primeiro caso, o empacotador prepara o pacote (modificando fontes, adicionando scripts, modificando scripts de compilação) com a intenção de prejudicar o sistema ou os dados do usuário. No segundo caso o empacotador por engano ou omissão cria o pacote que se instalado coloca o sistema do usuário em risco.

Um pacote malicioso pode entrar no universo de pacotes quando o empacotador o fornece diretamente ou o coloca em um repositório ou espelho legítimo. O nível de ameaça depende aqui do que o software contido no pacote pode fazer e quão popular é o pacote. A qualidade anterior é possível determinar pela inspeção cuidadosa do pacote e seu conteúdo (também executando software em ambiente de teste). O último pode ser estimado com base nas estatísticas de download (assumindo que o pacote baixado é o pacote instalado).

Então, para determinar se os pacotes são autênticos, o pacman usa chaves GnuPG em um modelo de rede de confiança. As Chaves Mestras de Assinatura (Master Signing Keys) são encontradas aqui. Pelo menos três dessas Chaves Mestras de Assinatura são usadas para assinar as chaves de Desenvolvedor e de Trusted User. Elas são, então, usadas para assinar seus pacotes. Cada usuário também possui uma chave PGP única, a qual é gerada quando você configura pacman-key. É essa rede de confiança que liga a chave do usuário às chaves mestras.

Exemplos de redes de confiança:

- Pacotes personalizados: Pacotes feitos e assinados com uma chave local.
- Pacotes não oficiais: Pacotes feitos e assinados por um desenvolvedor. Então, uma chave local foi usada assinar aquela chave de desenvolvedor.
- Pacotes oficiais: Pacotes feitos e assinados por um desenvolvedor. A chave do desenvolvedor foi assinada pelas chaves mestras do Arch Linux. Você usou sua chave para assinar as chaves mestras e você confia nelas como garantia dos desenvolvedores.

Nota: O protocolo HKP usa 11371/tcp para comunicação. Para obter as chaves assinadas dos servidores (usando pacman-key), essa porta é necessária para comunicação.

## Configuração

### Configurando o pacman

A opção `SigLevel` no `/etc/pacman.conf` determina o nível de confiança exigido para instalar um pacote com `pacman -S`. Para uma explicação detalhada de `SigLevel`, veja pacman.conf(5) § PACKAGE AND DATABASE SIGNATURE CHECKING e os comentários no arquivo. É possível configurar uma verificação de assinatura global ou por repositório. Se `SigLevel` estiver definido globalmente na seção `[options]`, todos os pacotes instalados com `pacman -S` vão exigir assinatura. Com a configuração `LocalFileSigLevel` do `pacman.conf` padrão, quaisquer pacotes que você compile e instale com `pacman -U`, não precisarão ser assinados usando makepkg.

Nota: Apesar de todos os pacotes oficiais serem agora assinados, desde Novembro de 2018 a assinatura da base de dados é um trabalho em progresso. Se `Required` estiver definido, então `DatabaseOptional` também deve ser definido.

Para pacotes remotos, a configuração padrão terá suporte apenas à instalação de pacotes que estão assinados pelas chaves confiadas:

    /etc/pacman.conf

    SigLevel = Required DatabaseOptional

Isso porque `TrustedOnly` é um parâmetro padrão compilado no pacman. A configuração padrão é idêntica a usar a opção global de:

    SigLevel = Required DatabaseOptional TrustedOnly

A linha acima pode ser obtida a nível de repositório mais abaixo na configuração, p.ex.:

    [core]
    SigLevel = PackageRequired
    Include = /etc/pacman.d/mirrorlist

adiciona explicitamente verificação de assinatura para pacotes do repositório, mas não exige que o banco de dados seja assinado. `Optional` aqui desligaria um `Required` global para esse repositório.

Atenção: A opção de SigLevel `TrustAll` existe para propósito de depuração e facilita muito confiar em chaves que não foram verificadas. Você deve usar `TrustedOnly` para todos os repositórios oficiais.

### Inicializando o chaveiro

Para inicializar o chaveiro (keyring) do pacman, execute:

    # pacman-key --init

A inicialização do chaveiro requer entropia. Para gerar entropia, mova seu mouse por aí, pressiona caracteres aleatórios no teclado e executa algumas atividades de disco (por exemplo, em outro console, executando `ls -R /` ou `find / -name foo` ou `dd if=/dev/sda8 of=/dev/tty7`). Se o seu sistema ainda não possui entropia suficiente, esta etapa pode levar horas; se você ativamente gerar entropia, ele irá completar muito mais rapidamente.

A aleatoriedade criada é usada para inicializar o chaveiro (`/etc/pacman.d/gnupg`) e a chave de assinatura GPG do seu sistema.

Nota: Se você precisa executar `pacman-key --init` em um computador que não gera muita entropia (por exemplo, um servidor headless - sem monitor e periféricos), a geração de chaves pode levar muito tempo. Para gerar pseudo-entropia, instale haveged ou rng-tools na máquina de destino e inicie o serviço correspondente antes de executar `pacman-key --init`.

## Gerenciando o chaveiro

### Verificando as chaves mestras

A configuração inicial de chaves é alcançada usando:

    # pacman-key --populate

Tire um tempo para verificar as Chaves Mestras de Assinatura quando solicitado, pois estes são usados para coassinar (e, portanto, confiar) todas as outras chaves do empacotador.

As chaves PGP são muito grandes (2048 bits ou mais) para que os humanos trabalhem com elas, então eles geralmente são hashed para criar uma impressão digital de 40 dígitos que pode ser usada para verificar manualmente que duas chaves são iguais. Os últimos oito dígitos da impressão digital servem como um nome para a chave conhecida como "ID da chave (curta)" (os últimos dezesseis dígitos da impressão digital seriam 'ID da chave longa').

### Adicionando as chaves de desenvolvedor

As chaves oficiais de desenvolvedor e Trusted Users (TU) são assinadas pelas chaves mestras, então você não precisa usar pacman-key para assiná-las você mesmo. Sempre que o pacman encontra uma chave que ele não reconhece, ele solicitará fazer o download de um chaveiro (`keyserver`) configurado no `/etc/pacman.d/gnupg/gpg.conf` (ou usando a opção `--keyserver` na linha de comando). O Wikipédia mantém uma lista de servidores de chave.

Depois de ter baixado uma chave do desenvolvedor, você não terá que baixá-la novamente e pode ser usada para verificar quaisquer outros pacotes assinados por esse desenvolvedor.

Nota: O pacote archlinux-keyring, que é uma dependência de pacman, contém as chaves mais recentes. No entanto, as chaves também podem ser atualizadas manualmente usando `pacman-key --refresh-keys` (como root). Ao fazer `--refresh-keys`, sua chave local também será pesquisada no servidor de chaves remoto e você receberá uma mensagem sobre o fato de não ser encontrada. Isso não é motivo para se preocupar.

### Adicionando chaves não oficiais

Esse método pode ser usado para adicionar uma chave ao chaveiro do pacman, ou para permitir repositórios não oficiais de usuários assinados.

Primeiro, obtenha o ID de chave (`id-chave`) de seu dono. Então, adicione-o ao chaveiro usando um dos métodos abaixo:

1. Se a chave estiver localizado em um servidor de chave, importe-a com:

       # pacman-key --recv-keysid-chave

2. Caso contrário, se um link para um arquivo de chave for fornecido, baixe-a e então execute:

       # pacman-key --add /caminho/para/arquivo/de/chave

É recomendado verificar a impressão digital, assim como qualquer chave mestra ou outra chave que você vai assinar:

    $ pacman-key --finger id-chave

Finalmente, você deve assinar localmente a chave importada:

    # pacman-key --lsign-key id-chave

Agora, você confia nessa chave para assinar pacotes.

### Depurando com gpg

Para fins de depuração, você pode acessar o chaveiro do pacman diretamente com gpg, p.ex.:

    # gpg --homedir /etc/pacman.d/gnupg --list-keys

## Dicas e truques

### Atualize o sistema regularmente

Atualizar o sistema regularmente via pacman (Português)#Atualizando pacotes previne a maioria dos erros de assinatura. Se o atraso for inevitável e a atualização do sistema for atrasada por um longo período, sincronize manualmente o banco de dados do pacote e atualize o pacote archlinux-keyring antes da atualização do sistema:

    # pacman -Sy archlinux-keyring && pacman -Su

Este comando não é considerado uma atualização parcial, pois sincroniza o banco de dados do pacote e atualiza o pacote de chaveiro primeiro. Ambos devem ser processados antes de iniciar a atualização do sistema para garantir que as assinaturas de todos os pacotes atualizados possam ser verificadas corretamente.

### Atualize o horário do sistema regularmente

Quando o horário do sistema estiver com defeito, as chaves de assinatura podem ser consideradas expiradas (ou inválidas) e as verificações de assinatura nos pacotes falharão. Sincronize o relógio do sistema regularmente usando o Network Time Protocol daemon.

## Solução de problemas

### Erros de assinatura inválida

O pacman-key depende do horário do sistema. Se o relógio do sistema não estiver sincronizado, instalação/atualização do sistema pode falhar com:

    erro: pacote: assinatura de "Usuário <email@archlinux.org>" é inválida
    erro: falha ao submeter transação (pacote inválido ou corrompido (assinatura PGP))
    Ocorreram erros e, portanto, nenhum pacote foi atualizado.

Se estiver usando ntpd, corrija o horário do sistema (como root) com `ntpd -qg` seguido por `hwclock -w`.

Outros clientes NTP podem ser usados. Consulte sincronização de tempo.

Se a correção do relógio do sistema não resolver a falha, tente uma das seguintes abordagens:

#### Removendo pacotes do cache

Alguns pacotes podem estar corrompidos ou não assinados, causando falha. Remova cada pacote incorreto do cache do sistema `rm /var/cache/pacman/pkg/pkgname` para que ele seja baixado recentemente, ou apague todo o cache.

#### Redefinindo todas as chaves

Remova ou redefina todas as chaves instaladas em seu sistema removendo o diretório `/etc/pacman.d/gnupg` (como root) e executando novamente `pacman-key --init` seguido por `pacman-key --populate` para adicionar novamente as chaves padrão.

#### Desabilitando a verificação de assinatura

Atenção: Use isso com cuidado. Desabilitar assinatura de pacotes vai permitir que o pacman instale pacotes não confiáveis.

Se você não estiver preocupado com a assinatura do pacote, poderá desabilitar completamente a verificação de assinatura PGP. Edite `/etc/pacman.conf` para ter as seguintes linhas no `[options]`:

    SigLevel = Never
    #LocalFileSigLevel = Optional
    #RemoteFileSigLevel = Required

Você precisa comentar quaisquer configurações específicas de `SigLevel` do repositório porque elas substituem as configurações globais. Isso resultará em nenhuma verificação de assinatura, que era o comportamento antes do pacman 4. Se você fizer isso, você não precisa configurar um chaveiro com pacman-key. Você pode alterar essas opções posteriormente se decidir habilitar a verificação do pacote.

### Não foi possível importar chaves

Existem várias fontes possíveis deste problema:

- Um pacote archlinux-keyring desatualizado.
- O relógio está definido com uma data incorreta.
- Seu provedor de internet bloqueou a porta usada para importar chaves PGP.
- Seu cache do pacman contém cópia de pacotes não assinados de tentativas anteriores.
- `dirmngr` não está configurado corretamente.

Você pode estar travado por causa do pacote archlinux-keyring estar desatualizado, ao fazer uma sincronização de atualização.

Abaixo estão algumas soluções que podem funcionar dependendo do seu caso.

#### Atualize o sistema

Veja se atualizar o sistema consegue corrigir isso primeiro.

#### Altere o servidor de chaves

Se você suspeitar que algo não está funcionando corretamente com o servidor de chaves, tente mudar para o servidor de chaves do Ubuntu. Para fazer isso, edite `/etc/pacman.d/gnupg/gpg.conf` e altere a linha `keyserver` para:

    keyserver hkp://keyserver.ubuntu.com

#### Limpe os pacotes em cache

Se você suspeita que seu cache do pacman em `/var/cache/pacman/pkg/` pode conter pacotes não assinados, tente apagar o cache manualmente ou executar:

    # pacman -Sc

o que remove todos os pacotes em cache que não foram instalados.

### Assinatura tem confiança desconhecida

Algumas vezes ao executar `pacman -Syu`, você pode encontrar esse erro:

    error: nome-pacote: a assinatura de "empacotador" tem confiança desconhecida

Isso ocorre porque a chave do `empacotador` usada no pacote `nome-pacote` não está presente e/ou não é confiável no banco de dados gpg local do pacman-key. O Pacman parece não conseguir sempre verificar se a chave foi recebida e marcada como confiável antes de continuar. Isso também pode ocorrer porque uma chave expirou desde que foi adicionada ao seu chaveiro.

Mitigue:

- Atualizando manualmente o pacote archlinux-keyring antes de atualizar o sistema ou
- atualizando suas chaves com `pacman-key --refresh-keys` ou
- assinando manualmente a chave não confiável localmente (não recomendado) ou
- definindo temporariamente `SigLevel` com `TrustAll` (não recomendado).

As duas últimas opções acima quebram a cadeia de confianças e devem ser usadas com cuidado.

### Atualizando chaves via proxy

Para usar um proxy ao atualizar chaves, a opção `honor-http-proxy` deve ser configurar em ambos `/etc/gnupg/dirmngr.conf` e `/etc/pacman.d/gnupg/dirmngr.conf`. Veja GnuPG#Use a keyserver para mais informações.

Nota: Se o pacman-key for usado sem a opção `honor-http-proxy` e falhar, uma reinicialização pode resolver o problema.

### Pacotes maliciosos

Não há como impedir os empacotadores de forjar pacotes intencionalmente que podem fazer coisas ruins para o sistema do usuário e fornecê-los em seus próprios repositórios. No entanto, existe uma maneira de tornar os usuários mais cuidadosos ao baixar pacotes fora dos repositórios oficiais, porque o empacotador malicioso terá que convencer os usuários a baixar seu pacote. Eles anunciam software rico em recursos que fornecem “segurança, velocidade, facilidade de uso” ausentes dos repositórios oficiais. Uma chance de contrariar esses esforços é educar o usuário a usar pacotes fora dos repositórios oficiais somente se for absolutamente necessário (pelo menos até que alguma forma de prevenir danos potencialmente causados por tal software não seja inventada no sistema).

Pacotes perigosos também podem ser injetados no nível do espelho. Tornar este nível mais seguro está principalmente nas mãos dos administradores de espelho, mas também há uma coisa ou duas que o Arch pode fazer para ajudá-los. Os pacotes baixados podem ser verificados da mesma forma que seriam na máquina do usuário. Isso exigiria um pouco de poder de processamento do lado do servidor, mas esperançosamente pouco o suficiente para fazê-lo.

Finalmente, os pacotes podem ser assinados e suas assinaturas verificadas automaticamente, o que, em conexão com o banco de dados fornecido de empacotadores confiáveis, diminuirá a possibilidade de instalar pacotes perigosos de fontes não confiáveis.

O Arch Linux tem uma base de usuários relativamente pequena e instruída, o que o torna um alvo improvável de ataques baseados em pacotes maliciosos, mas isso não significa que lacunas óbvias na segurança não devam ser atendidas, especialmente quando se fala em segurança de pacotes.

## Veja também

- DeveloperWiki:Package Signing Proposal for Pacman
- Pacman Package Signing – 1: Makepkg and Repo-add
- Pacman Package Signing – 2: Pacman-key
- Pacman Package Signing – 3: Pacman
- Pacman Package Signing – 4: Arch Linux

Category:

- Package manager (Português)