RPKI: mudanças entre as edições
Sem resumo de edição |
Sem resumo de edição |
||
(13 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
{{DISPLAYTITLE:RPKI (Resource Public Key Infrastructure)}} | {{DISPLAYTITLE:RPKI (Resource Public Key Infrastructure)}} | ||
__TOC__ | __TOC__ | ||
[[Arquivo:Rpki.png|nenhum| | [[Arquivo:Rpki.png|nenhum|miniaturadaimagem|372x372px]] | ||
== Introdução == | == Introdução == | ||
Linha 23: | Linha 23: | ||
|} | |} | ||
== Instalação | == 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: | 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 | # apt install ca-certificates curl gnupg lsb-release | ||
Linha 40: | Linha 40: | ||
== Configurando sua primeira CA no 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 | 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''' | '''https://<IP>:3000''' | ||
[[Arquivo:Krill01.png|nenhum|miniaturadaimagem|1023x1023px]]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'''. | [[Arquivo:Krill01.png|nenhum|miniaturadaimagem|1023x1023px]]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 com o '''ID administrativo do AS''' para poder fazer essa configuração. | 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. | ||
[[Arquivo:Krill02.png|nenhum|miniaturadaimagem|1029x1029px]] | [[Arquivo:Krill02.png|nenhum|miniaturadaimagem|1029x1029px]] | ||
Na tela acima temos o '''Child Request''' e clicaremos no botão abaixo para copiar as instruções para o clipboard: | Na tela acima temos o '''Child Request''' e clicaremos no botão abaixo para copiar as instruções para o clipboard: | ||
Linha 54: | Linha 54: | ||
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. | 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. | ||
[[Arquivo:Krill06.png|nenhum|miniaturadaimagem|1029x1029px]] | [[Arquivo:Krill06.png|nenhum|miniaturadaimagem|1029x1029px]] | ||
Após copiar o conteúdo | Após copiar o conteúdo do '''Parent response''' do '''Registro.br''', cole na caixa de diálogo '''1''', clique em '''Confirm''' no '''2'''. | ||
[[Arquivo:Krill07.png|nenhum|miniaturadaimagem|1030x1030px]] | [[Arquivo:Krill07.png|nenhum|miniaturadaimagem|1030x1030px]] | ||
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'''. | |||
[[Arquivo:Krill08.png|nenhum|miniaturadaimagem|1031x1031px]] | |||
No '''Registro.br''' precisamos clicar em '''Configurar publicação remota''' conforme tela abaixo: | |||
[[Arquivo:Krill09.png|nenhum|miniaturadaimagem|1035x1035px]] | |||
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. | |||
[[Arquivo:Krill10.png|nenhum|miniaturadaimagem|1035x1035px]] | |||
Na sequência copiamos a resposta abaixo '''Repository response''' para o nosso krill e finalizamos a nossa configuração. | |||
[[Arquivo:Krill11.png|nenhum|miniaturadaimagem|1035x1035px]] | |||
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 | |||
[[Arquivo:Krill12.png|nenhum|miniaturadaimagem|1037x1037px]] | |||
== 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'''. | |||
[[Arquivo:Krill16.png|nenhum|miniaturadaimagem|959x959px]] | |||
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. | |||
[[Arquivo:Krill13.png|nenhum|commoldura]]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. | |||
[[Arquivo:Roa invalida.png|nenhum|miniaturadaimagem|967x967px]] | |||
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. | |||
[[Arquivo:Krill14.png|nenhum|miniaturadaimagem|966x966px]] | |||
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 || <nowiki>[[ -n "$lista" ]]</nowiki>; 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 || <nowiki>[[ -n "$lista2" ]]</nowiki>; 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 || <nowiki>[[ -n "$lista" ]]</nowiki>; 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 || <nowiki>[[ -n "$lista" ]]</nowiki>; 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''' | |||
[[Arquivo:Krill15.png|nenhum|miniaturadaimagem|1012x1012px]] | |||
== 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 [[Sobre mim|aqui]]. | |||
[[Categoria:Serviços de Redes e Servidores]] |
Edição atual tal como às 23h15min de 8 de março de 2023
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.