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: /24As 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:
- Tutorial Krill — Sala de Aula NIC.br: Tutorial
Krill - Curso Tutorial RPKI — Semana Infraestrutura 2019: curso
RPKI
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. citeturn0view0turn0view1
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 identificadoKrill 0.17.0-dev.
Portanto, quando houver diferença de comando, deve-se confiar no
krillc --helpda 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. citeturn0view0
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. citeturn0view0
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. citeturn0view0
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. citeturn0view0
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. citeturn0view0
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
citeturn0view0
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. citeturn0view0
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
citeturn0view0
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.
citeturn0view0
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. citeturn0view0
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:
- Faça login.
- Entre em Titularidade.
- Selecione o ASN.
- Acesse a configuração de RPKI.
- Localize o campo de Child Request.
- Cole o XML gerado pelo Krill.
- Habilite/configure o RPKI.
- Copie o Parent Response fornecido pelo Registro.br.
Esse fluxo é descrito no tutorial do NIC.br. citeturn0view0
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;-24indica o MaxLength. citeturn0view0
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.
citeturn0view0
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
citeturn0view0
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.
citeturn0view0
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 --helpna sua versão antes de executar. O
tutorial do NIC.br apresenta o comandokrillc repo request.
citeturn0view0
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. citeturn0view0
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:
- Faça backup dos dados do Krill.
- Faça backup da configuração.
- Proteja a chave privada.
- Documente o parent.
- Documente o repository.
- Teste a restauração.
39. Checklist completo
Krill
- Krill instalado.
-
krill --versionfuncionando. -
krillc --versionfuncionando. -
krill.confconfigurado. - Token protegido.
- Diretório de dados protegido.
- Serviço configurado para iniciar automaticamente.
- Socket
/run/krill/krill.socktratado corretamente.
CA
-
rpki_cacriada. - Recursos confirmados.
- Backup realizado.
Parent
- Child Request gerado.
- Child Request enviado ao Registro.br.
- Parent Response recebido.
-
parent_response.xmlsalvo. - Parent adicionado.
-
parents statusesverificado.
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 listconfirma 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.