RPKI (Resource Public Key Infrastructure)

De ISPUP!
Revisão de 20h53min de 4 de março de 2023 por Gondim (discussão | contribs)
Ir para navegação Ir para pesquisar

Introdução

É uma tecnologia discutida e proposta pelo IETF (Internet Engeenering Task Force), definida na RFC6480 e que serve para validar anúncios de rotas recebidas através do protocolo BGP. O RPKI pode ser separado em duas partes independentes: a parte que faz os anúncios das ROAs (Route Origin Authorization) e a parte que faz a validação das ROAs através do protocolo RtR (RPKI to Router). Esta última requer que o equipamento possua suporte a esse protocolo para funcionar. Juniper, Cisco, Huawei e até FRR possuem suporte a RtR. Os softwares utilizados e recomendados pelo NIC.br para o RPKI são: Krill e Routinator, ambos desenvolvidos pela NLNET Labs, a mesma empresa que desenvolve o Unbound e o NSD.

Um servidor virtualizado e com pouco recurso, pode hospedar tanto o Krill quanto o Routinator não só para atender um ASN, mas para diversos. Mais informações sobre RPKI podem ser encontradas aqui: https://registro.br/tecnologia/numeracao/rpki/

Requisitos

Embora não seja obrigatório você pode instalar no mesmo sistema o seu krill e o routinator. O krill não necessita de acesso entrante vindo da Internet e por isso pode estar atrás de qualquer NAT, que irá funcionar e o routinator também pode estar com um IP privado para se comunicar com o seu router de borda e fazer as validações das ROAs. Nesse artigo vamos usar o mesmo sistema para ambos e como de costume usaremos nosso querido Debian. Quem ainda não viu esse artigo sobre Template de Servidor Debian GNU/Linux dê uma olhada antes de começar, que pode ser interessante. Vamos precisar para o nosso sistema:

CPU Memória Disco Sistema
2.4Ghz 4 cores 2G 30G Debian 11 amd64

Instalação do Krill

Existem alguns pacotes que precisamos instalar além do repositório oficial do RPKI para o Debian. Então façamos conforme abaixo:

# apt install ca-certificates curl gnupg lsb-release
# curl -fsSL https://packages.nlnetlabs.nl/aptkey.asc | gpg --dearmor -o /usr/share/keyrings/nlnetlabs-archive-keyring.gpg
# echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/nlnetlabs-archive-keyring.gpg] https://packages.nlnetlabs.nl/linux/debian $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/nlnetlabs.list > /dev/null
# apt update
# apt install krill

Vamos adicionar dentro de /etc/krill.conf a variável abaixo:

ip = "0.0.0.0"

Dentro deste mesmo arquivo de configuração, será gerado durante a instalação um token e é com ele que faremos todas as nossas configurações e acesso à interface web do krill. Você pode facilmente descobrir o seu token olhando o arquivo ou fazendo isso na linha de comando:

# grep admin_token /etc/krill.conf
admin_token = "bd7b942dxxxxxxxxxxxxxxx69f2194ed"
#   "admin-token"    admin_token  role = "admin"  id = "admin-token"

Reinicie o processo do krill:

# systemctl restart krill

Configurando sua primeira CA no Krill

Quando instalamos o krill precisamos configurar nossa primeira CA (Certificate Authority) que na maioria dos casos será apenas uma, mas se você tiver fazendo a gerência de outros ASNs em diferentes CNPJ(s), pode ser necessário criar mais de uma CA e mostrarei depois como fazê-lo. Como exemplo você vai acessar a interface web assim:

https://<IP>:3000

Na caixa de diálogo você entrará com o nome da CA, por exemplo vou entrar com o nome: ISPUP e clicar em Create CA.

Após criar o CA, o primeiro item que vamos configurar será o Parents com o Registro.br e nesse caso você precisará acessar o Registro.br com o ID administrativo do AS para poder fazer essa configuração.

Na tela acima temos o Child Request e clicaremos no botão abaixo para copiar as instruções para o clipboard:

