Protegendo seu ASN com RPKI

De Wiki BPF
Ir para: navegação, pesquisa

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:

  1. Entre na sua conta no Registro.br
  2. Vá em Titularidade e clique no seu ASN
  3. No final da página clique em CONFIGURAR RPKI
  4. No campo child request cole o XML que foi gerado pelo comando e clique em HABILITAR RPKI.

Rpki.png

O Registro.br irá gerar um outro XML chamado parent_response:

Parent response rpki.png

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:

Parent response.png

E aqui um exemplo dele "colado" no terminal do linux:

Parent response terminal.png

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.

Publicacao remota rpki.png

Agora você tem outro XML, chamado Repository response:

Repository response rpki.png

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:

Roas exemplo notepad.png

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:

ROA Valido.png

Exemplo resultado do segundo comando:

ROA Valido 02.png


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