Manual prático de RPKI com Krill + Registro.br

Manual prático de RPKI com Krill + Registro.br

— AS263511 —

Objetivo deste manual: configurar RPKI delegado usando o Krill e o
Registro.br, começar com segurança e testar somente o prefixo
187.61.96.0/20.

ROA de teste planejada:

Prefixo:    187.61.96.0/20
ASN:        AS263511
MaxLength:  /24

As outras faixas serão deixadas sem ROA durante o primeiro teste.


1. Fontes utilizadas

Este manual foi complementado com o material oficial do NIC.br:

O tutorial do NIC.br apresenta o fluxo de instalação, configuração da
CA, Child Request, Parent Response, ROAs e publicação no sistema do
Registro.br. citeturn0view0turn0view1

Importante: o tutorial do NIC.br é material de treinamento e
contém comandos de uma versão do Krill diferente da versão instalada
neste ambiente. No seu servidor foi identificado Krill 0.17.0-dev.
Portanto, quando houver diferença de comando, deve-se confiar no
krillc --help da versão instalada.


2. Informações do nosso ambiente

ASN

AS263511

Prefixos

191.243.196.0/22
200.150.192.0/20
186.233.224.0/22
177.87.120.0/22
200.229.64.0/20
187.61.96.0/20
2804:1308::/32

CA Krill

rpki_ca

Serviço Krill

https://localhost:3000/

3. O que é RPKI?

RPKI é um mecanismo usado para publicar uma autorização sobre a origem
de rotas BGP.

Uma ROA responde:

Qual ASN está autorizado a originar determinado prefixo?

Exemplo:

187.61.96.0/20
        |
        +---- AS263511

Uma ROA pode ser:

Prefixo:    187.61.96.0/20
ASN:        AS263511
MaxLength:  /24

4. RPKI não substitui BGP

O BGP continua sendo configurado no roteador.

Por exemplo:

BGP:
187.61.96.0/20
    originado por
AS263511

A ROA é uma autorização independente:

RPKI:
187.61.96.0/20
    autorizado para
AS263511

O Krill não fica no caminho dos pacotes.


5. Arquitetura

O ambiente pode ser entendido assim:

                    Registro.br
                         |
                         | Parent
                         v
                    rpki_ca
                     Krill
                         |
                         | ROAs
                         v
                   Publicação
                         |
                         v
                  Validadores RPKI
                         |
                         v
                     Internet

Há uma segunda relação importante quando se usa a publicação no
Registro.br:

Krill
  |
  | Publisher Request
  v
Registro.br
  |
  | Repository Response
  v
Krill

Essa segunda relação é responsável por permitir que os objetos
publicados pela CA sejam disponibilizados através do sistema de
publicação do Registro.br. O tutorial do NIC.br apresenta essa etapa
como Publisher Request/Repository Response. citeturn0view0


6. Um detalhe muito importante: CA/Parent não é a mesma coisa que Repository

Existem duas etapas diferentes:

Parent

Relaciona sua CA ao Registro.br:

Registro.br
    |
    | Parent
    v
Sua CA Krill

É nessa etapa que entram:

  • Child Request
  • Parent Response
  • parents add

Repository / publicação

Define onde os objetos RPKI serão publicados:

Sua CA
   |
   | Publisher Request
   v
Registro.br
   |
   v
Repositório RPKI

O tutorial do NIC.br trata essas etapas separadamente. citeturn0view0


7. O servidor Krill precisa estar disponível

O tutorial do NIC.br destaca que, para utilizar RPKI com esse modelo, o
servidor Krill deve permanecer ligado. citeturn0view0

Porém, o próprio tutorial apresenta a publicação no sistema do
Registro.br como uma forma de evitar que o servidor Krill precise ficar
disponível para que terceiros consultem diretamente as informações da
CA. citeturn0view0

Na prática, isso significa que você deve diferenciar:

  • Krill funcionando para administração/assinatura/atualização da
    CA
    ;
  • repositório RPKI publicado através do Registro.br.

