<a id="ch-04"></a>

## Capítulo 4 — Cibersegurança: laboratório guiado e síntese aplicada

### Objetivos de aprendizagem

Ao final deste capítulo, você deve ser capaz de:

1. Aplicar uma regra escrita a uma ação sintética da equipe e nomear o veredito que a regra produz.
2. Separar a classificação de uma proposta registrada de uma decisão de que o serviço real é seguro.
3. Explicar por que ALLOW, REFUSE, OUT OF SCOPE e STOP respondem a perguntas diferentes.
4. Declarar um fato que o programa offline não pode saber.
5. Escrever um dossiê curto que mantenha a observação, a decisão e o limite em frases separadas.

### 4.1 Cinco rótulos, quatro ações registradas

Os capítulos 1–3 deixaram uma pessoa do balcão com uma agenda de papel das 09:00, duas reservas inventadas e uma regra: não confirmar uma sala posterior a partir desse papel, não abrir um site ao vivo e não puxar a lista de contatos de eventos para dentro do exercício de reserva. O capítulo 4 transforma essa regra numa verificação que uma segunda pessoa pode executar de novo.

A verificação tem cinco rótulos possíveis. Quatro aparecem no registro das quatro ações; `UNKNOWN` permanece com contagem zero. São rótulos deste exercício, não uma escala de severidade.

| Veredito | Pergunta que responde | O que não responde |
|---|---|---|
| STOP | Esta ação saiu do exercício em papel? | Se um site real está sob ataque |
| OUT OF SCOPE | Este conjunto de dados está fora da decisão de reserva? | Se a lista de contatos está bem protegida |
| REFUSE | O instantâneo das 09:00 omite uma reserva posterior para essa sala e esse início? | Por que a página de reservas estava indisponível |
| ALLOW | A regra escrita permite esta ação registrada? | Se a Sala 2 está de fato livre |
| UNKNOWN | A ação está ausente do conjunto de regras? | O que o responsável decidiria depois de ser perguntado |

Um número como 7.4 esconderia qual destas perguntas mudou. Este capítulo não atribui nota à biblioteca.

### 4.2 O programa lê a premissa do exercício

O laboratório abaixo é Python da biblioteca padrão. Ele codifica três premissas já fixadas neste livro: o horário da impressão é 09:00, `SYN-002` foi criada às 10:05 para a Sala 2 às 15:00, e os contatos de eventos estão fora do caminho da reserva. Ele não lê o *relato* do responsável, no capítulo 3, de uma folha offline das 11:40. Esse relato continua não verificado, então o programa não deve tratá-lo como uma impressão mais nova.

`REFUSE` só dispara quando uma ação de confirmar pela impressão nomeia uma sala e um início cuja reserva foi criada depois das 09:00. `ALLOW` em marcar pendente significa que a regra aceita uma fila de pendências. `ALLOW` numa confirmação significa apenas que nenhuma reserva posterior nesta tabela minúscula corresponde àquela sala e àquele início. Uma sala diferente pode, portanto, imprimir ALLOW e continuar desconhecida no prédio real.

### 4.3 Exemplo resolvido: quatro ações

Use as mesmas linhas que o programa usa.

| Horário | Ação | Por que a regra fala | Veredito |
|---|---|---|---|
| 11:42 | Confirmar a Sala 2 às 15:00 pelo papel | `SYN-002` foi criada às 10:05, depois da impressão | REFUSE |
| 11:43 | Exportar contatos de eventos | Contatos de anúncio não são a decisão de reserva | OUT OF SCOPE |
| 11:44 | Abrir o site ao vivo de reservas | O briefing proíbe sistemas de produção | STOP |
| 11:45 | Marcar o pedido das 15:00 como pendente | A regra alternativa permite uma fila de pendências | ALLOW |

A linha das 11:44 classifica uma *proposta registrada*. Por si, ela não interrompe uma sala de aula. Num ensaio ao vivo, o responsável ainda pausa as pessoas, como o capítulo 2 exigiu. O programa segue para que as outras três linhas continuem visíveis. Essa diferença é um limite do programa, não uma condição de parada mais branda.

