Como configurar o RPKI de forma simples, instalação do Krill
RPKI é a especificação de uma tecnologia discutida e proposta pelo IETF (Internet Engeenering Task Force), RFC 6480, que permite a validação de anúncios de rotas via protocolo BGP.
Essa tecnologia faz uso de Certificados Digitais (PKI), e de uma cadeia de certificação para validar a alocação de um conjunto de Recursos de Numeração Internet feita por um RIR/NIR a uma organização.
Um dos objetos a ser assinado com a referida chave privada se chama ROA (Route Origin Authorization), e que contém uma lista de blocos IPv4 e/ou IPv6 e um ASN que está autorizado a originar rotas para os referidos blocos.
As ROAs são então publicadas em repositórios e poderão ser utilizadas para validar que uma determinada rota para um bloco IP, recebida através do protocolo BGP, está sendo originada pelo ASN autorizado pelo detentor da alocação do bloco IP em questão.
Dessa forma cria-se um mecanismo para evitar uso indevido de blocos de endereços IP ou “sequestros”, que é quando através de um ASN se origina rotas para blocos IP alocados para outras organizações que não aquela responsável pelo ASN.
Vídeo recomendado que pode lhe ajudar esclarecer a importância do RPKI.
RPKI: Uma proteção para roubo de prefixos no BGP
Está instalação tem como base o projeto Krill. Krill é um daemon de Resource RPKI, apresentando uma Autoridade de Certificação (CA) e um servidor de publicação, escrito em Rust.
Distribuição recomendada:
Instalação do Debian 12 Bookworm limpa passo-a-passo
A base desta instalação foi com informações na documentação oficial.
Não esqueça de virar root da forma correta e atualizar os pacotes, e instalar alguns pacotes que serão necessários.
# su - # apt update # apt install curl wget gnupg2 apt-transport-https net-tools ca-certificates lsb-release
Adicionaremos ao repositório Debian para os pacotes da nlnetlabs:
Importe a chave do repositório.
# 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
Atualize o repositório
# apt update
Instale o krill
# apt install krill krillup krillta
Após a instalação será criado no sistema um usuário chamado krill que é dono do diretório /var/lib/krill/ (que até o momento não existe nada nele).
Por segurança criaremos um backp original do krill.conf o arquivo de configuração.
# cp /etc/krill.conf /etc/krill.conf.orig
Por padrão o krill roda em localhost porta 3000. Mas para nós acessar posteriormente sua interface web (lagosta) será necessário ter acesso a mesma, tornado aberta para todos. (Veremos também como aplicar um firewall, para não deixar acessível à todos)
# vim /etc/krill.conf
Adicione como no print:
ip = "0.0.0.0"
Por padrão o mesmo não vem habilitado na inicialização, para isso vamos habilita-lo.
# systemctl enable krill
Agora inicie o serviço
# systemctl start krill
Verifique se o mesmo está rodando sem nenhum erro.
# systemctl status krill
Com o comando netstat você pode se certificar que agora o krill está aberto para qualquer IP “0.0.0.0”
# netstat -putan |grep krill
Tudo certo até aqui, será necessário pegarmos o Token que ele gerou na instalação, ele se encontra no arquivo /etc/krill.conf, para pega-ló pode executar este comando:
# cat /etc/krill.conf |grep "token =" | cut -d'"' -s -f 2
Neste caso meu token é 38d8ffbe35eaa2391b01681662037600, salve isso com 7 chaves!
E a instalação é só isso! 🙂
Agora basta acessar em seu navegador https://IP:3000 e nos depararemos com interface web do krill “lagosta”. (User o Firefox) É necessário aceitar o certificado inválido.
Informe o seu token em senha, no meu ex.: “38d8ffbe35eaa2391b01681662037600”
Ao entrar pela primera vez será necessário informar um nome de autoridade, adotarei como nome “meu AS”
Hora de acessarmos nossa conta no Registro.br
Clique em titularidade, em seguida “1 ASN”
Role a página ate o final e clique em Configurar RPKI
Volte a tela do Krill, e clique em Parents e copie o conteúdo do Child Request
Retorne ao Registro.BR e cole o conteúdo no campo Child Request e Habilitar RPKI
Copie o conteúdo do Parent Response que o RegistroBR gerou
Cole o mesmo no Krill campo Parent Response e clique em confirmar.
Deve retornar uma mensagem de sucesso.
Você será já direcionado para o Repository, então copie a Publisher Request
Vá ao registroBR e logo a baixo de parent response clique em Configurar publicação remota irá abrir um campo Publisher Request, agora cole e clique em Habilitar Publicação Remota
Role um pouco a paixa para baixo e veja que temos agora o Repository Response copie o mesmo e volte ao Krill
Cole no campo Repository Response e clique em Confirmar
Novamente deve retornar uma mensagem de sucesso.
Clique em ROAs. Você verá seus prefixos anunciados. (Se não aparecer atualize a página, pode levar uns minutos)
Agora precisamos adicionar nossos ROAs, clique em Add ROA/Adicionar ROA
Adicione todos seus prefixos
ROAs adicionados com sucesso! Nosso RPKI está finalizado!
Para validar você pode acessar os Routinator da ripe.net (ou crie o seu), mas tenha paciência, aguarde pelo menos 1 hora antes de arrancar os cabelos se não validar. https://rpki-validator.ripe.net/
Não podemos esquecer o firewall, usarei o nftables
Instale e ative-o para iniciar com o sistema. (No Debian 11 nftables já é o subistituto do iptables, não é necessários instalar, mas é necessário dar um enable)
# apt install nftables # systemctl enable nftables
Edite as regras
# vim /etc/nftables.conf
Neste exemplo eu acessível apenas deixo apenas aberto para 200.200.200.0/22 e 192.168.0.0/24
#!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority 0; # Krill ip saddr 127.0.0.1 tcp dport 3000 counter accept ip6 saddr ::1 tcp dport 3000 counter accept ip saddr 192.168.0.0/24 tcp dport 3000 counter accept ip saddr 200.200.200.0/22 tcp dport 3000 counter accept # Drop tcp dport 3000 counter drop } chain forward { type filter hook forward priority 0; } chain output { type filter hook output priority 0; } }
Reinicie o serviço
# systemctl restart nftables
Verificar as regras:
# nft list ruleset
Backup
Não esqueça de colocar o diretório em suas políticas de backups: /var/lib/krill/. Uma dica é o tutorial: Criando backups de forma simples e enviando para o Telegram ou servidor via SSH
Bônus – Múltiplos CA
Se quiser hospedar as CA de outros provedores ou é responsável por mais de um AS, basta adicionar nova CA pelo cliente do terminal, e assim será possível gerenciar pela interface web (lagosta)
# krillc add --token seutoken --ca NOME_CA
Ex:
# krillc add --token 38d8ffbe35eaa2391b01681662037600 --ca AS4321
Deixou meu agradecimento ao amigo @GlauberMattar por essa dica.
Monitoramento
Template Zabbix 5 e 4.4 para monitorar se a porta 3000 está respondendo. RR Krill Zabbix 5 / RR Krill Zabbix 4.4
Leitura recomendada:
Instalação do Routinator 3000, um software para validação RPKI
Erros:
Verifique se a hora do servidor está correta!
# apt install ntpdate # ntpdate a.ntp.br
Se desejar garantir coloque no cron para acertar a hora todos dia a meia noite, ex:
# cronta -e
Adicione
# m h dom mon dow command 00 00 * * * ntpdate a.ntp.br
Curtiu o conteúdo? Quer me ajudar manter essa p*** ? 🙂
Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!
Participe do canal no telegram para ficar atualizado sempre que publicar um novo tutorial.
Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.
Abraço!
Fontes:
https://github.com/NLnetLabs/krill
https://rpki.readthedocs.io/en/latest/krill/get-started.html
https://registro.br/tecnologia/numeracao/rpki/
Boa tarde, gostaria de saber como funciona a manutenção após o vencimentos das chaves!
Atenciosamente
Fernando Reis
Bom dia!
Em relação ao firewall, devemos realmente limitar o acesso ao sistema somente para nossos endereços, isso não irá impedir a comunicação do sistema em relação ao checagem dos prefixos ou ao do tipo, externo ?
É possivel ter 2 servidores RPKI? Para caso der falha em um, daí consigo registrar dois no mesmo provedor??
Eu tive uma indisponibilidade de dois dias no meu servidor Krill, então o Registro BR desabilitou meu RPKI.
Ao retornar o servidor, refiz todo o processo de troca de chaves e nunca mais funcionou.
No Registro BR fica o status de ” Pendência na finalização da configuração RPKI (parent/repository response).” e minhas ROA não aparecem
infelizmente eu so consegui resolver utilizando a documentação do nic + tutorial do remontti + documentação oficial. ficou faltando alguns pacotes que tem somente na documentação do nic e oficial
E como o registro br sabe qual é o IP do servidor? fica ciptrografado na chave?
Pessoal! Todos os dias meu KRILL está ficando desatualizado. Preciso reiniciar o serviço, Atualizar Parents e Atualizar Repositório para voltar. Do nada começou isso depois de muito tempo funcionando. Está atualizado krill para 0.14.4. Alguém passou por isso?
Estou com o mesmo problema, já atualizei, reinstalei, aumentei memória, percebi que ao fazer inreboot na VM inteira ele fica mais tempo sem dar o problema, neste momento ajustei o ntp para manter o horário correto mas percebi que no status dos anúncios lá na interface gráfica fica uma diferente 2 horas na atualização, alguma novidade em relação a isso?
Boa tarde, o firewall e só pra questão de acessos não implica nas consultas do registro br?
também não ficou claro pra mi m
Boa Noite, Conseguiram rodar no Rocky Linux ? instalei tudo certo mais nao consigo acessar a WEB.
Uma duvida na parte Repository como faço pra atualizar a publicação remota
rudimar , fiz tudo conforme tutorial e tudo rodando 100 % porem , nao consigo nem por milagre , monitorar a porta 3000 , pelo zabbix o serviço simplismente informa que nao tem acesso , neste caso eu preciso instalar o agent no servidor ? , da uma luz por favor obrigado
Deu esse erro no meu krill, “Failed to update BGP announcements: BGP RIS update error: Cannot get uri: request or response body error: error reading a body from connection: end of file before message length reached”, mas não estou achando como resolver.
Sabem como posso proceder?
Excelente tutorial como sempre! Uma duvida, de vez em quando o serviço para e tenho que startar manualmente, comportamento comum ou há algum problema? E sobre o zabbix sabe se tem o template pra versão 6?
O mesmo template é possível importar. Coloque no cron um restart no krill todo o dia pode resolver, aqui tenho feito isso.
Segui os passos instalando em ubuntu-server 22.04 também funcionou algumas pequenas detalhes mas no geral deu certo, parabéns tutorial show
Fala Rudimar! Beleza?
Eu segui o teu tutorial e deu super certo. Não tem como errar. Parabéns!
Adicionalmente, eu busquei opções de adicionar um certificado para o domínio que eu criei para acessar o Lagosta, bem como proteger de acesso externo.
Seguindo o tutorial do APNIC (https://blog.apnic.net/2021/02/09/how-to-run-krill-behind-an-nginx-reverse-proxy/), me veio a ideia de limitar o acesso através do próprio NGINX, adicionando a instrução “allow 203.0.113.0/24” e “deny all” ao escopo de configuração.
Escolhi essa técnica pois, já que eu precisaria do nginx como proxy para implementar certificado https para criptografar a comunicação (e ficar mais bonitinho rsrs), eu não precisaria instalar um firewall para tal.
Forte abraço e parabéns mais uma vez pela dedicação em manter esta super fonte de conhecimento que é o teu Blog.
dá para proteger via tcp wrappers tbm
Primeiramente obrigado pelo ótimo tutorial, algum problema de eu cadastrar meus /24 um por um do meu /21 ?
Excelente, eu fiquei apenas em uma dúvida no momento da configuração ficou faltando apenas eu anunciar apenas um /24. Porém quando eu fui checar no Krill ele não achou. Como eu poderia adicionar esse /24 que ficou faltando ?
Me manda lá no telegram @remontti um print que não ficou muito claro pra mim.
Valeu pela postagem, me ajudou bastante na ativação do RPKI, a única diferença é que fiz no FreeBSD.
Valeu pelo café! 🙂
Parabéns mestre, tutorial mastigadinho!! Perfeito !!
PS: cat /etc/krill.conf |grep auth_token | cut -d'”‘ -s -f 2 mudou para cat /etc/krill.conf |grep admin_token | cut -d'”‘ -s -f 2
na versão atual em 09-06-2021
Obrigado!
Obrigado, Ricardo. Eu até achei que eu havia feito errado e decidi compilar ele ao invés de usar a instalação pelo repositório. Na instalação pelo código fonte, ainda mantém o “auth_token”, não sei porquê na versão dos repositórios isso foi alterado.
Segue a versão que estou usando abaixo:
root@krill:~# krill –version
Krill 0.9.0
este tutorial é muito bom. é sem duvida muito melhor e mais objetivo do que as documentações “oficiais” do NIC.BR
Parabens!
🙂
Tenho o Juniper, tenho que enviar alguma coisa para a operadora? informando sobre isso?
Parabéns pelo Tutorial.
Qualidade 10000!!
Boa tarde, Parabéns. Próximo tutorial poderia ser de um validador, por exemplo o Routinator. hehehe! Show de bola.
Boa tarde, tenho uma duvida, no meu provedor uso Mikrotik, nele já consigo implementar RPKI?
Não, mas a princípio na versão 7 acredito que irá ter suporte pelo que podemos ver na versão beta. Mas é importante que vc configure seu RPKI mesmo que vc não tenha um roteador para aplicar filtros. Grandes operadoras já estão filtrando e “dando melhores rotas” vamos dizer assim para quem possui seu AS/Prefixos assinados com RPKI.
Entendi, muito obrigado
Tutorial de excelência, assim como todos os outros. Parabéns.
Primeiramente Parabéns e obrigado pelo post.Na lista de permissões de endereços , quais endereços eu devo permitir ? vc postou uma classe lá 200.200.x no seu diagrama de rede à quem pertenceria esses endereços , tomando como base esse post que vc fez.
Blocos/Prefixos do seu ASN
Excelente. Parabéns demais