Capítulo 9 — Programação II
Mapa da aula
Aula 09 publicada. Mapa, exemplo, EX025.
flowchart TD
N0["9.1 Estruturando ferramentas"]
N1["9.2 Testando com casos conhecidos"]
N2["9.3 Tratando segredos"]
N3["9.4 Dependências e cadeia de suprimentos"]
N0 --> N1 --> N2 --> N3
N3 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX025"]
Desenho lógico
flowchart LR
N0["9.1 Estruturando ferramentas"]
N1["9.2 Testando com casos conhecidos"]
N2["9.3 Tratando segredos"]
N3["9.4 Dependências e cadeia de suprimentos"]
N0 --> N1 --> N2 --> N3 --> Q["EX025"]
[9.1 Estruturando ferramentas]
|
v
[9.2 Testando com casos conhecidos]
|
v
[9.3 Tratando segredos]
|
v
[9.4 Dependências e cadeia de suprimentos]
|
v
[Exemplo resolvido] --> [Exercício EX025]
Objetivos de aprendizagem
Você vai (1) estruturar ferramentas de segurança maiores; (2) testar código com casos conhecidos; (3) tratar segredos com segurança nos programas.
9.1 Estruturando ferramentas
Os scripts de Lindiwe crescem, então ela os organiza em funções com entradas e saídas claras: uma lê as contas, uma aplica as regras e uma escreve os relatórios. Cada função faz uma única tarefa e pode ser testada sozinha. O Prof. Hale explica que a estrutura importa mais nas ferramentas de segurança do que em outros lugares, porque um bug escondido pode relatar que tudo está em conformidade quando não está, e ninguém vai perceber até que um incidente prove o contrário. Ela também escreve uma breve descrição no início de cada função explicando o que ela verifica.
9.2 Testando com casos conhecidos
Lindiwe escreve testes usando pequenas entradas sintéticas cujas respostas corretas ela conhece: uma conta sem autenticação multifator e com direitos de administrador deve ser sinalizada; uma conta normal não deve. Ela executa os testes depois de cada mudança usando o módulo padrão unittest. Quando uma mudança posterior quebra a verificação de administradores, um teste falha de imediato. Ela aprende que os testes são a evidência de que uma verificação de segurança faz o que seu nome promete. No fim do semestre, seu arquivo de testes tem vinte casos, cada um com o nome da regra que verifica.
9.3 Tratando segredos
Uma ferramenta precisa chamar o diretório da Saltmarsh usando a senha de uma conta de serviço. A primeira versão de Lindiwe guardava a senha no script, que depois foi compartilhado num canal de chat. Ela reescreve a ferramenta para ler as credenciais de uma variável de ambiente definida pelo agendador e pede que a senha exposta seja trocada. O Prof. Hale observa que os segredos no código acabam em backups, repositórios e mensagens, muito além do público pretendido. A equipe do diretório rotaciona a senha em menos de uma hora depois do relato dela.
9.4 Dependências e cadeia de suprimentos
Lindiwe pensa em acrescentar uma biblioteca de terceiros para interpretar um formato de log. Ela confere quem a mantém, quando foi atualizada pela última vez e se tem vulnerabilidades conhecidas. Ela decide escrever ela mesma um pequeno interpretador, porque o formato é simples e a biblioteca não é mantida. Ela aprende que cada dependência amplia o código em que uma organização confia, e que manter as ferramentas de segurança pequenas reduz essa exposição. Seu interpretador tem oitenta linhas e é coberto por testes próprios. O Prof. Hale pede que ela registre os motivos dessa escolha num breve registro de decisão.
Exemplo resolvido
Lindiwe estrutura sua ferramenta em funções testáveis, acrescenta testes unitários com casos conhecidos, move uma senha vazada para uma variável de ambiente e evita uma dependência sem manutenção.
Caso sintético. O código é sintético.
Erros e limites
Uma senha incluída no código deve ser tratada como exposta e trocada.
Exercícios
-
EX025 — Módulo de testes. Que módulo executa os testes dela? Rubrica: 3 = unittest;; 2 = parcialmente correto;; 1 = outro;; 0 = nenhuma.
-
EX026 — Armazenamento de segredos. De onde a ferramenta lê as credenciais? Rubrica: 3 = uma variável de ambiente definida pelo agendador;; 2 = parcialmente correto;; 1 = código;; 0 = nenhuma.
-
EX027 — Escolha do interpretador. Por que escrever o próprio interpretador? Rubrica: 3 = formato simples, biblioteca sem manutenção;; 2 = parcialmente correto;; 1 = vago;; 0 = nenhuma.
Continue estudando — aula 09 (capítulo 09 de 50)
← Capítulo 08 · Índice das aulas · Capítulo 10 →
Continue para a próxima aula já escrita.