Guarda de logs no provedor: Marco Civil, CGNAT e porta de origem

A guarda de logs é a parte do provedor que ninguém olha até chegar o primeiro ofício. Aí descobrimos se o relógio estava certo, se o log do CGNAT tinha porta e em que fuso está o horário que o juiz mandou.
Este texto é técnico: o que as normas pedem, com artigo e link oficial, e como montar a guarda de logs na rede. Os exemplos usam Mikrotik, rsyslog no Debian e o schema do FreeRADIUS, com endereços de documentação.
Resposta rápida: o que entra na guarda de logs
- Registro de conexão de cada assinante: início, fim, duração e o IP usado. Prazo de 1 ano, em sigilo (Lei 12.965/2014, art. 13; Anatel RGST, art. 120).
- Com CGNAT, a porta lógica de origem associada ao IP público. O Decreto 12.975/2026 incluiu isso no Decreto 8.771/2016 (art. 15-A), e o RGST da Anatel já define o registro com as portas quando o IP é compartilhado.
- Data e hora com fuso, de equipamentos sincronizados por NTP. Sem fuso, o registro não fecha com o horário do ofício.
- O provedor de conexão não guarda registro de acesso a aplicações (art. 14). Guarde o que identifica a conexão, não os sites que o cliente visitou.
- Entregue registros só com ordem judicial (art. 10, § 1º, e art. 13, § 5º). Dados cadastrais têm regra própria (art. 10, § 3º).
O que o Marco Civil chama de registro de conexão
A Lei 12.965/2014, o Marco Civil da Internet, define no art. 5º, inciso VI, o registro de conexão: o conjunto de informações sobre data e hora de início e término de uma conexão, a duração e o endereço IP usado pelo terminal. No PPPoE, é o que o accounting do RADIUS já grava.
O art. 13 diz que, na provisão de conexão, cabe ao administrador de sistema autônomo respectivo manter os registros de conexão, sob sigilo, em ambiente controlado e de segurança, pelo prazo de 1 ano. Os parágrafos completam a regra:
- § 1º: a responsabilidade pela manutenção dos registros não pode ser transferida a terceiros.
- § 2º a § 4º: autoridade policial ou administrativa ou o Ministério Público pode pedir, de forma cautelar, guarda por prazo maior. O pedido é sigiloso e perde a eficácia se o pedido judicial não for feito em 60 dias ou for negado.
- § 5º: a entrega dos registros ao requerente depende de autorização judicial.
O texto fala em administrador de sistema autônomo (art. 5º, IV). Como isso se aplica a um provedor sem ASN próprio, que usa IP do upstream, é pergunta para o jurídico.
Conexão não é aplicação
O art. 14 proíbe o provedor de conexão de guardar os registros de acesso a aplicações, que o art. 5º, inciso VIII, define como data e hora de uso de uma aplicação a partir de um IP. Quem guarda esse tipo de registro, por 6 meses, é o provedor de aplicação (art. 15). Na guarda de logs do provedor de conexão, o log não deveria virar histórico de sites visitados.
Uma linha de NAT dinâmico costuma trazer o destino da conexão. Se manter esse campo é compatível com o art. 14 é discussão jurídica; a saída técnica mais simples é não precisar dele, com CGNAT determinístico.
Porta de origem: o que mudou no decreto e na Anatel
A lei fala em IP, mas o CGNAT faz o mesmo IP servir dezenas de clientes. Em 2025 e 2026 a porta de origem entrou no texto das normas, por dois caminhos.
O Decreto 12.975, de 20 de maio de 2026 incluiu o art. 15-A no Decreto 8.771/2016. Ele diz que o dever de guarda de registros de endereço IP, dos provedores de conexão e de aplicações, abrange a porta lógica de origem associada sempre que ela for necessária para a identificação inequívoca do terminal de origem ou do próximo enlace de rede. O § 1º diz que esse dever não depende de requisição prévia e recai sobre cada provedor. O decreto foi publicado no DOU de 21/05/2026 e entrou em vigor 60 dias depois da publicação.
O § 2º do art. 15-A manda que o fornecimento da porta siga os arts. 10 e 22 da lei, ou seja, também depende de ordem judicial.
Na Anatel, o Regulamento Geral dos Serviços de Telecomunicações (RGST), aprovado pela Resolução 777/2025, manda manter registros de conexão à internet por no mínimo 1 ano (art. 120, IV). O parágrafo único define o registro com início, fim, duração, IP e as portas lógicas usadas quando há compartilhamento de IP público. A resolução entrou em vigor 180 dias depois da publicação (DOU de 30/4/2025). Os dispositivos que tiveram a vigência adiada por acórdão são outros, mas confira a situação atual na página da Anatel.
| Norma | O que diz (resumo) | Fonte |
|---|---|---|
| Lei 12.965/2014, art. 5º, VI | Define registro de conexão: início, fim, duração e IP | planalto.gov.br |
| Lei 12.965/2014, art. 13 | Provedor de conexão guarda por 1 ano, em sigilo e ambiente seguro | planalto.gov.br |
| Lei 12.965/2014, art. 14 | Provedor de conexão não guarda registro de acesso a aplicações | planalto.gov.br |
| Decreto 8.771/2016, art. 13 | Padrões de segurança: acesso restrito, autenticação, inventário de acessos, inviolabilidade; reter o mínimo | planalto.gov.br |
| Decreto 8.771/2016, art. 15-A | Guarda do IP abrange a porta lógica de origem quando necessária para identificar de forma inequívoca o terminal ou o próximo enlace (incluído pelo Decreto 12.975/2026) | planalto.gov.br |
| Anatel, RGST (Res. 777/2025), art. 120, IV | Registros de conexão por no mínimo 1 ano, com as portas lógicas quando há IP público compartilhado | anatel.gov.br |
Guarda de logs com CGNAT: IP, porta, data e fuso
Com CGNAT, o ofício traz IP público, porta e horário; o CGNAT diz qual IP 100.64 usava a porta; o RADIUS diz qual assinante estava com aquele 100.64. A tradução está em o que é CGNAT e como ele funciona.

