Protegendo seu ASN com RPKI
Neste artigo iremos mostrar quais os passos necessários para criar ROAs (Route Origin Authorisation) dos prefixos de seu ASN.
Antes de mais nada, deem uma lida nesse artigo: https://wiki.brasilpeeringforum.org/w/Redes_que_descartam_RPKI_Invalidos
Antes de começarmos, se você leu o artigo que deixei o link, você deve ter entendido que todo AS que ainda não criou ROAs de seus prefixos ou ainda não criou o CA para seu ASN, seus prefixos são conhecidos na internet como "unknown" ou "desconhecidos" e com isso seus prefixos ainda serão roteados pela internet, então não se preocupe com isso, esse artigo vai apenas ensinar a você deixar seus prefixos como "valid".
Quero também enfatizar que RPKI é algo muito importante e devemos tomar cuidado com o que fazemos, sempre que fizermos qualquer alteração em algum ROA, verifique se está correto para não ter problemas, pois, redes que descartam RPKIs inválidos podem parar de rotear seus prefixos que erradamente você não autorizou e pode gerar dor de cabeça (ex.: intermitência ou perda total de comunicação com redes que dropam RPKI inválido), por isso, antes de continuar tenha certeza que vai cuidar direitinho do seus ROAs. PAZ!
Neste artigo será utilizado o Krill para ativarmos o RPKI no seu ASN.
Instalação
Instalação e Configuração do Krill.
Primeiramente você precisa de uma máquina virtual rodando linux Debian ou Ubuntu, com isso iremos prosseguir para os passos de instalação:
Instalando as dependências para compilar o Krill:
apt install build-essential libssl-dev openssl pkg-config curl
Agora vamos criar uma pasta para instalar e rodar o Krill:
mkdir -p /opt/krill/ cd /opt/krill touch krill.conf
Agora vamos compilar/instalar o Krill, logo no primeiro comando ele irá fazer uma pergunta, apenas aperte ENTER e siga para os próximos comandos:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.cargo/env cargo install krill
Execute o seguinte comando: krill -V
e se o resultado for algo assim: Krill 0.6.2
o Krill foi instalado com sucesso.
Caso de algum erro, faça os seguintes comandos e tente novamente:
ln -s /root/.cargo/bin/krill /usr/bin ln -s /root/.cargo/bin/krillc /usr/bin
Vamos agora criar a config inicial do Krill, e criar uma senha/token seguro para o Krill, copie todas as linhas e cole no terminal:
cat <<\EOF >/opt/krill/krill.conf ip = "0.0.0.0" port = 3000 auth_token = "ColoqueAquiSeuTokenSenhaSeguro" EOF
Configuração
Enfim, nosso Krill já está pronto para ser usado, antes precisamos iniciar o daemon do Krill, mas ainda, infelizmente o Krill não vem com script para iniciar e parar, a NTLabs disponibilizou dois scripts que podemos usar para iniciar e parar o daemon:
Para iniciar (copiar todas as linhas abaixo e colar no terminal do seu Linux):
cat <<\EOF >/usr/bin/krill_start #!/bin/bash KRILL="krill" DATA_DIR="/opt/krill" KRILL_PID="$DATA_DIR/krill.pid" CONF="$DATA_DIR/krill.conf" SCRIPT_OUT="$DATA_DIR/krill.log" nohup $KRILL -c $CONF >$SCRIPT_OUT 2>&1 & echo $! > $KRILL_PID EOF chmod +x /usr/bin/krill_start
Para parar (copiar todas as linhas abaixo e colar no terminal do seu Linux):
cat <<\EOF >/usr/bin/krill_stop #!/bin/bash DATA_DIR="/opt/krill" KRILL_PID="$DATA_DIR/krill.pid" kill `cat $KRILL_PID` EOF chmod +x /usr/bin/krill_stop
Agora temos 2 novos comandos no terminal do linux krill_start
e krill_stop
Então iniciemos o daemon do Krill com o comando krill_start
direto no seu terminal, pronto, agora temos o daemon do Krill rodando e já podemos criar nossos ROAs.
Habilitando RPKI e Autorizando os ROAs
Vamos então criar nosso CA utilizando o cliente do Krill:
krillc add --server https://localhost:3000/ --token ColoqueAquiSeuTokenSenhaSeguro --ca MEU_CA
Vamos criar agora nosso child_request:
krillc parents request --server https://localhost:3000/ --token ColoqueAquiSeuTokenSenhaSeguro --ca MEU_CA
Esse último comando gerou um XML chamado child_request, com ele conseguiremos gerar o parent_response no site do registro.br, então copie o XML.
Para gerar o parent_response siga os passos abaixo:
- Entre na sua conta no Registro.br
- Vá em Titularidade e clique no seu ASN
- No final da página clique em CONFIGURAR RPKI
- No campo child request cole o XML que foi gerado pelo comando e clique em HABILITAR RPKI.
O Registro.br irá gerar um outro XML chamado parent_response:
Copie o conteúdo e volte ao linux!
Agora vou facilitar para você criar um arquivo com o conteúdo do parent_response dentro do seu Linux, copie o comando abaixo e cole no seu Editor de Texto preferido e substitua no indicado com o XML gerado e execute todo o comando no terminal do linux.
cat <<\EOF >parent_response.xml COLE AQUI O XML PARENT RESPONSE EOF
Aqui como meu SO é Windows, optei pelo Bloco de Notas, segue um exemplo do comando preenchido:
E aqui um exemplo dele "colado" no terminal do linux:
Temos agora um arquivo chamado parent_response.xml, vamos adicionar ele ao nosso Krill.
krillc parents add remote --server https://localhost:3000/ --token ColoqueAquiSeuTokenSenhaSeguro --ca MEU_CA --parent nicbr_ca --rfc8183 parent_response.xml
Pronto, agora sim, o RPKI está ativo no seu ASN!
Vamos então gerar os ROAs de seus prefixos para protegê-los e prevenir que sofram hijack.
Mas antes vamos ativar para que o Krill faça publicação remota no registro.br, volte ao terminal do seu linux.
krillc repo request --server https://localhost:3000/ --token ColoqueAquiSeuTokenSenhaSeguro --ca MEU_CA
O comando anterior gerou um XML chamado publisher_request, com ele copiado volte ao registro.br onde você ativou o RPKI e logo abaixo do Parent response, tem um link "Configurar publicação remota", clique nele, no campo que apareceu cole o XML e clique em HABILITAR PUBLICAÇÃO REMOTA.
Agora você tem outro XML, chamado Repository response:
Seguindo o mesmo principio, precisamos criar um arquivo no linux com esse XML.
cat <<\EOF >repository_response.xml COLE AQUI O XML REPOSITORY RESPONSE EOF
Agora que temos o arquivo xml criado no Linux, vamos autorizar em nosso Krill:
krillc repo update remote --server https://localhost:3000/ --token ColoqueAquiSeuTokenSenhaSeguro --ca MEU_CA --rfc8183 repository_response.xml
E, finalmente podemos criar os ROAs deu seus prefixos, para isso vamos criar um arquivo, mas antes de mais nada, abra seu Editor de Texto preferido e cole o seguinte comando:
cat <<\EOF >meus_roas.txt EOF
Irei utilizar como exemplo o ASN 65535, substituir pelo seu ASN e seus prefixos.
Após o meus_roas.txt, na segunda linha, vamos adicionar os ROAs que queremos que sejam válidos, eu vou explanar antes como funciona isso e depois você pode brincar um pouco.
Você pode adicionar "A" ou remover "R" um ROA sempre que quiser e é bem simples, no arquivo que vamos utilizar para publicar os ROAs você pode fazer o seguinte:
A: 192.168.0.0/22-24 => 65535
A: 2001:db8::/32-48 => 65535
Exemplo:
Note que coloquei 22-24 para IPv4 e 32-48 para IPv6, ou seja, estamos dizendo que seus prefixos dentro desse range serão válidos para serem exportados! Outro caso:
A: 192.168.0.0/24 => 65535
A: 192.168.1.0/24 => 65535
A: 192.168.2.0/24 => 65535
A: 192.168.3.0/24 => 65535
A: 2001:db8::/48 => 65535
A: 2001:db8:9000::/48 => 65535
Nesse caso, estamos dizendo que os blocos /24 são os únicos válidos, ou seja, quando algum provedor for exportar seus blocos, e por algum motivo ele tentar exportar seu prefixo /23 para um AS que valide os prefixos por RPKI, esse AS vai aceitar somente os prefixos /24 pois você não validou o /23 e com isso o prefixo é descartado e não será roteado por esse AS.
Vamos para outro exemplo, vamos supor que você fez o primeiro exemplo de validar os prefixo 22 até 24, e você resolveu que não quer mais assim e quer somente validar os prefixos /22 e /23, para isso você abre o seu arquivo de roas, apague tudo e faça o seguinte:
R: 192.168.0.0/22-24 => 65535
Salve o arquivo e atualize seus ROAs, e agora abra denovo o arquivo e faça o seguinte:
A: 192.168.0.0/22-23 => 65535
E agora pode atualizar novamente seus ROAs, nesse momento, todos os AS que fazem drop de RPKI invalid, não irão mais aceitar prefixos /24 do seu AS originados por qualquer AS, e perceberam que toda vez que quero mudar alguma coisa eu tenho que apagar o que fiz anteriormente e "R"emover ou "A"adicionar? Entenderam a mecânica?
Bom, agora que você entendeu como funciona, vamos aos comandos para atualizar e autorizar os ROAs.
A: 192.168.0.0/22-24 => 65535
A: 2001:db8::/32-48 => 65535
Você colocou seus prefixos no arquivo, agora execute o seguinte comando:
krillc roas update --server https://localhost:3000/ --token ColoqueAquiSeuTokenSenhaSeguro --ca MEU_CA --delta meus_roas.txt
Pronto, com isso você já atualizou os ROAs, e seus prefixos agora são válidos e não mais desconhecidos.
Validando ROAs
Para saber se tudo funcionou, vamos fazer um whois no BGPmon.net:
whois -h whois.bgpmon.net 192.168.0.0/22
ou
whois -h whois.bgpmon.net " --roa 65535 192.168.0.0/22"
Segue um exemplo de como deve ser o resultado:
Exemplo resultado do primeiro comando:
Exemplo resultado do segundo comando:
Outros lugares que você pode validar seu ASN se está protegido com RPKI:
[1] https://sg-pub.ripe.net/jasper/rpki-web-test/
[2] https://rpki-validator.ripe.net/roas
[3] https://rpki.cloudflare.com/
Esse é o primeiro passo, agora que você tem seu ASN protegido com RPKI, o próximo passo é você também validar prefixos de outros ASs e dropar prefixos inválidos direto no seu BGP utilizando Routinator para validação, mas isso vai ficar para outro artigo.
IMPORTANTE: Manter seu Krill sempre atualizado, rodando, ligado e nunca pare o daemon.
Artigo feito por: Diorges Rocha