Enquanto isso lá no Registro.br precisamos ir nas configurações do ASN e acessar as configurações do RPKI:

Aquele Child Request que você copiou no krill, vai colar ele na caixa de diálogo abaixo em 1 e clicar em 2 para habilitar o RPKI.

Na sequência você vai copiar todo o conteúdo abaixo em 1 de Parent response no Registro.br, para o nosso krill, na próxima tela.

Após copiar o conteúdo do Parent response do Registro.br, cole na caixa de diálogo 1, clique em Confirm no 2.

Feito a configuração do Parents, faremos a configuração para que você possa fazer a publicação das suas ROAs no Registro.br. Para isso vamos na aba do krill chamada de Repository e faremos o mesmo processo que fizemos no Parents. Vamos copiar para o Registro.br o item 1 (Publisher Request) e depois colar a reposta do Registro.br (Repository response), na caixa de diálogo 2 e por fim confirmar em 3.

No Registro.br precisamos clicar em Configurar publicação remota conforme tela abaixo:

Como podemos ver abaixo, é só seguir o mesmo processo que fizemos com o Parents. Colamos o Publisher request na caixa de diálogo 1 e clicamos em 2 para habilitar a publicação remota.

Na sequência copiamos a resposta abaixo Repository response para o nosso krill e finalizamos a nossa configuração.

Após toda a configuração no Registro.br se você voltar na configuração do RPKI encontrará uma mensagem assim para confirmar que está tudo OK

Configurando as ROAs

Depois que completar o processo acima, voltaremos no nosso krill mas agora na aba ROAs. Precisamos aguardar os recursos serem liberados e aparecerem nessa tela. Temos que ter muito cuidado ao criar uma ROA porque se dissermos uma coisa e anunciarmos outra, isso pode invalidar nosso prefixo e ele será descartado em diversos routers pela Internet, te causando uma indisponibilidade de acesso.

Um exemplo se você cadastrar uma ROA informando apenas o prefixo 198.18.0.0/22 e fizer anúncios como: 198.18.0.0/23, 198.18.0.0/24, esse dois últimos serão vistos como anúncios inválidos porque não existe uma ROA que inclua eles. Nesse caso você deveria criar uma ROA assim: 198.18.0.0/22-24 onde você está dizendo que terá anúncios de /22 até prefixos mais específicos como os /24.

Quando for adicionar uma ROA aparecerá uma janela conforme abaixo e nosso exemplo acima ficaria assim. Em 1 temos o nosso ASN, em 2 o prefixo cheio e em 3 o máximo de tamanho que iremos anunciar. Nesse caso todos até os /24, ou seja, o /22, os 2 /23 e os 4 /24 deste prefixo. Na dúvida não configure de qualquer jeito, procure um profissional. Porque isso pode realmente parar a sua Operação de Internet, se for feito errado e gerar prefixos inválidos.

A propagação das suas ROAs pode levar algumas horas então não fique apreensivo. Eu costumo consultar no HE por exemplo: https://bgp.he.net/AS22548#_prefixes

Nesse caso peguei o AS22548 do Nic.br. Repare que no prefixo abaixo tem uma chave verde do lado. Isso quer dizer que esse prefixo é válido e tem uma ROA para ele.

Se seus contatos no Registro.br estiverem certos, qualquer problema que ocorra com o seu krill e ele parar de anunciar as ROAs, você receberá um e-mail informando sobre o problema e solicitando que esteja resolvido. Caso não seja resolvido em um tempo hábil, sua configuração de RPKI no Registro.br será desfeita e você precisará repetir todo o processo novamente.

Adicionando novas CAs ao Krill

Infelizmente a interface web do Krill não te permite adicionar outras CAs para gerenciamento, caso você tenha outras empresas ou esteja administrando o RPKI de seus clientes. Mas você pode adicioná-las via linha de comando no shell, usando seu token e após incluir as CAs, elas aparecerão na interface web para você fazer o mesmo procedimento no Registro.br. O comando é esse:

# krillc add --token <seutoken> --ca NOME_CA

Cuidados com o Krill