| Cenário | O que guardar | Volume |
|---|---|---|
| IP público fixo por cliente | Cadastro do IP e histórico de troca | Baixa |
| PPPoE com IP público dinâmico | Accounting do RADIUS (usuário, IP, início, fim) | Baixa |
| CGNAT determinístico | Accounting do RADIUS + versão datada da tabela de portas | Baixa |
| CGNAT dinâmico ou por blocos (BPA) | Accounting + log de cada sessão ou de cada bloco alocado | Alta (volume grande) |
| IPv6 com prefixo delegado | Usuário, prefixo delegado, início e fim | Baixa |
O CGNAT determinístico é o que deixa a guarda de logs mais leve: cada IP 100.64 tem sempre o mesmo IP público e a mesma faixa de portas, calculados por fórmula. Em vez de milhões de linhas por dia, você guarda a tabela com a data em que entrou em produção. O passo a passo está em CGNAT no Mikrotik com netmap determinístico.
No IPv6 a porta deixa de importar, porque cada cliente tem o próprio prefixo, mas o prefixo delegado precisa estar registrado com usuário e horário (IPv6 no PPPoE com prefixo delegado). Dual stack são duas trilhas na guarda de logs.
Relógio certo antes de tudo: NTP e fuso
O ofício costuma vir em UTC, às vezes em horário de Brasília, às vezes sem dizer qual. Se o concentrador está dois minutos adiantado, a sessão que você acha pode ser a do cliente anterior naquele IP. A guarda de logs começa pelo tempo: NTP em todos os equipamentos e fuso gravado na linha.
No servidor de logs Debian, o fuso e o NTP ficam assim:
timedatectl set-timezone America/Sao_Paulo apt install chrony timedatectl chronyc tracking
O set-timezone grava o fuso, o chrony mantém o relógio ajustado e o chronyc tracking mostra o desvio. Saída esperada, resumida:
Local time: Mon 2026-09-14 10:45:29 -03
Universal time: Mon 2026-09-14 13:45:29 UTC
Time zone: America/Sao_Paulo (-03, -0300)
System clock synchronized: yes
NTP service: activeA linha que importa é System clock synchronized: yes. Se aparecer no, confira a saída UDP 123. O NTP.br mantém servidores como a.st1.ntp.br. Sem horário de verão desde 2019, America/Sao_Paulo fica em -03, mas grave o fuso mesmo assim: a regra pode mudar.
Servidor de logs com rsyslog
O servidor de logs recebe o syslog dos concentradores e do CGNAT, um arquivo por equipamento e por dia. Este é o arquivo /etc/rsyslog.d/10-remoto.conf, na sintaxe atual do rsyslog (RainerScript):
module(load="imudp")
module(load="imtcp")
template(name="PorOrigem" type="string"
string="/var/log/remoto/%fromhost-ip%/%$year%-%$month%-%$day%.log")
template(name="Linha" type="string"
string="%timegenerated:::date-rfc3339% %fromhost-ip% %msg%\n")
ruleset(name="remoto") {
action(type="omfile" dynaFile="PorOrigem" template="Linha"
dirCreateMode="0750" fileCreateMode="0640")
stop
}
input(type="imudp" port="514" ruleset="remoto")
input(type="imtcp" port="514" ruleset="remoto")module(load="imudp")eimtcp: recepção por UDP e TCP.template PorOrigem: monta o caminho do arquivo com o IP de quem mandou (fromhost-ip) e a data do servidor. O resultado é/var/log/remoto/192.0.2.1/2026-09-14.log.template Linha: grava a hora em que o servidor recebeu a mensagem (timegenerated) no formato RFC 3339, com microssegundos e fuso, seguida do IP de origem e da mensagem.ruleset remotoestop: o que chega pela rede não se mistura com o/var/log/syslogdo servidor.dirCreateModeefileCreateMode: sem leitura para outros usuários.
Antes de reiniciar, valide a configuração e confira se a porta abriu:
install -d -m 0750 -o root -g adm /var/log/remoto rsyslogd -N1 systemctl restart rsyslog ss -lntup 'sport = :514'
O rsyslogd -N1 valida a configuração sem subir o serviço. O ss deve mostrar a 514 em UDP e TCP. No firewall, aceite a 514 só dos concentradores e do CGNAT: syslog aberto deixa qualquer um escrever no seu registro.
Mandando o log do Mikrotik
No concentrador PPPoE (o mesmo do post de PPPoE server no Mikrotik v7), ajuste relógio, NTP e a ação remota. A sintaxe segue a documentação do RouterOS v7; teste em laboratório antes de aplicar:
/system clock set time-zone-autodetect=no time-zone-name=America/Sao_Paulo
/system ntp client set enabled=yes
/system ntp client servers add address=a.st1.ntp.br
/system ntp client servers add address=b.st1.ntp.br
/system logging action
add name=guardalog target=remote remote-port=192.0.2.10:514 \
remote-log-format=syslog syslog-time-format=iso8601 \
syslog-facility=local5 src-address=192.0.2.1
/system logging
add topics=ppp action=guardalogtime-zone-autodetect=no evita que o roteador escolha o fuso pelo IP público. A ação guardalog manda para o servidor saindo pela loopback (src-address), o que mantém o mesmo diretório no servidor. Em versões antigas do v7, o endereço vai em remote e a porta em remote-port; confira o help da sua versão. Exemplo do que chega:
2026-09-14T08:02:11.512034-03:00 192.0.2.1 <pppoe-cliente0137>: connected 2026-09-14T19:40:03.118520-03:00 192.0.2.1 <pppoe-cliente0137>: disconnected
Esse syslog é a segunda trilha da guarda de logs. A fonte principal do registro de conexão continua sendo o accounting do RADIUS, com início, fim e IP de cada sessão.
Formatos: log por sessão ou tabela determinística
O log por sessão grava cada conexão traduzida: IP e porta privados, IP e porta públicos, horário. Funciona com qualquer CGNAT, mas o volume é enorme e costuma trazer o destino. A alocação por blocos (BPA) loga só quando um bloco de portas é entregue e liberado. A tabela determinística não loga a tradução: você guarda a fórmula, ou a tabela, com a data de vigência.
Mudou o pool ou a proporção? É uma versão nova da tabela. Guarde todas, com início e fim, pelo mesmo prazo da guarda de logs. Um ofício de março pergunta pela tabela que valia em março.
Armazenamento e integridade
O Decreto 8.771/2016, art. 13, lista diretrizes de segurança para quem guarda esses dados: controle estrito de acesso, autenticação para acessar os registros (o texto cita autenticação dupla como exemplo), inventário dos acessos com momento, duração, quem acessou e qual arquivo, e técnicas que garantam a inviolabilidade, como encriptação. O § 2º manda reter o mínimo e excluir quando a finalidade acabar ou o prazo legal terminar.
No servidor de logs, um cron diário comprime o arquivo do dia anterior e grava o hash SHA-256 numa lista. Salve como /etc/cron.daily/logs-remoto:
#!/bin/sh
# /etc/cron.daily/logs-remoto: comprime o dia anterior e grava o hash
set -e
ONTEM=$(date -d yesterday +%F)
cd /var/log/remoto
for f in */"$ONTEM".log; do
[ -f "$f" ] || continue
gzip -9 "$f"
sha256sum "$f.gz" >> SHA256SUMS
done
chmod 0640 SHA256SUMSO date -d yesterday +%F gera a data no mesmo formato do template do rsyslog. O sha256sum anota o hash; arquivo alterado deixa de bater.
chmod 0755 /etc/cron.daily/logs-remoto cd /var/log/remoto && sha256sum -c --quiet SHA256SUMS rsync -a /var/log/remoto/ backup@192.0.2.20:/srv/logs-remoto/ find /var/log/remoto -name '*.log.gz' -mtime +400 -print
chmod 0755: o run-parts só executa script executável.sha256sum -c --quiet: confere todos os hashes e só imprime os que falharam. Rode antes de entregar qualquer dado.rsync: cópia para outro servidor, com acesso separado. Perder o disco também é perder a guarda de logs.find ... -mtime +400 -print: lista os arquivos com mais de 400 dias. O comando só lista de propósito: apagar depende de não haver pedido de preservação (art. 13, § 2º, da lei) e da política definida com o jurídico.
Registre quem acessa o servidor: contas nominais, SSH com chave e segundo fator, log de autenticação enviado para outro lugar. É o inventário do inciso III do art. 13 do decreto.
Como atender um ofício judicial
O ofício chega com algo como: IP 203.0.113.5, porta 4100, 14/09/2026 às 13:45:29 UTC. Antes de consultar, confira com o jurídico se é ordem judicial e o que ela pede.
1. Converter o horário para o fuso dos seus registros
from datetime import datetime
from zoneinfo import ZoneInfo
utc = datetime(2026, 9, 14, 13, 45, 29, tzinfo=ZoneInfo('UTC'))
print(utc.astimezone(ZoneInfo('America/Sao_Paulo')))2026-09-14 10:45:29-03:00
O zoneinfo acerta inclusive datas da época do horário de verão. Conta de cabeça é o erro mais comum.
2. Achar o IP 100.64 pela tabela do CGNAT
Com o script cgnat_tabela.py do post de CGNAT no Mikrotik com netmap determinístico, usando a versão da tabela que valia na data do ofício:
python3 -c "import cgnat_tabela as t; print(t.quem('203.0.113.5', 4100))"100.64.0.37
3. Achar a sessão no RADIUS
No schema padrão do FreeRADIUS, a tabela radacct guarda cada sessão. A consulta procura quem estava com aquele IP no horário, com a sessão aberta ou já encerrada depois dele:
SELECT username, callingstationid, nasipaddress,
acctstarttime, acctstoptime
FROM radacct
WHERE framedipaddress = '100.64.0.37'
AND acctstarttime <= '2026-09-14 10:45:29'
AND (acctstoptime IS NULL OR acctstoptime >= '2026-09-14 10:45:29');username callingstationid nasipaddress acctstarttime cliente0137 00:00:5E:00:53:37 192.0.2.1 2026-09-14 08:02:11 (acctstoptime: 2026-09-14 19:40:03)
Confira em que fuso o seu RADIUS grava acctstarttime; em muitas instalações é o horário local do servidor do banco.
4. Responder e registrar
O que vai na resposta, em que formato e para quem, é decisão do jurídico. Do lado técnico, registre quem consultou, quando e quais arquivos, e guarde a evidência junto do processo.
Erros comuns na guarda de logs
- Hora sem fuso. Linha com
Sep 14 10:45:29não diz o ano nem o fuso. Grave RFC 3339 no servidor e usesyslog-time-format=iso8601onde o equipamento permitir. - Relógio fora. NTP em todos os equipamentos.
- Só o log do CGNAT. Sem o accounting do RADIUS, você chega no IP 100.64 e para.
- Tabela determinística sem versão. Sobrescreveu a tabela? O período anterior fica sem resposta.
- Syslog por UDP sem conferência. UDP perde pacote sem avisar. Alarme quando um equipamento parar de mandar.
- Disco cheio. rsyslog sem espaço é registro perdido.
- Guardar demais. URL ou destino de cada conexão não é registro de conexão, e mais dado é mais risco se o servidor for invadido.
Perguntas frequentes
Por quanto tempo o provedor precisa fazer a guarda de logs de conexão?
O art. 13 da Lei 12.965/2014 fala em 1 ano, e o RGST da Anatel fala em no mínimo 1 ano. Autoridade policial ou administrativa ou o Ministério Público pode pedir, de forma cautelar, que os registros sejam guardados por prazo maior (art. 13, § 2º). Confirme a política de retenção com a assessoria jurídica.
Com CGNAT, preciso guardar a porta de origem?
O Decreto 8.771/2016, art. 15-A, incluído pelo Decreto 12.975/2026, diz que a guarda do IP abrange a porta lógica de origem quando ela for necessária para a identificação inequívoca do terminal de origem ou do próximo enlace de rede. O RGST da Anatel também inclui as portas no registro quando há IP compartilhado. Tecnicamente, sem a porta não há como separar os clientes de um mesmo IP público.
Posso terceirizar a guarda de logs?
Pode contratar servidor ou sistema de terceiros, mas o art. 13, § 1º, diz que a responsabilidade pela manutenção dos registros não pode ser transferida. Se o fornecedor perder os dados, o problema continua sendo do provedor.
A polícia pode pedir os registros sem ordem judicial?
Pela lei, a entrega dos registros de conexão depende de ordem judicial (art. 10, § 1º, e art. 13, § 5º). Dados cadastrais (qualificação pessoal, filiação e endereço) podem ser requisitados por autoridades administrativas com competência legal (art. 10, § 3º). Na dúvida, consulte o jurídico antes de responder.
Quanto espaço ocupa a guarda de logs com CGNAT?
Depende do formato. Com tabela determinística, o volume é o do accounting do RADIUS e algumas versões da tabela. Com log por sessão, cada conexão vira uma linha e o disco cresce rápido; meça uma semana antes de dimensionar.
Conclusão
A guarda de logs que funciona no dia do ofício tem quatro peças: relógio sincronizado com fuso, accounting do RADIUS completo, a tradução do CGNAT registrada (de preferência por tabela determinística versionada) e um servidor de logs com acesso controlado, hash e cópia. Teste com um ofício simulado: IP, porta e horário em UTC, e veja se a equipe chega ao assinante.
As normas mudaram em 2025 e 2026 e podem mudar de novo. Valide cada decisão de retenção e entrega da guarda de logs com a assessoria jurídica do provedor.
Fontes oficiais: Lei 12.965/2014, Decreto 8.771/2016, Decreto 12.975/2026 e Resolução Anatel 777/2025 (RGST).
Leitura recomendada: Log de portas de origem em servidores web e Servidor de Logs, da wiki do Brasil Peering Forum (CC BY-NC 4.0).