### 4.4 Laboratório: classifique o registro sintético

Salve este programa como `lab_dossier.py` e execute-o com `python3 lab_dossier.py`. Não o aponte para uma rede, para o site de uma biblioteca ou para um arquivo de frequentadores reais. A saída esperada é fixa para estas linhas. Se a sua saída diferir, a regra que você executou não é a regra deste capítulo.

```python
"""Harbor Library tabletop dossier. Synthetic records only."""

PRINTOUT = "09:00"

BOOKINGS = [
    {"id": "SYN-001", "room": "Room 2", "start": "14:00", "created": "08:20", "status": "confirmed"},
    {"id": "SYN-002", "room": "Room 2", "start": "15:00", "created": "10:05", "status": "confirmed"},
]

ACTIONS = [
    {"time": "11:42", "action": "confirm-from-printout", "room": "Room 2", "start": "15:00"},
    {"time": "11:43", "action": "export-contacts"},
    {"time": "11:44", "action": "open-live-site"},
    {"time": "11:45", "action": "mark-pending", "room": "Room 2", "start": "15:00"},
]


def minutes(clock):
    hour, minute = clock.split(":")
    return int(hour) * 60 + int(minute)


def decide(action):
    kind = action["action"]
    if kind == "open-live-site":
        return "STOP", "live site is outside the paper exercise"
    if kind == "export-contacts":
        return "OUT OF SCOPE", "event contacts are outside the booking decision"
    if kind == "confirm-from-printout":
        later = [
            booking["id"]
            for booking in BOOKINGS
            if booking["room"] == action["room"]
            and booking["start"] == action["start"]
            and minutes(booking["created"]) > minutes(PRINTOUT)
        ]
        if later:
            return "REFUSE", "printout 09:00 omits " + ",".join(later)
        return "ALLOW", "no later booking is recorded for that room and start"
    if kind == "mark-pending":
        return "ALLOW", "pending until an approved current source"
    return "UNKNOWN", "the written rule set does not name this action"


def main():
    print("printout: 09:00; bookings: 2")
    omitted = [booking["id"] for booking in BOOKINGS if minutes(booking["created"]) > minutes(PRINTOUT)]
    print("omitted by printout: " + ",".join(omitted))
    counts = {"STOP": 0, "OUT OF SCOPE": 0, "REFUSE": 0, "ALLOW": 0, "UNKNOWN": 0}
    for action in ACTIONS:
        verdict, reason = decide(action)
        counts[verdict] += 1
        print(f"{action['time']} {action['action']}: {verdict}; {reason}")
    print(
        "STOP {STOP}; OUT OF SCOPE {OUT OF SCOPE}; REFUSE {REFUSE}; ALLOW {ALLOW}; UNKNOWN {UNKNOWN}".format(
            **counts
        )
    )


if __name__ == "__main__":
    main()
```

Saída exata, conferida com Python 3:

```text
printout: 09:00; bookings: 2
omitted by printout: SYN-002
11:42 confirm-from-printout: REFUSE; printout 09:00 omits SYN-002
11:43 export-contacts: OUT OF SCOPE; event contacts are outside the booking decision
11:44 open-live-site: STOP; live site is outside the paper exercise
11:45 mark-pending: ALLOW; pending until an approved current source
STOP 1; OUT OF SCOPE 1; REFUSE 1; ALLOW 1; UNKNOWN 0
```

A linha de contagem é uma contagem destas quatro linhas. Não é uma classificação de risco. Mudar a sala das 11:42 para a Sala 4, que não aparece em `BOOKINGS`, faz essa linha imprimir ALLOW. O novo ALLOW significa que a tabela não tem reserva posterior para a Sala 4 às 15:00. Não significa que um morador pode ficar com a sala.

### 4.5 Um dossiê usa só o que a execução mostrou