Para produção, o serviço Krill ainda deve ser tratado como serviço
crítico e ter backup, monitoramento e procedimento de recuperação.


8. Instalação do Krill

O tutorial do NIC.br apresenta Ubuntu, compilador C, OpenSSL, Rust e
compilação do Krill a partir do código-fonte. citeturn0view0

Exemplo do material:

sudo apt-get install build-essentials

Observação: confira o nome correto do pacote para sua
distribuição. Em Ubuntu/Debian, normalmente o pacote utilizado para
ferramentas básicas de compilação é build-essential.

Dependências do OpenSSL:

sudo apt-get install libssl-dev openssl pkg-config

Rust:

curl https://sh.rustup.rs -sSf | sh
source "$HOME/.cargo/env"

Depois:

git clone https://github.com/NLnetLabs/krill.git
cd krill
cargo build --release

O tutorial explica que os binários ficam em:

krill/target/release/krill
krill/target/release/krillc

citeturn0view0


9. Problema encontrado durante nossa instalação

No seu ambiente apareceu:

failed to find tool "cc": No such file or directory

Isso significa que faltava o compilador/toolchain C no sistema.

O tutorial do NIC.br também inclui a instalação do compilador C antes de
compilar o Krill. citeturn0view0

Depois disso, confirme:

krill --version
krillc --version

10. Configuração do Krill

O tutorial mostra uma configuração com:

auth_token = "SouUmaSenhaSegura"

e execução:

krill -c ./krill.conf

citeturn0view0

No seu ambiente, o arquivo krill.conf já foi ajustado e o Krill chegou
a iniciar.

Nunca coloque seu token real neste manual, Git ou documentação
compartilhada.

Use:

SEU_TOKEN

nos exemplos.


11. Atenção ao socket do Krill

Seu log apresentou:

Could not bind to Unix socket '/run/krill/krill.sock':
No such file or directory

Isso indica que o diretório do socket não existia.

Para produção, não é ideal depender somente de:

mkdir -p /run/krill

porque /run é normalmente temporário.

Se o serviço for executado pelo systemd, configure o serviço para criar
o diretório automaticamente, por exemplo com:

RuntimeDirectory=krill

A configuração exata depende do unit file usado na instalação.


12. Criando a CA

O tutorial do NIC.br apresenta a criação de uma CA com krillc add.
citeturn0view0

Na sua versão, descobrimos que:

krillc add --help

mostra:

Usage: krillc add --ca <CA>

Isso significa que --server e --token são opções globais da sua
versão e devem aparecer antes do subcomando.

Exemplo:

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  add \
  --ca rpki_ca

13. Verificando a CA

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  show \
  --ca rpki_ca

Confirme que a CA existe e está operacional.


14. Child Request

O material do NIC.br apresenta um comando chamado:

krillc parents myid

na versão usada no tutorial. citeturn0view0

Na sua instalação, entretanto:

krillc parents --help

mostrou:

request
add
refresh
contact
statuses
remove

Portanto, na sua versão o comando correto para gerar o Child Request
é
:

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  parents request \
  --ca rpki_ca

O XML exibido pelo comando deve ser copiado para o Registro.br.


15. Configurando o Parent no Registro.br

No Registro.br:

  1. Faça login.
  2. Entre em Titularidade.
  3. Selecione o ASN.
  4. Acesse a configuração de RPKI.
  5. Localize o campo de Child Request.
  6. Cole o XML gerado pelo Krill.
  7. Habilite/configure o RPKI.
  8. Copie o Parent Response fornecido pelo Registro.br.

Esse fluxo é descrito no tutorial do NIC.br. citeturn0view0


16. Salvando o Parent Response

No servidor:

cd /home/rpki
nano parent_response.xml

Cole o XML fornecido pelo Registro.br.

Salve.


17. Adicionando o Parent no Krill

Na versão do tutorial aparece:

krillc parents add --server ...

Na sua versão, use as opções globais antes do subcomando:

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  parents add \
  --ca rpki_ca \
  --parent nicbr_ca \
  --rfc8183 \
  parent_response.xml

