Acessibilidade:Áudio:1,0×
Capacitação DigitalPrograma Nacional — Moçambique
Módulo 11 de 13 · Redes Avançadas e Introdução à Segurança Cibernética

Gestão e Monitorização de Redes

Progresso neste dispositivo0/5

Inventário e documentação da rede

  • Texto: disponível
  • Síntese em leitura fácil: disponível
  • Leitura em voz alta pelo navegador: disponível
  • Alto contraste e navegação por teclado: controlos disponíveis
  • Vídeo e legendagem: por produzir
  • Língua de Sinais Moçambicana: por produzir
  • Revisão de acessibilidade por terceiros: por realizar

Os controlos de acessibilidade existem e funcionam. Isso não equivale a uma revisão de acessibilidade feita por terceiros: essa revisão está proposta e ainda não foi realizada.

Duração: 70 minutos (explicação 20, prática guiada 40, verificação 10). Resultados dos TdR trabalhados: Documentação: diagramas, procedimentos (SOP) e contingência; Continuidade e protecção de activos digitais.

Objectivos

  • Explicar para que servem o inventário de activos de rede, o diagrama lógico e a ficha de cada equipamento, e que informação nunca deve constar neles (palavras-passe, chaves).
  • Gerar automaticamente um inventário IPv4 da rede de prática com um script Python com tratamento de erros, e detectar endereços repetidos.
  • Comparar o inventário gerado com a documentação existente e registar as diferenças como pendências com responsável.

Inventário, diagrama e ficha

Só se gere o que se conhece. O inventário lista cada equipamento com função, localização, responsável, interfaces, endereços, versão do sistema, garantia e contrato de suporte. O diagrama lógico mostra como os equipamentos se ligam (redes, VLAN, encaminhadores, ligações ao operador); o diagrama físico mostra bastidores, tomadas e cabos. A ficha de equipamento junta o que é preciso para o substituir ou recuperar. Estes documentos sustentam a continuidade de serviço (NIST SP 800-34) e a gestão de configurações (NIST SP 800-128).

A documentação não guarda segredos: palavras-passe, chaves e cadeias SNMP ficam num cofre de credenciais com acesso controlado; no inventário escreve-se apenas onde estão e quem as gere. Um inventário também é informação sensível — mostra a quem ataca o que existe — e deve ter acesso restrito.

Automatizar e confrontar

Um inventário escrito à mão desactualiza-se. Recolher dados dos próprios equipamentos (aqui com 'ip -j', que devolve JSON; em equipamentos reais por SNMP, API ou exportação de configuração) dá uma fotografia do estado real. A fotografia não substitui a documentação: não diz a função, o dono, nem se aquele endereço devia existir. Por isso compara-se o gerado com o documentado e cada diferença vira uma pendência: corrigir o documento ou corrigir o equipamento, com responsável e prazo.

Um script de recolha deve falhar de forma clara: dizer qual equipamento não respondeu, não escrever um ficheiro meio vazio sem aviso e terminar com código de erro, para que quem o agenda perceba que algo correu mal.

Caso fictício

A DPE (fictícia) recebeu um técnico novo. O único diagrama tem dois anos e a folha de endereços diz que a delegação usa 10.20.20.0/24. O chefe pede um inventário actualizado da rede de prática que reproduz a sede e a delegação, e uma lista de diferenças para decidir o que corrigir. Todos os dados são fictícios.

Prática guiada em rede isolada

Rede de prática fictícia, criada dentro de um computador de prática com o script base (módulo 1, lição 1). Nunca use estes passos na rede de produção nem contra endereços reais. As saídas mostradas são exemplos didácticos, não resultados de uma execução.

Topologia (descrição em texto)

  • pc-adm (10.10.10.10) — ligado a r1 pela VLAN 10.
  • srv (10.10.20.53) — ligado a r1 pela VLAN 20.
  • r1 (encaminhador da sede) — ligado a pc-adm, srv, r2 e isp.
  • r2 (encaminhador da delegação) — ligado a r1 e a pc-del (10.20.10.10).
  • isp (operador simulado) — ligado a r1 e ao servidor externo 198.51.100.10 (endereço dentro de isp).
  • Documento «antigo» fictício a confrontar: delegação 10.20.20.0/24; ligação WAN 10.255.0.0/30; servidor 10.10.20.53; sem referência ao operador simulado (isp).
  • O script ignora o endereço 198.51.100.10/32 da interface lo do isp (as interfaces lo são excluídas de propósito); a lacuna é discutida no fim.

