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/

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

40 Resultados

  1. Fernando disse:

    Boa tarde, gostaria de saber como funciona a manutenção após o vencimentos das chaves!

    Atenciosamente

    Fernando Reis

  2. Fábio Oliveira disse:

    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 ?

  3. André disse:

    É possivel ter 2 servidores RPKI? Para caso der falha em um, daí consigo registrar dois no mesmo provedor??

  4. Victor Alexandre disse:

    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

    • Lucas Alves disse:

      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

  5. Jocelio Almeida disse:

    E como o registro br sabe qual é o IP do servidor? fica ciptrografado na chave?

  6. Alex disse:

    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?

  7. Lucas disse:

    Boa tarde, o firewall e só pra questão de acessos não implica nas consultas do registro br?

  8. Allan disse:

    Boa Noite, Conseguiram rodar no Rocky Linux ? instalei tudo certo mais nao consigo acessar a WEB.

  9. Lucas disse:

    Uma duvida na parte Repository como faço pra atualizar a publicação remota

  10. junior maia disse:

    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

  11. Reginaldo Aparecido Inácio da Silva disse:

    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?

  12. Reginaldo Aparecido Inácio da Silva disse:

    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?

  13. 0p3ns0urc3 disse:

    Segui os passos instalando em ubuntu-server 22.04 também funcionou algumas pequenas detalhes mas no geral deu certo, parabéns tutorial show

  14. Raphael Pontara disse:

    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.

  15. Matheus disse:

    Primeiramente obrigado pelo ótimo tutorial, algum problema de eu cadastrar meus /24 um por um do meu /21 ?

  16. Almir disse:

    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 ?

  17. Cristian Cardoso disse:

    Valeu pela postagem, me ajudou bastante na ativação do RPKI, a única diferença é que fiz no FreeBSD.

  18. 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

    • Arthur Bernardes disse:

      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

  19. stefano esmeris disse:

    este tutorial é muito bom. é sem duvida muito melhor e mais objetivo do que as documentações “oficiais” do NIC.BR
    Parabens!

  20. Jefferson Rodrigues disse:

    Tenho o Juniper, tenho que enviar alguma coisa para a operadora? informando sobre isso?

  21. Wagner Bento da Costa Junior disse:

    Parabéns pelo Tutorial.
    Qualidade 10000!!

  22. Diogo disse:

    Boa tarde, Parabéns. Próximo tutorial poderia ser de um validador, por exemplo o Routinator. hehehe! Show de bola.

  23. Ricardo Costa disse:

    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.

  24. Diogo disse:

    Tutorial de excelência, assim como todos os outros. Parabéns.

  25. David disse:

    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.

  26. Leandro disse:

    Excelente. Parabéns demais

  1. 23 de julho de 2021

    […] Como configurar o RPKI de forma simples […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *