RPKI (Resource Public Key Infrastructure)

De ISPUP!
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.

Quando você anuncia um prefixo fora do escopo da ROA você verá essa informação no seu krill. Abaixo uma tela de exemplo com um prefixo inválido IPv6 sendo anunciado. O escopo previa o anúncio de até um /48 mas o ISP acabou anunciando um /60.


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/

Seu router se conectará ao Routinator via RtR e fará a validação de todo prefixo que ele receber dos trânsitos IPs e onde você configurar para que seja feito a validação.

As ROAs são validadas e classificadas pelo RtR como:

  • Válidas.
  • Inválidas.
  • Desconhecidas.

Na configuração do seu router só descarte os prefixos inválidos e aceite o restante.

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.