Infelizmente já passei por alguns problemas com o Krill como por exemplo: algo corromper seus dados e o serviço não subir mais ou ter que refazer alguns procedimentos para subir novamente o sistema. De todos o pior problema é quando trabalhamos com muitos ASNs e com diversos prefixos; perder suas ROAs e ter que refazê-las dá um certo trabalho. Então costumo fazer 2 tipos de backup:

  • Backup dos dados do Krill que ficam em /var/lib/krill mais o /etc/krill.conf.
  • Backup somente das ROAs.

Na pior das hipóteses, quando tudo der errado e não conseguir resolver o problema, tenho certeza que o backup das ROAs será mais que tranquilizador e só precisará refazer as configurações com o Registro.br.

Antes de atualizar seu Krill faça uma cópia dos dados assim:

# cp -av /var/lib/krill/data /var/lib/krill/data_`date +%Y%m%d`

Cheque a versão que você está usando:

# dpkg -l|grep krill
ii  krill                             0.12.2-1bullseye                      amd64        Resource Public Key Infrastructure (RPKI) daemon

Se der algum problema você pode voltar a cópia dos dados do krill e voltar a versão anterior assim:

# apt install krill=0.12.2-1bullseye

Porque estou dizendo isso? Se a atualização do Krill fizer modificações em /var/lib/krill/data e normalmente faz, essas modificações não serão compatíveis com a versão anterior. Por isso fazemos um backup dos dados antes de atualizar o binário.

Na prática o backup do Krill seria apenas fazer uma cópia do que falei acima para um outro sistema.

Backup das ROAs

Como comentei fazer um backup e retore das ROAs é um processo bem simples e criei scripts para isso. Vamos começar com o script de backup. Nesse caso você pode dar o nome que quiser e colocar onde quiser o meu exemplo está assim /root/scripts/backup_roa.sh

#!/bin/bash
# Script de backup de ROAs do RPKI para uso em producao
# Eh uma contribuicao e nao me responsabilizo por quaisquer danos causados
# pelo uso desse script.
# Autor: Marcelo Gondim - gondim at gmail.com
# Data: 13/02/2023
# Versao: 1.0
#
# backup_roa.sh is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
DIR_BACKUP="/root/backup_roa"
TOKEN=""
 
mkdir -p "$DIR_BACKUP"
echo -e "Criando lista de CAs do RPKI em $DIR_BACKUP"
krillc list --token $TOKEN | grep -v "#" |awk 'NF>0' > /$DIR_BACKUP/CA.lista
echo -e "Lendo a lista de CAs e gerando o backup das ROAs em $DIR_BACKUP"
while IFS= read -r lista || [[ -n "$lista" ]]; do
   krillc roas list --token $TOKEN --ca $lista | grep -v "#" |awk 'NF>0' > /tmp/ROA_$lista.lista
   >/$DIR_BACKUP/ROA_$lista.backup
   while IFS= read -r lista2 || [[ -n "$lista2" ]]; do
      echo -e "A: $lista2" >> /$DIR_BACKUP/ROA_$lista.backup
   done < /tmp/ROA_$lista.lista
   rm /tmp/ROA_$lista.lista
done < /$DIR_BACKUP/CA.lista

No script acima configuramos apenas 2 variáveis DIR_BACKUP e o TOKEN. A primeira é onde vamos armazenar o nosso backup e não precisa se preocupar que ele mesmo criará o diretório, se não existir. A segunda é o token do krill, que já vimos no início do artigo.

Ao executar o script será gerado isso:

# ls -l /root/backup_roa
total 12
-rw-r--r-- 1 root root   17 mar  4 00:00 CA.lista
-rw-r--r-- 1 root root  123 mar  4 00:00 ROA_ISPUP.backup
-rw-r--r-- 1 root root 1968 mar  4 08:00 ROA_ISPNET.backup

Dentro do CA.lista vão ter a lista de CAs do seu Krill. Por exemplo:

# cat CA.lista
ISPUP
ISPNET

Nos outros arquivos terão as ROAs de cada um por exemplo:

# cat ROA_ISPUP.backup
A: 198.18.0.0/22-24 => 65534

Isso mesmo, é um arquivo texto com todas as ROAs que apontam para o ASN e o "A:" no início da linha, é a instrução de append para adicionar no RPKI.

Restaurando o Krill

Caso você precise refazer todo o seu RPKI e instalar seu krill do zero, instale o Krill novamente e use o script /root/scripts/recria_ca.sh, que está abaixo, para recriar as CAs novamente:

#!/bin/bash
# Script que recria as CAs do seu krill para uso em producao
# Eh uma contribuicao e nao me responsabilizo por quaisquer danos causados
# pelo uso desse script.
# Autor: Marcelo Gondim - gondim at gmail.com
# Data: 13/02/2023
# Versao: 1.0
#
# recria_ca.sh is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
DIR_BACKUP="/root/backup_roa"
TOKEN=""
echo -e "Lendo lista de CAs do backup do RPKI"
while IFS= read -r lista || [[ -n "$lista" ]]; do
   krillc add --token $TOKEN --ca $lista
done < /$DIR_BACKUP/CA.lista

Vai precisar configurar as mesmas variáveis DIR_BACKUP e TOKEN. Esse script vai apenas ler o arquivo CA.lista e recriar todas as suas CAs. Após a criação das CAs você precisará refazer as configurações de cada uma no Registro.br e por último rodar o próximo script de restauração das ROAs.

Restauração das ROAs

Para restaurar todas as suas ROAs de volta fiz esse outro script /root/scripts/restore_roa.sh que lê o seu backup e recria todas as suas ROAs de volta, de cada CA que você tiver. Também precisa configurar nele as variáveis DIR_BACKUP e TOKEN.

#!/bin/bash
# Script de restore de ROAs do RPKI para uso em producao
# Eh uma contribuicao e nao me responsabilizo por quaisquer danos causados
# pelo uso desse script.
# Autor: Marcelo Gondim - gondim at gmail.com
# Data: 13/02/2023
# Versao: 1.0
#
# restore_roa.sh is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
DIR_BACKUP="/root/backup_roa"
TOKEN=""
echo -e "Lendo lista de CAs do backup do RPKI"
while IFS= read -r lista || [[ -n "$lista" ]]; do
   krillc roas update --delta /$DIR_BACKUP/ROA_$lista.backup --token $TOKEN --ca $lista
done < /$DIR_BACKUP/CA.lista

Instalação do Routinator

O Routinator será a nossa base de dados de validação das ROAs em nossos equipamentos de borda. A instalação dele é muito simples e o processo inicial de configuração do repositório já fizemos, que é o mesmo do krill. Só relembrando que você só conseguirá usar o Routinator se o seu equipamento suportar o protocolo RtR e infelizmente Mikrotik RouterOS 6.x não suporta.

# apt install routinator

Vamos modoficar o arquivo /etc/routinator/routinator.conf e deixá-lo assim:

repository-dir = "/var/lib/routinator/rpki-cache"
#rtr-listen = ["127.0.0.1:3323"]
#http-listen = ["127.0.0.1:8323"]
rtr-listen = ["[::]:3323"]
http-listen = ["[::]:8323"]
# systemctl restart routinator

A porta padrão usada no RtR é a 3323/TCP. Não esqueça de colocar um filtro de pacotes liberando esse acesso apenas para o seu router consultar. A outra porta 8323/TCP é uma interface web de consulta do Routinator e pode ser acessada assim:

http://<IP>:8323

Habilitando a validação das ROAs no router

Essa parte da configuração é muito dependente do equipamento/fabricante e por isso deixo esse link como fonte de consulta: https://bgpfilterguide.nlnog.net/guides/reject_invalids/

Finalizando

Implementar o RPKI em sua Operação de Internet não é difícil e aumenta a segurança de roteamento na Internet. Está incluso na 4ª ação do MANRS junto com o IRR e ajuda a evitar Hijacks acidentais, que podem causar indisponibilidade de acesso à Internet. Mas precisa ter atenção para não causar prefixos inválidos.

Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos aqui.