Escreva seis frases curtas e pare. A frase 1 nomeia o exercício e a premissa das 09:00. A frase 2 cita uma linha da saída. A frase 3 declara a decisão que essa linha sustenta. A frase 4 nomeia um veredito que não deve ser fundido com ela: exportar contatos é OUT OF SCOPE, não REFUSE, porque a lista de contatos nunca foi uma comparação de horário de reserva. A frase 5 diz que o programa não inspecionou um depósito de reservas e não aceitou o relato não verificado das 11:40. A frase 6 nomeia a pergunta ao responsável que continua aberta: qual fonte aprovada, se alguma, pode substituir o papel das 09:00.

Se a frase 5 estiver em branco, a nota não está pronta para orientar uma mudança de procedimento. Um limite em branco permite que um leitor trate uma contagem de sala de aula como um achado sobre os sistemas reais da Harbor Library, que este livro não tem.

### Resumo do capítulo 4

Uma regra escrita pode classificar uma ação sintética do mesmo modo duas vezes. STOP, OUT OF SCOPE, REFUSE, ALLOW e UNKNOWN respondem a perguntas diferentes. O ALLOW do programa é permissão sob as linhas que lhe foram dadas, não evidência de que uma sala está livre ou de que uma folha relatada das 11:40 existe. O dossiê mantém separados a saída, a decisão e o limite.

### Exercícios do capítulo 4

Use o programa e a saída da seção 4.4. Não contate uma biblioteca real. As resoluções estão no apêndice.

### EX016 — Leia a contagem

- **Objetivo:** Ligar um veredito à linha que o produziu.
- **Entrada:** A saída exata do laboratório na seção 4.4.
- **Condição segura:** Não acrescente reservas nem abra um site.
- **Tarefa:** Nomeie a ação que recebeu REFUSE, o identificador de reserva que o motivo cita e a premissa que torna esse identificador ausente do papel.
- **Evidência esperada:** Três itens, cada um tirado da saída ou do instantâneo declarado das 09:00.
- *Rubrica:* 3 = a ação é a confirmação das 11:42, o identificador é `SYN-002` e a premissa é a impressão das 09:00, não um ataque inferido;; 2 = dois dos três itens, sem inferir ataque;; 1 = atribui a lacuna a um ataque;; 0 = nenhuma.

### EX017 — ALLOW não é disponibilidade

- **Objetivo:** Limitar o que uma regra de correspondência pode significar.
- **Entrada:** Mude só a ação das 11:42 para que a sala seja a Sala 4 e o início continue 15:00. Deixe todas as outras linhas como impressas.
- **Condição segura:** Edite a tabela sintética no papel ou numa cópia local. Não consulte um sistema ao vivo.
- **Tarefa:** Declare o novo veredito das 11:42 e escreva a frase que um membro da equipe não deve dizer a um morador.
- **Evidência esperada:** O veredito mais uma afirmação proibida.
- *Rubrica:* 3 = ALLOW junto com a recusa de prometer a Sala 4;; 2 = ALLOW, mas a frase proibida fica incompleta;; 1 = chama a sala de livre e, com isso, falha;; 0 = nenhuma.

### EX018 — Não funda os vereditos

- **Objetivo:** Manter um limite de conjunto de dados distinto de uma comparação com papel desatualizado.
- **Entrada:** A linha de saída das 11:43.
- **Condição segura:** Raciocine só a partir dessa linha.
- **Tarefa:** Explique por que a exportação é OUT OF SCOPE e não REFUSE, e nomeie um fato sobre a proteção da lista de contatos que esta execução não fornece.
- **Evidência esperada:** Uma distinção e uma incógnita explícita.
- *Rubrica:* 3 = REFUSE permanece ligado à comparação com a impressão e a lista de contatos continua não medida;; 2 = a distinção está certa, mas a incógnita fica vaga;; 1 = redescreve a exportação como REFUSE;; 0 = nenhuma.

### EX019 — Parada do programa versus parada humana