18. Verificando o Parent

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  parents statuses \
  --ca rpki_ca

Não avance para uma grande quantidade de ROAs até confirmar que a
relação com o parent está funcionando.


19. Criando a primeira ROA

O tutorial do NIC.br utiliza um arquivo roas.txt para
adicionar/remover ROAs. A sintaxe apresentada é:

A: 192.168.0.0/22-24 => 1234
R: 10.0.0.0/8 => 1234
A: 2001:db8::/32 => 1234

Onde:

  • A = adicionar;
  • R = remover;
  • => separa prefixo/autorização do ASN;
  • -24 indica o MaxLength. citeturn0view0

20. Nosso teste

Queremos:

187.61.96.0/20
AS263511
MaxLength /24

No formato do tutorial:

A: 187.61.96.0/20-24 => 263511

Você pode criar:

nano roas.txt

e colocar:

A: 187.61.96.0/20-24 => 263511

21. Usando o arquivo de ROAs

O tutorial apresenta:

krillc roas update \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  --ca rpki_ca \
  --delta roas.txt

Na sua versão, as opções globais devem ser posicionadas conforme o
--help da sua instalação. Uma forma consistente com o CLI que você
mostrou é:

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  roas update \
  --ca rpki_ca \
  --delta roas.txt

O material do NIC.br documenta esse fluxo de arquivo roas.txt.
citeturn0view0


22. Alternativa: --add

Sua versão também suporta:

--add <ROA definitions>

Para o teste, a sintaxe que identificamos é:

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  roas update \
  --ca rpki_ca \
  --add '187.61.96.0/20 => 263511-24'

Antes disso, você pode usar:

--dryrun

para testar a alteração sem aplicá-la.

Exemplo:

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  roas update \
  --ca rpki_ca \
  --add '187.61.96.0/20 => 263511-24' \
  --dryrun

23. Consultando as ROAs

O tutorial do NIC.br usa:

krillc roas list

citeturn0view0

Na sua versão:

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  roas list \
  --ca rpki_ca

Procure:

187.61.96.0/20
AS263511
/24

24. Publicação das ROAs no Registro.br

Esta é uma etapa importante que deve ser incluída no planejamento.

O tutorial do NIC.br explica que, depois de gerar ROAs no Krill, é
possível publicar essas informações através do sistema do Registro.br. O
tutorial apresenta isso como uma forma de evitar que terceiros precisem
consultar diretamente seu servidor Krill e de reduzir a necessidade de
manter o Krill em alta disponibilidade para essa função de consulta.
citeturn0view0

O fluxo é:

Krill
  |
  | Publisher Request
  v
Registro.br
  |
  | Repository Response
  v
Krill

25. Gerando o Publisher Request

No Krill:

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  repo request \
  --ca rpki_ca

Consulte krillc repo --help na sua versão antes de executar. O
tutorial do NIC.br apresenta o comando krillc repo request.
citeturn0view0

O comando gera um XML.

Copie esse XML.


26. Enviando o Publisher Request ao Registro.br

No sistema RPKI do Registro.br, localize o campo:

Publisher Request

Cole o XML.

O Registro.br deverá fornecer um:

Repository Response

Esse fluxo está descrito no tutorial do NIC.br. citeturn0view0


27. Adicionando o Repository Response

O tutorial mostra:

krillc repo update rfc8183 repository_response.xml ...

Na sua versão, confirme:

krillc repo --help

e:

krillc repo update --help

Depois utilize a sintaxe apresentada pela sua versão.


28. Parent e Repository são duas configurações

Ao final, você terá:

                   Registro.br
                   /          \
                  /            \
             Parent          Repository
                |                |
                v                v
             rpki_ca          publicação
              Krill              |
                |                |
                +-------+--------+
                        |
                       ROAs

Isso é uma das partes mais importantes do procedimento.


29. Nossa estratégia de teste

Não vamos cadastrar todos os prefixos de uma vez.

Primeiro:

187.61.96.0/20

com:

AS263511
MaxLength /24

Os demais ficam sem ROA:

191.243.196.0/22
200.150.192.0/20
186.233.224.0/22
177.87.120.0/22
200.229.64.0/20
2804:1308::/32

30. Isso afeta as outras redes?

Não por causa dessa ROA específica.

Uma ROA para:

187.61.96.0/20

não cria autorização para:

200.150.192.0/20

nem:

191.243.196.0/22

nem:

2804:1308::/32

Portanto, a primeira fase pode ser limitada ao /20 de teste.


31. UNKNOWN não é INVALID

Se uma das outras redes ainda não possui ROA, ela poderá aparecer como:

UNKNOWN

Isso não significa que a rede está inválida.

INVALID é diferente: significa que existe uma autorização RPKI
aplicável, mas o anúncio não corresponde a ela.


32. Exemplo de erro de MaxLength

Imagine:

BGP:
187.61.96.0/24
AS263511

Mas a ROA é:

187.61.96.0/20
AS263511
MaxLength /20

O /24 é mais específico do que o permitido pela ROA.

Portanto, o anúncio pode ser considerado INVALID.

Com:

187.61.96.0/20
AS263511
MaxLength /24

o /24 fica dentro do comprimento máximo autorizado.


33. Mudança futura de /22 para /24

Se futuramente você quiser transformar um anúncio:

191.243.196.0/22

em:

191.243.196.0/24

a ROA precisa acompanhar o anúncio.

Você pode criar uma autorização específica:

191.243.196.0/24
AS263511
MaxLength /24

ou autorizar mais específicos dentro do /22 com uma ROA do /22 e
MaxLength apropriado.

A escolha depende de quais anúncios você realmente pretende permitir.


34. IPv6

Seu bloco é:

2804:1308::/32

Se o anúncio for somente:

2804:1308::/32

uma autorização restritiva seria:

2804:1308::/32
AS263511
MaxLength /32

Se futuramente você anunciar:

2804:1308:1000::/48

a autorização precisa permitir o /48.

Não use um MaxLength mais amplo apenas por conveniência.


35. Downtime

A configuração da CA/Parent RPKI não altera diretamente os anúncios BGP.

Portanto:

Configurar Parent
        |
        X
Não altera BGP

e:

Criar ROA
        |
        X
Não altera automaticamente BGP

O cuidado maior aparece quando você muda o anúncio BGP.

Por exemplo:

/22 → /24

é uma mudança de roteamento e deve ser planejada como tal.


36. Procedimento seguro para uma mudança

Uma sequência prudente é:

1. Planejar novo anúncio
        |
        v
2. Criar autorização RPKI compatível
        |
        v
3. Publicar
        |
        v
4. Confirmar que a autorização está disponível
        |
        v
5. Alterar BGP
        |
        v
6. Verificar VALID
        |
        v
7. Remover autorização antiga quando apropriado

37. Segurança

Proteja especialmente:

  • chave privada da CA;
  • dados da CA;
  • krill.conf;
  • token de administração;
  • parent_response.xml;
  • repository_response.xml.

Não coloque esses dados em:

GitHub
GitLab público
pastebin
tickets públicos
chats públicos

38. Backup

Antes de alterações importantes:

  1. Faça backup dos dados do Krill.
  2. Faça backup da configuração.
  3. Proteja a chave privada.
  4. Documente o parent.
  5. Documente o repository.
  6. Teste a restauração.

39. Checklist completo

Krill

  • Krill instalado.
  • krill --version funcionando.
  • krillc --version funcionando.
  • krill.conf configurado.
  • Token protegido.
  • Diretório de dados protegido.
  • Serviço configurado para iniciar automaticamente.
  • Socket /run/krill/krill.sock tratado corretamente.

CA

  • rpki_ca criada.
  • Recursos confirmados.
  • Backup realizado.

Parent

  • Child Request gerado.
  • Child Request enviado ao Registro.br.
  • Parent Response recebido.
  • parent_response.xml salvo.
  • Parent adicionado.
  • parents statuses verificado.

