Como configurar o RPKI de forma simples
Resource Public Key Infrastructure (RPKI)
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.
Aqui você irá aprender a instalar o Krill e configurar no registro.br, e antes de mais nada deixo meu agradecimento aoRafael Galdino da Cunha e Diego Bernadino que me ajudaram a entender um pouco mais de RKPI.
Distribuição utilizada neste tutorial:
Debian 10 Stretch – Instalação Limpa
1 2 3 4 5 |
Hardware utilizado: - 1 CPU 2.1GHZ - 1 Gb Memória - 10 Gb Disco - Debian 10 |
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.
1 2 3 |
# su - # apt update # apt install wget gnupg2 apt-transport-https net-tools |
Adicionaremos ao repositório os pacotes da nlnetlabs, faça de acordo com sua distribuição:
Debian 10 (Mais recomendada)
1 |
# echo 'deb [arch=amd64] https://packages.nlnetlabs.nl/linux/debian/ buster main' > /etc/apt/sources.list.d/nlnetlabs.list |
Debian 9
1 |
# echo 'deb [arch=amd64] https://packages.nlnetlabs.nl/linux/debian/ stretch main' > /etc/apt/sources.list.d/nlnetlabs.list |
Debian 9
1 |
# echo 'deb [arch=amd64] https://packages.nlnetlabs.nl/linux/debian/ stretch main' > /etc/apt/sources.list.d/nlnetlabs.list |
Ubuntu 18
1 |
# echo 'deb [arch=amd64] https://packages.nlnetlabs.nl/linux/ubuntu/ bionic main' > /etc/apt/sources.list.d/nlnetlabs.list |
Ubuntu 20
1 |
# echo 'deb [arch=amd64] https://packages.nlnetlabs.nl/linux/ubuntu/ focal main' > /etc/apt/sources.list.d/nlnetlabs.list |
Importe a chave do repositório.
1 |
# wget -qO- https://packages.nlnetlabs.nl/aptkey.asc | apt-key add - |
Atualize o repositório
1 |
# apt update |
Na data de hoje (29/10/2020) o mesmo se encontra na versão 0.8.0
1 |
# apt search krill |
Instale o krill
1 |
# apt install krill |
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.
1 |
# 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)
1 |
# vim /etc/krill.conf |
Adicione como no print:
1 |
ip = "0.0.0.0" |
Por padrão o mesmo não vem habilitado na inicialização, para isso vamos habilita-lo.
1 |
# systemctl enable krill |
Agora inicie o serviço
1 |
# systemctl start krill |
Verifique se o mesmo está rodando sem nenhum erro.
1 |
# systemctl status krill |
Com o comando netstat você pode se certificar que agora o krill está aberto para qualquer IP “0.0.0.0”
1 |
# 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:
1 |
# cat /etc/krill.conf |grep auth_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.
Será direcionado para aba ROAs. Clique em Click Here to refresh/Clique aqui para atualizar.
Você verá seus prefixos anunciados
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 Looking Glass da G8 e da Telia que fazem validação do RPKI, mas tenha paciência, aguarde pelo menos 1 hora antes de arrancar os cabelos se não validar.
Temos o site que é bem legal também: https://rpki-validator.ripe.net/
Não podemos esquecer o firewall, usarei o nftables
Instale e ative-o para iniciar com o sistema.
1 2 |
# apt install nftables # systemctl enable nftables |
Edite as regras
1 |
# 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/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
1 |
# systemctl restart nftables |
Verificar as regras:
1 |
# 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)
1 |
# krillc add --token seutoken --ca NOME_CA |
Ex:
1 |
# 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
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/
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