Protegendo seu ASN com RPKI

De Wiki BPF
Revisão de 22h18min de 25 de maio de 2020 por Fernando.frediani (discussão | contribs) (Ajustes na formatação do texto)
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".

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 RPK
  4. 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

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

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

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 faça 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.

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, 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