Passos

  1. Pré-verificação (não altera nada): ferramentas presentes, rede DPE activa, delegação chega ao srv e a pasta de trabalho do módulo ainda não existe (se existir, pode ter dados de outra pessoa ou de outra lição: pare e confirme antes de continuar).

    for d in python3 git snmpget snmpwalk snmpd rsyslogd logger iperf3 sha256sum; do command -v $d >/dev/null || echo "Em falta: $d"; done
    ip netns list | grep -cE '^(pc-adm|srv|r1|r2|pc-del|isp)( |$)'
    sudo ip netns exec pc-del ping -c 2 10.10.20.53 | tail -2
    test -e /tmp/dpe-m11 && echo 'ATENÇÃO: /tmp/dpe-m11 já existe' || echo 'pasta livre'

    Saída de exemplo (didáctica):

    (nenhuma linha «Em falta»)
    6
    2 packets transmitted, 2 received, 0% packet loss
    pasta livre
  2. Crie a pasta de trabalho do módulo e grave o script de inventário (texto completo abaixo).

    mkdir -p /tmp/dpe-m11/l1 && cd /tmp/dpe-m11/l1
    cat > inventario.py <<'EOF'
    #!/usr/bin/env python3
    """inventario.py — inventário IPv4 da rede de prática DPE (fictícia).
    Uso: sudo python3 inventario.py SAIDA.csv
    Lê cada espaço de nomes com 'ip -j addr' e escreve um CSV. Não altera nada."""
    import csv, json, subprocess, sys
    
    NOMES = ["pc-adm", "srv", "r1", "r2", "pc-del", "isp"]
    
    def ler(ns):
        try:
            r = subprocess.run(["ip", "-n", ns, "-j", "addr", "show"],
                               capture_output=True, text=True, check=True, timeout=10)
            return json.loads(r.stdout)
        except (subprocess.CalledProcessError, subprocess.TimeoutExpired, json.JSONDecodeError) as e:
            print(f"ERRO ao ler {ns}: {getattr(e, 'stderr', '') or e}".strip(), file=sys.stderr)
            return None
    
    if len(sys.argv) != 2:
        sys.exit("Uso: sudo python3 inventario.py SAIDA.csv")
    linhas, donos, falhas = [], {}, 0
    for ns in NOMES:
        dados = ler(ns)
        if dados is None:
            falhas += 1
            continue
        for itf in dados:
            if itf["ifname"] == "lo":
                continue
            for a in itf.get("addr_info", []):
                if a.get("family") != "inet":
                    continue
                linhas.append([ns, itf["ifname"], itf.get("address", ""),
                               f"{a['local']}/{a['prefixlen']}", itf.get("operstate", "")])
                donos.setdefault(a["local"], []).append(ns)
    try:
        with open(sys.argv[1], "w", newline="") as f:
            w = csv.writer(f)
            w.writerow(["equipamento", "interface", "mac", "ipv4", "estado"])
            w.writerows(linhas)
    except OSError as e:
        sys.exit(f"ERRO ao escrever {sys.argv[1]}: {e}")
    for ip, ns in donos.items():
        if len(ns) > 1:
            print(f"AVISO: {ip} repetido em {', '.join(ns)}")
    print(f"{len(linhas)} endereços inventariados; {falhas} equipamento(s) com erro.")
    sys.exit(1 if falhas else 0)
    EOF
  3. Execute o script e veja o CSV.

    sudo python3 inventario.py inventario.csv; echo "código=$?"
    column -s, -t inventario.csv

    Saída de exemplo (didáctica):

    10 endereços inventariados; 0 equipamento(s) com erro.
    código=0
    equipamento  interface  mac                ipv4            estado
    pc-adm       pc-adm-r1  0a:1b:…:01         10.10.10.10/24  UP
    srv          srv-r1     0a:1b:…:02         10.10.20.53/24  UP
    r1           r1-pc-adm  …                  10.10.10.1/24   UP
    r1           r1-srv     …                  10.10.20.1/24   UP
    r1           r1-r2      …                  10.255.0.1/30   UP
    r1           r1-isp     …                  203.0.113.2/24  UP
    r2           r2-r1      …                  10.255.0.2/30   UP
    r2           r2-pc-del  …                  10.20.10.1/24   UP
    pc-del       pc-del-r2  …                  10.20.10.10/24  UP
    isp          isp-r1     …                  203.0.113.1/24  UP
    (os endereços MAC variam em cada VM)
  4. Teste o tratamento de erros: destino onde não se pode escrever. O script deve dizer porquê e terminar com código diferente de 0.

    sudo python3 inventario.py /pasta-inexistente/x.csv; echo "código=$?"

    Saída de exemplo (didáctica):

    ERRO ao escrever /pasta-inexistente/x.csv: [Errno 2] No such file or directory: '/pasta-inexistente/x.csv'
    código=1
  5. Teste a detecção de repetidos: acrescente temporariamente, no pc-del, um endereço igual ao do srv; corra o script; retire o endereço logo a seguir.

    sudo ip -n pc-del addr add 10.10.20.53/32 dev pc-del-r2
    sudo python3 inventario.py teste.csv
    sudo ip -n pc-del addr del 10.10.20.53/32 dev pc-del-r2

    Saída de exemplo (didáctica):

    AVISO: 10.10.20.53 repetido em srv, pc-del
    11 endereços inventariados; 0 equipamento(s) com erro.
  6. Escreva o diagrama lógico em texto e a lista de diferenças face ao documento antigo, com responsável e prazo (fictícios).

    nano /tmp/dpe-m11/l1/diagrama.txt
    nano /tmp/dpe-m11/l1/diferencas.txt