- **Objetivo:** Notar que uma linha classificada não é o mesmo ato que pausar pessoas.
- **Entrada:** A linha STOP das 11:44 e a regra do capítulo 2 de que uma proposta de site ao vivo pausa o exercício.
- **Condição segura:** Não abra um site para ilustrar o ponto.
- **Tarefa:** Diga o que o programa fez depois de imprimir STOP, o que um facilitador deve fazer com as pessoas participantes e por que essas duas ações diferem.
- **Evidência esperada:** Três frases.
- *Rubrica:* 3 = o programa continua até as 11:45, o facilitador pausa as pessoas e pergunta ao responsável;; 2 = separa programa e pessoas, mas omite a pergunta ao responsável;; 1 = trata o STOP impresso como se já tivesse pausado as pessoas, ou abre um site;; 0 = nenhuma.

### EX020 — Dossiê de seis frases

- **Objetivo:** Relatar a execução sem ampliá-la.
- **Entrada:** A seção 4.5 e a saída do laboratório.
- **Condição segura:** Não invente causa da interrupção, frequentador nem segundo sistema.
- **Tarefa:** Escreva as seis frases. Deixe a frase 5 concreta. Não atribua uma nota numérica.
- **Evidência esperada:** Seis frases que um colega possa conferir contra a saída.
- *Rubrica:* 3 = cada frase permanece dentro da execução, a linha das 11:43 não é redescrita como REFUSE e o relato das 11:40 continua não verificado;; 2 = cinco frases dentro da execução, sem nota numérica;; 1 = atribui nota numérica, causa da interrupção ou trata as 11:43 como REFUSE;; 0 = nenhuma.

<!-- open-cyber-academy:chapter-navigation:start ch-04 -->
### Continue estudando — capítulo 04 de 20

[← Capítulo 03](#ch-03) · [Índice de capítulos](../SUBJECTS.md) · [Capítulo 05 →](#ch-05)

Continue para a próxima aula escrita.
<!-- open-cyber-academy:chapter-navigation:end -->

## Worked answers

<a id="answer-ex016"></a>
### EX016 — Resolução

A linha REFUSE é `11:42 confirm-from-printout`. O motivo nomeia `SYN-002`. Esse identificador está ausente do papel porque a impressão do exercício é fixa às 09:00 e a reserva foi criada às 10:05. A saída não diz que um atacante causou a lacuna.

<a id="answer-ex017"></a>
### EX017 — Resolução

A Sala 4 às 15:00 não tem linha criada depois das 09:00, então a regra imprime ALLOW e o motivo diz que nenhuma reserva posterior está registrada para essa sala e esse início. O membro da equipe não deve dizer a um morador que a Sala 4 está livre. ALLOW aqui significa que a tabela sintética não continha uma reserva posterior em conflito.

<a id="answer-ex018"></a>
### EX018 — Resolução

REFUSE compara um horário de impressão com uma reserva criada depois. A exportação das 11:43 nunca faz essa comparação, então a regra devolve OUT OF SCOPE. Esta execução não mostra quem pode baixar a lista de contatos, por quanto tempo ela é guardada ou se um controle sobre ela funciona.

<a id="answer-ex019"></a>
### EX019 — Resolução

Depois de STOP, o programa ainda imprime a linha de marcar pendente das 11:45 e a contagem final. Um facilitador pausa as pessoas participantes, não deixa ninguém abrir um site e pergunta ao responsável pelo exercício o que acontece em seguida. O programa está reproduzindo um registro; o facilitador é responsável pelas pessoas na sala.

<a id="answer-ex020"></a>
### EX020 — Resolução

Uma nota aceitável: O exercício classificou quatro ações sintéticas contra uma impressão das 09:00. Às 11:42 o programa recusou a confirmação da Sala 2 às 15:00 porque o papel omite `SYN-002`. A decisão é deixar esse pedido pendente em vez de confirmá-lo a partir do papel. A exportação das 11:43 está fora de escopo, não é uma reserva recusada. O programa não abriu um depósito de reservas e não tratou a folha relatada das 11:40 como verificada. A pergunta aberta para o responsável é qual fonte aprovada, se alguma, pode substituir o papel das 09:00. Nenhuma nota numérica cabe na nota.