Repository

  • Publisher Request gerado.
  • Publisher Request enviado ao Registro.br.
  • Repository Response recebido.
  • Repository Response adicionado.
  • Publicação verificada.

ROA de teste

  • Prefixo: 187.61.96.0/20
  • ASN: AS263511
  • MaxLength: /24
  • Dry-run executado.
  • ROA adicionada.
  • roas list confirma a ROA.
  • Publicação confirmada.
  • Validação externa confirmada.

40. Comandos essenciais

Ver versão

krill --version
krillc --version

Ver CA

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  show \
  --ca rpki_ca

Ver Parent

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  parents statuses \
  --ca rpki_ca

Child Request

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  parents request \
  --ca rpki_ca

ROAs disponíveis

krillc roas --help

Atualização de ROAs

krillc roas update --help

Dry-run da primeira ROA

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  roas update \
  --ca rpki_ca \
  --add '187.61.96.0/20 => 263511-24' \
  --dryrun

Listar ROAs

krillc \
  --server https://localhost:3000/ \
  --token 'SEU_TOKEN' \
  roas list \
  --ca rpki_ca

Repository

krillc repo --help

41. Fluxo completo em uma página

                    ┌─────────────────┐
                    │   Registro.br   │
                    └────────┬────────┘
                             │
                   Child Request
                             │
                             ▼
                    ┌─────────────────┐
                    │     rpki_ca     │
                    │     Krill       │
                    └────────┬────────┘
                             │
                    Parent Response
                             │
                             ▼
                    CA integrada ao
                    Registro.br
                             │
                             │
                   Publisher Request
                             │
                             ▼
                    ┌─────────────────┐
                    │   Registro.br   │
                    │   Repository    │
                    └────────┬────────┘
                             │
                             ▼
                       Publicação
                             │
                             ▼
                    Validadores RPKI
                             │
                             ▼
                          Internet

Depois:

Krill
  |
  +---- ROA
        |
        +---- 187.61.96.0/20
        +---- AS263511
        +---- MaxLength /24

42. Primeiro teste recomendado

A sequência recomendada para este ambiente é:

1. Confirmar recursos da rpki_ca
          ↓
2. Gerar Child Request
          ↓
3. Configurar Parent no Registro.br
          ↓
4. Adicionar Parent Response
          ↓
5. Confirmar parents statuses
          ↓
6. Gerar Publisher Request
          ↓
7. Configurar Repository no Registro.br
          ↓
8. Confirmar Repository Response
          ↓
9. Fazer dry-run da ROA
          ↓
10. Criar somente:
       187.61.96.0/20
       AS263511
       MaxLength /24
          ↓
11. Conferir publicação
          ↓
12. Conferir validação
          ↓
13. Só depois adicionar os demais prefixos

43. Diferenças entre o tutorial NIC.br e a versão instalada

O tutorial do NIC.br é uma referência importante, mas foi produzido para
uma versão diferente do Krill.

No material aparecem comandos como:

krillc parents myid

e:

krillc add --server ...

Na versão instalada no seu ambiente, observamos:

Krill 0.17.0-dev

e:

krillc parents --help

mostrou:

request
add
refresh
contact
statuses
remove

Portanto:

Tutorial antigo:
parents myid

Sua versão:
parents request

Da mesma forma, a posição de --server e --token deve seguir o CLI da
sua versão.

Regra prática: use o tutorial do NIC.br para entender o processo e o
--help do seu Krill para confirmar a sintaxe.


44. Conclusão

Para o primeiro teste, não é necessário configurar todas as redes.

O objetivo inicial é chegar a:

Registro.br
      |
      v
   rpki_ca
      |
      v
187.61.96.0/20
      |
      v
AS263511
      |
      v
MaxLength /24

Quando isso estiver funcionando e validado, os demais prefixos podem ser
adicionados gradualmente.

Esse método reduz o risco operacional e facilita a identificação de
qualquer problema durante a implantação.