Critérios de sucesso

  • O CSV lista os 10 endereços IPv4 das interfaces não-lo, com estado UP.
  • O script termina com código 1 e mensagem clara quando não consegue escrever, e avisa o endereço repetido.
  • A lista de diferenças inclui pelo menos: rede da delegação (10.20.10.0/24 real vs 10.20.20.0/24 documentada), ligação ao operador em falta no documento, e o endereço em lo do isp não inventariado pelo script.
  • Nenhum documento produzido contém palavras-passe ou chaves.

Como desfazer (reversão)

  • Confirmar que o endereço de teste foi retirado: sudo ip -n pc-del addr show dev pc-del-r2 mostra só 10.20.10.10/24 (se não, sudo ip -n pc-del addr del 10.10.20.53/32 dev pc-del-r2).
  • Guardar os ficheiros fora da VM, se necessário, e depois: rm -r /tmp/dpe-m11/l1 (se for a última lição do módulo nesta VM: rm -r /tmp/dpe-m11).

Alternativa em papel: tarefas e respostas esperadas

A partir da saída de exemplo do CSV, desenhe o diagrama lógico com redes e encaminhadores.
pc-adm (10.10.10.10) — rede 10.10.10.0/24 — r1; srv (10.10.20.53) — 10.10.20.0/24 — r1; r1 (10.255.0.1) — WAN 10.255.0.0/30 — r2 (10.255.0.2); r2 — 10.20.10.0/24 — pc-del (10.20.10.10); r1 (203.0.113.2) — 203.0.113.0/24 — isp (203.0.113.1).
Liste as diferenças entre o CSV de exemplo e o documento antigo, e para cada uma diga se corrige o documento ou o equipamento.
1) Delegação 10.20.10.0/24 no equipamento vs 10.20.20.0/24 no documento → confirmar com o responsável; muito provavelmente corrigir o documento. 2) Ligação r1–isp não documentada → acrescentar ao documento. 3) 198.51.100.10/32 em lo do isp não aparece no CSV → limitação do script; documentar ou melhorar o script.
Um colega quer pôr a palavra-passe de administração de cada encaminhador numa coluna do inventário «para facilitar». Responda.
Não. O inventário é partilhado e mostra toda a rede; as credenciais ficam num cofre com acesso controlado e registo. No inventário indica-se só o cofre e o responsável.
Que campos acrescentaria à ficha de equipamento do r1 que o script não consegue recolher?
Função, localização, responsável, fabricante/modelo e número de série, versão do sistema, data de aquisição e garantia, contrato de suporte, dependências (serviços que param se falhar) e procedimento de recuperação.

Verifique o que aprendeu

Questão 1

Porque o script termina com código 1 quando um equipamento não responde?

  1. Para apagar o CSV
  2. Para que quem o executa ou agenda saiba que o inventário está incompleto
  3. Porque o Python obriga
  4. Para reiniciar o equipamento
Ver resposta comentada

Resposta: Para que quem o executa ou agenda saiba que o inventário está incompleto

Um inventário incompleto que parece completo é perigoso. O código de saída e a mensagem de erro permitem detectar a falha automaticamente.

Questão 2

O inventário gerado automaticamente substitui a documentação?

  1. Sim, completamente
  2. Não: mostra o estado real, mas não a função, o responsável nem se o estado está correcto; compara-se com o documentado
  3. Sim, se tiver endereços MAC
  4. Não, porque o JSON é ilegível
Ver resposta comentada

Resposta: Não: mostra o estado real, mas não a função, o responsável nem se o estado está correcto; compara-se com o documentado

A recolha mostra o que existe; a documentação diz o que devia existir e porquê. As diferenças entre os dois são as pendências a resolver.

Em leitura fácil

  • O inventário é a lista de tudo o que há na rede.
  • O diagrama mostra como tudo está ligado.
  • Um programa pode recolher a lista automaticamente.
  • Compare a lista nova com os papéis antigos.
  • Nunca escreva palavras-passe no inventário.

Fontes

  • NIST SP 800-34 Rev. 1 — Contingency Planning Guide (https://csrc.nist.gov/pubs/sp/800/34/r1/upd1/final)
  • NIST SP 800-128 — Guide for Security-Focused Configuration Management of Information Systems (https://csrc.nist.gov/pubs/sp/800/128/upd1/final)
  • Linux iproute2 — páginas de manual ip(8), ip-netns(8), bridge(8), tc(8) (https://man7.org/linux/man-pages/man8/ip.8.html)
  • Python 3 — documentação oficial dos módulos json, csv, subprocess e statistics (https://docs.python.org/3/library/)
  • IETF RFC 1918 — Address Allocation for Private Internets (https://www.rfc-editor.org/rfc/rfc1918)
  • IETF RFC 5737 — IPv4 Address Blocks Reserved for Documentation (https://www.rfc-editor.org/rfc/rfc5737)

Progresso apenas neste aparelho. Sem sessão iniciada com matrícula numa turma deste curso, o que marcar fica guardado só aqui e não conta para a sua formação.

Marcar uma lição como feita não regista presença, não dá aprovação nem emite certificado.