
Arquitetura de Software
Como transformar arquitetura, dados e limites de confiança em decisões concretas de segurança
Um sistema não se torna seguro porque possui autenticação, criptografia ou um firewall. Ele se torna mais seguro quando o time entende o que está protegendo, como os dados atravessam a arquitetura, onde a confiança muda e de que formas o sistema pode ser abusado.
Este artigo inaugura a série Engineering Security in Practice.
A proposta da série não é apresentar segurança como uma coleção de produtos, siglas ou serviços isolados. O objetivo é construir um método de engenharia que permita responder, para cada arquitetura:
Neste primeiro capítulo, usaremos Threat Modeling e Data Flow Diagrams — DFDs para transformar uma arquitetura em um conjunto de ameaças, decisões e ações rastreáveis.
O estudo de caso será um sistema modular de saúde com pacientes, diagnósticos, documentos, mensageria, auditoria e integrações. O domínio foi escolhido porque combina requisitos técnicos comuns a muitos sistemas:
O método, porém, é independente de provedor e pode ser aplicado a e-commerce, fintech, SaaS B2B, sistemas governamentais, IoT, plataformas educacionais e aplicações com IA.
Um diagrama de arquitetura tradicional costuma responder:
Isso é necessário, mas insuficiente para segurança.
Considere o diagrama simplificado:
Ele comunica a estrutura básica, mas não responde:
Um Data Flow Diagram orientado a Threat Modeling torna essas questões explícitas.
A OWASP trata DFDs como uma das abordagens mais comuns para modelar um sistema antes de identificar ameaças. A AWS também recomenda usar diagramas, como DFDs, para estabelecer o escopo e compreender o workload antes de priorizar mitigações. [1][2]
Threat Modeling é um processo estruturado para:
A OWASP organiza a prática por meio de quatro perguntas:
Essa estrutura corrige um erro comum: começar pela ferramenta ou pelo controle.
Uma conversa de segurança frequentemente começa assim:
Devemos usar WAF, criptografia, SIEM ou Zero Trust?
A pergunta correta vem antes:
Qual ameaça estamos tentando reduzir?
Um controle só pode ser avaliado quando existe clareza sobre:
A AWS classifica a ausência de Threat Modeling como uma prática de alto risco no pilar de segurança do Well-Architected Framework e recomenda manter um registro atualizado de ameaças e mitigações, revisado conforme o workload e o cenário de segurança evoluem. [2]
Pentest testa uma implementação existente, geralmente procurando formas reais de explorar falhas.
Threat Modeling pode ocorrer antes da implementação e busca identificar problemas de design.
Threat Modeling
identifica riscos de design
↓
Requisitos e controles de segurança
↓
Implementação
↓
Testes automatizados e revisão
↓
Pentest
valida cenários na solução implementada
Um scanner identifica vulnerabilidades conhecidas em:
Ele dificilmente entende sozinho uma falha como:
Um profissional autenticado consegue acessar o documento de outra organização porque o endpoint valida apenas o
documentId, mas não otenantId.
Essa é uma falha de autorização contextual. Threat Modeling ajuda a encontrá-la ainda no design.
Checklists ajudam, mas não substituem contexto.
A mesma tecnologia pode representar riscos diferentes em arquiteturas diferentes. Uma fila pode ser:
O componente é o mesmo; o risco não.
O objetivo não é produzir uma arquitetura “sem ameaças”.
O objetivo é:
Um DFD representa como os dados entram, circulam, são processados e são armazenados.
Os elementos fundamentais são:
| Elemento | Função | Pergunta de segurança |
|---|---|---|
| Entidade externa | Pessoa ou sistema fora do controle direto do processo modelado | Quem inicia a interação? |
| Processo | Componente que recebe, transforma ou produz dados | Que validações e permissões existem? |
| Data store | Local em que dados são persistidos | Quem lê, altera ou exclui? |
| Data flow | Dados em trânsito entre elementos | O que está sendo transportado? |
| Trust boundary | Local em que o nível de confiança muda | Que controle é obrigatório nessa travessia? |
A Microsoft destaca esses mesmos elementos em seu treinamento de DFD para Threat Modeling, incluindo processo, data store, entidade externa, fluxo e trust boundary. [3]
Exemplos:
Entidade externa não significa necessariamente maliciosa. Significa que ela está fora do limite de controle daquele processo.
Exemplos:
O processo deve ter responsabilidade clara.
Um processo chamado Core Service que valida, coordena, persiste, publica e integra tudo pode esconder acoplamento e dificultar a análise.
Exemplos:
O DFD deve registrar não apenas “Database”, mas que dados estão armazenados e qual módulo é responsável por eles.
Uma seta sem descrição tem pouco valor.
Evite:
Patient Service → Database
Prefira:
Patient Service → Database
Dados: cadastro, vínculo com clínica e metadados de consentimento
Protocolo: conexão privada com TLS
Autorização: role exclusiva do serviço
Trust boundary é o ponto em que mudam:
Exemplos:
Internet → aplicação
Frontend → backend
Conta cloud A → conta cloud B
Tenant A → plataforma compartilhada
Aplicação → provedor externo
Serviço → banco
Usuário → função administrativa
Sistema → modelo de IA
A OWASP e a documentação de DFD da Microsoft descrevem trust boundaries como mudanças de zona ou de controle que precisam ser explicitamente modeladas. [3][10]
Uma fronteira de confiança não é sinônimo de firewall, VPC ou subnet. Ela representa uma mudança relevante nas suposições de confiança ou no controle administrativo. Para evitar diagramas ambíguos, registre a dimensão da fronteira:
| ID | Dimensão | Exemplo | Pergunta de revisão |
|---|---|---|---|
| B1 | Controle administrativo | Plataforma → IdP externo | Quem administra o componente? |
| B2 | Identidade | Paciente → API | Como a identidade é autenticada? |
| B3 | Autorização | Gateway → serviço de domínio | Quem decide acesso ao recurso? |
| B4 | Tenant | Clínica A → dados compartilhados | Como o isolamento é aplicado? |
| B5 | Dados | Serviço → object storage | A classificação muda nesse ponto? |
| B6 | Operação | Produção → suporte ou CI/CD | Quem pode operar ou alterar o sistema? |
Uma mesma conexão pode cruzar mais de uma dimensão. O modelo deve explicitar isso em vez de sugerir que uma única linha tracejada resolve toda a análise.
Vamos modelar um sistema com os seguintes módulos:
subject, tenantId e roles;Suposições devem ser registradas porque podem estar erradas. Uma suposição não verificada é uma possível ameaça futura.
O recorte precisa declarar quem pode atacar, falhar ou operar o sistema:
| Ator | Capacidade assumida | Pergunta de segurança |
|---|---|---|
| Internet não autenticada | envia requisições e tenta explorar endpoints | quais entradas são públicas? |
| Paciente autenticado | acessa recursos próprios | o objeto é validado além da sessão? |
| Profissional comprometido | usa uma identidade válida | há limites de tenant, propósito e comportamento? |
| Administrador do tenant | administra recursos da própria clínica | pode exportar dados em massa? |
| Workload comprometido | usa permissões do serviço | quais são o blast radius e a revogação? |
| Suporte ou operador | acessa ferramentas administrativas | existe acesso emergencial, justificativa e auditoria? |
| Provedor ou dependência indisponível | falha ou retorna dados inválidos | o sistema degrada sem violar confidencialidade? |
Nesta primeira versão, o foco é o caminho diagnóstico → documento → auditoria. Backup e restauração, disaster recovery, endpoint management, segurança física e conformidade jurídica ficam fora do recorte, mas devem aparecer como itens pendentes ou em modelos complementares.
O caso é fictício e educacional. A expressão “sistema de saúde” não significa que o desenho esteja pronto para uso clínico ou regulado.
Esse diagrama revela três fronteiras:
Para que o diagrama seja útil em uma revisão real, cada fluxo crítico deve ter contexto suficiente para responder:
O Gateway pode validar o token e propagar um contexto de identidade, mas o serviço de domínio precisa revalidar autorização de recurso, tenant e ação. A borda não conhece todas as regras clínicas ou relacionamentos entre profissional e paciente.
O fluxo acima separa autenticação de autorização e mostra que a emissão de uma URL temporária acontece somente depois da decisão de acesso.
| ID | Origem | Destino | Dados | Classificação | Controle esperado |
|---|---|---|---|---|---|
| F01 | Paciente | Gateway | token, patientId, request | PII / autenticação | TLS, token validation, rate limit |
| F02 | Profissional | Gateway | token, tenantId, request | PII / privilégio | MFA, TLS, autorização |
| F03 | Gateway | IdP | token / metadata | autenticação | TLS, audience, issuer, expiry |
| F04 | AuthZ | Patient Service | subject, tenant, action | interno restrito | policy enforcement |
| F05 | Diagnostic Service | Diagnostic DB | diagnóstico | dado sensível de saúde | TLS, encryption, role exclusiva |
| F06 | Diagnostic Service | Broker | evento de diagnóstico | sensível minimizado | assinatura, schema, ACL |
| F07 | Broker | Document Service | evento | sensível minimizado | consumer identity, idempotência |
| F08 | Document Service | Object Storage | documento clínico | restrito | bucket privado, encryption, signed URL |
| F09 | Serviços | Audit Service | eventos de auditoria | confidencial | append-only, integrity, retention |
| F10 | Notification Service | Provedor externo | mensagem mínima | PII minimizada | redaction, contrato, TLS |
Não envie o diagnóstico completo em todos os eventos apenas porque ele está disponível.
Prefira:
{
"eventType": "DiagnosticCreated",
"eventId": "evt-123",
"diagnosticId": "diag-456",
"patientReference": "pat-789",
"tenantId": "clinic-001",
"occurredAt": "2026-07-26T15:00:00Z",
"schemaVersion": 1
}
O consumidor autorizado busca os dados necessários pelo identificador.
Isso reduz:
Além do catálogo funcional, mantenha um inventário técnico para os fluxos críticos:
| Campo | Exemplo |
|---|---|
| Identificador | F08 |
| Origem e destino | Document Service → Object Storage |
| Protocolo | HTTPS ou SDK privado |
| Identidade | workload role do Document Service |
| Ação | criar objeto |
| Tenant e recurso | tenantId + documentId |
| Classificação | Restricted / Health Data |
| Retenção | objeto, versão, backup e logs |
| Controles | IAM, bucket privado, KMS, digest |
| Evidência | policy test, integração e alerta |
| Owner | Document Team |
| Revisão | data e mudança que reabre o modelo |
Em eventos assíncronos, adicione producerId, consumerId, correlationId, causationId, schemaVersion, occurredAt, idempotencyKey e uma política explícita para replay, duplicidade, reordenação e DLQ.
Antes de aplicar STRIDE, classifique os dados.
Uma taxonomia interna simples:
| Classe | Exemplo | Tratamento |
|---|---|---|
| Public | documentação pública | acesso aberto |
| Internal | nomes de serviços, IDs técnicos | acesso interno |
| Confidential | contratos, dados operacionais | acesso restrito |
| Restricted | saúde, documentos, segredos | controles reforçados |
Subcategorias úteis:
O NIST destaca que classificar dados permite descobrir, identificar e rotular informações sensíveis, apoiando a redução do risco de perda ou tratamento inadequado. [5]
| Dado | Classe | Pode aparecer em log? | Retenção |
|---|---|---|---|
| Nome do paciente | Personal Data | somente mascarado | política de negócio |
| Diagnóstico | Restricted / Health Data | não | política clínica/legal |
| Documento clínico | Restricted | não | política clínica/legal |
| Access token | Authentication Secret | nunca | não armazenar |
| Request ID | Internal | sim | operacional |
| Tenant ID | Confidential | sim, conforme necessidade | operacional |
| Evento de auditoria | Security Telemetry | sim em store dedicado | retenção reforçada |
| Número de telefone | Personal Data | mascarado | minimizada |
Este artigo usa classificações técnicas. Obrigações legais devem ser avaliadas segundo a jurisdição e o contexto da organização.
Classificar o dado não basta. O modelo também deve perguntar:
STRIDE organiza ameaças de segurança, mas não substitui uma análise de privacidade ou de abuso. Para dados pessoais e de saúde, complemente o modelo com propósito de uso, minimização, acesso emergencial, insider misuse e risco de correlação. A referência [14] apresenta o Privacy Framework do NIST como vocabulário complementar; isso não substitui avaliação jurídica ou regulatória.
STRIDE organiza ameaças em seis categorias:
| Categoria | Propriedade afetada | Pergunta |
|---|---|---|
| Spoofing | Autenticação | Alguém pode se passar por outra identidade? |
| Tampering | Integridade | Dados ou mensagens podem ser alterados? |
| Repudiation | Rastreabilidade | Uma ação pode ocorrer sem evidência confiável? |
| Information Disclosure | Confidencialidade | Dados podem ser expostos? |
| Denial of Service | Disponibilidade | Um recurso pode ser indisponibilizado? |
| Elevation of Privilege | Autorização | Alguém pode obter acesso maior que o permitido? |
A OWASP apresenta STRIDE como uma técnica madura e flexível para identificar ameaças depois que o sistema foi modelado. [6]
STRIDE é um excelente mecanismo de geração de ameaças, mas não deve ser tratado como uma lista universal. Complemente-o quando o contexto exigir:
| Dimensão complementar | Pergunta |
|---|---|
| Privacidade | O sistema coleta, deriva ou conserva dados além da finalidade? |
| Abuso de negócio | Uma função legítima pode ser usada em escala ou fora do propósito? |
| Supply chain | Dependências, pipelines ou provedores podem introduzir código ou dados comprometidos? |
| Operação | Backup, restore, break-glass ou suporte ampliam o acesso? |
| IA | Prompt injection, exfiltração, tool abuse ou mistura entre tenants são possíveis? |
Use STRIDE por elemento e por fluxo, escolhendo as categorias que fazem sentido para cada contexto. Não é necessário preencher as seis categorias para todos os componentes.
Cenário: token forjado, roubado ou emitido para outro audience.
Controles:
Cenário: alto volume de requisições esgota capacidade.
Controles:
Cenário: mensagens de erro retornam stack trace ou dados internos.
Controles:
Cenário: o sistema valida role, mas ignora ownership e tenant.
Exemplo vulnerável:
SELECT *
FROM documents
WHERE id = :documentId;
Exemplo mais seguro:
SELECT *
FROM documents
WHERE id = :documentId
AND tenant_id = :tenantId
AND patient_id IN (
SELECT patient_id
FROM authorized_patient_access
WHERE professional_id = :subject
);
Controles:
Cenário: serviço não autorizado publica DiagnosticCreated.
Controles:
Cenário: payload alterado em trânsito ou por produtor comprometido.
Controles:
Cenário: não é possível provar qual serviço publicou o evento.
Controles:
Cenário: backlog cresce indefinidamente ou poison message bloqueia o consumidor.
Controles:
Cenário: URL permanente, bucket público ou chave previsível.
Controles:
Cenário: documento substituído após aprovação.
Controles:
Cenário: não há prova de quem gerou, aprovou ou baixou.
Controles:
Não trate “JWT válido” como sinônimo de “operação autorizada”. A decisão precisa considerar, quando aplicável:
issuer, audience, expiração e algoritmo;Para chamadas entre serviços, prefira identidade de workload e credenciais temporárias. Separe a permissão de publicar um evento da permissão de ler documentos. Isso reduz o blast radius e ajuda a evitar confused deputy.
A orientação da OWASP recomenda negar por padrão e validar permissões em toda requisição [11]. Para APIs que recebem identificadores de objeto, a falha correspondente é tratada como Broken Object Level Authorization (BOLA) [12].
| ID | Elemento | STRIDE | Ameaça | Impacto | Probabilidade | Prioridade |
|---|---|---|---|---|---|---|
| T01 | Document API | EoP | acesso a documento de outro tenant | alto | médio | crítica |
| T02 | Broker | Spoofing | evento falso gera documento | alto | baixo/médio | alta |
| T03 | Logs | Info Disclosure | diagnóstico aparece em log | alto | médio | crítica |
| T04 | Consumer | Tampering | payload inválido altera estado | alto | médio | alta |
| T05 | Gateway | DoS | abuso de requisições | médio/alto | alto | alta |
| T06 | Audit | Repudiation | alteração sem trilha confiável | alto | baixo | alta |
| T07 | Document URL | Info Disclosure | link sem expiração | alto | médio | crítica |
| T08 | Broker | DoS | poison message bloqueia fila | médio | médio | média |
A tabela resumida é útil para leitura, mas o registro versionado deve manter pelo menos:
| Campo | Finalidade |
|---|---|
| Asset e fluxo | mostra o que está sendo protegido |
| Pré-condição e ator | torna o cenário reproduzível |
| Controle existente | evita contar mitigação não implementada |
| Impacto e probabilidade | permite comparar ameaças |
| Confiança | registra incerteza da avaliação |
| Owner, status e prazo | transforma risco em trabalho |
| Evidência | liga controle a teste, policy ou alerta |
| Risco residual | torna explícito o que continua aberto |
| Aceitador e expiração | formaliza a decisão de aceitar o risco |
Uma escala 1–5 pode ser usada, desde que o time publique o critério. Por exemplo, impacto considera sensibilidade, integridade clínica, alcance entre tenants, indisponibilidade e recuperação; probabilidade considera exposição, privilégio necessário, complexidade, frequência e controles já comprovados. A classificação “crítica” deve ser consequência dessa regra, não apenas uma impressão editorial.
Uma matriz simples:
| Probabilidade \ Impacto | Baixo | Médio | Alto |
|---|---|---|---|
| Baixa | baixa | baixa/média | média |
| Média | baixa/média | média | alta |
| Alta | média | alta | crítica |
Ameaça:
Acesso indevido a documento de outro tenant.
Mitigações:
- autorização por recurso;
- filtro de tenant;
- signed URL de 5 minutos;
- teste negativo;
- auditoria.
Risco residual:
Credencial válida de profissional comprometida ainda pode acessar
documentos permitidos àquele profissional.
Resposta:
MFA, sessões curtas, detecção de comportamento anormal e revogação.
Risco residual não é uma frase final. Para cada risco não eliminado, registre:
Uma credencial válida de profissional comprometida é um exemplo de risco residual. MFA, sessões curtas, detecção de comportamento anormal e revogação reduzem o impacto, mas não provam que o risco foi eliminado.
Acessar o diagnóstico de outro paciente.
Elas ajudam a:
| ID | Mitigação | Ameaças cobertas | Tipo | Owner | Prioridade | Critério de conclusão |
|---|---|---|---|---|---|---|
| M01 | autorização por tenant e recurso | T01 | preventivo | Patient/Document Team | crítica | testes positivos e negativos |
| M02 | política de redaction | T03 | preventivo | Platform | crítica | scanner e testes em logs |
| M03 | workload identity no broker | T02 | preventivo | Platform | alta | ACL por produtor |
| M04 | schema validation | T04 | preventivo | Event Platform | alta | mensagens inválidas rejeitadas |
| M05 | DLQ e retry limitado | T08 | resiliência | Document Team | média | poison message não bloqueia fluxo |
| M06 | signed URL curta | T07 | preventivo | Document Team | crítica | URL expira e exige autorização |
| M07 | auditoria append-only | T06 | detectivo | Security | alta | trilha consultável e protegida |
| M08 | rate limiting por tenant | T05 | preventivo | Edge Team | alta | limites testados |
| M09 | alertas de acesso anormal | T01/T07 | detectivo | Security | alta | cenário simulado detectado |
| M10 | revisão de risco residual | todas | governança | Architecture | alta | aceite documentado |
A tabela deve ser mantida como backlog operacional, não como uma lista decorativa. Cada item precisa de status, prazo, evidência e link para o teste, policy, alerta ou decisão de risco. “Owner” deve identificar uma equipe ou pessoa responsável por concluir e demonstrar o controle.
A quarta pergunta do Threat Modeling é frequentemente esquecida:
Fizemos um bom trabalho?
| Mitigação | Evidência |
|---|---|
| tenant isolation | teste automatizado negativo |
| redaction | teste e scanner de logs |
| signed URL | teste de expiração |
| workload identity | policy test |
| audit trail | consulta por request ID |
| DLQ | teste de poison message |
| rate limit | teste de carga |
Para a ameaça de acesso cross-tenant, a evidência deve atravessar o fluxo inteiro:
actor autorizado na clínica A
-> altera documentId para um documento da clínica B
-> API autentica a sessão
-> policy nega tenant/recurso
-> serviço não emite URL
-> auditoria registra deny sem conteúdo clínico
-> alerta avalia repetição ou enumeração
Exemplo de contrato de teste:
@Test
fun `nao permite que um profissional acesse documento de outro tenant`() {
val response = client.getDocument(
subject = professionalFromTenantA,
documentId = documentFromTenantB,
)
assertThat(response.status).isIn(403, 404)
verify { signedUrlIssuer wasNot Called }
verify { auditStore.recordDeny(match { it.tenantId == tenantA }) }
}
O teste não deve apenas verificar o status HTTP. Ele precisa confirmar que o efeito colateral sensível, como emissão de URL ou leitura do objeto, não ocorreu.
# Threat Model — [Sistema ou feature]
## 1. Escopo
## 2. Objetivos de negócio
## 3. Suposições
## 4. Atores
## 5. Dados e classificação
## 6. Data Flow Diagram
## 7. Trust boundaries
## 8. Registro de ameaças
| ID | Elemento | STRIDE | Cenário | Impacto | Probabilidade |
## 9. Mitigações
| ID | Mitigação | Owner | Prazo | Evidência |
## 10. Riscos aceitos
## 11. Testes de segurança
## 12. Data de revisão
## 13. Mudanças que exigem nova revisão
Um repositório pode manter o modelo de forma pequena e revisável:
threat-model/
scope.md
actors-and-assumptions.md
dfd-level-0.mmd
dfd-level-1.mmd
data-classification.md
flows.md
threats.yaml
mitigations.md
security-tests.md
review-log.md
A revisão do pull request deve verificar que o DFD, o registro de ameaças, os testes e as decisões de risco evoluíram juntos.
O modelo pode ser versionado com:
A OWASP disponibiliza o Threat Dragon para criar DFDs, registrar ameaças e mitigações e trabalhar com classificações como STRIDE. [7]
A documentação da AWS também apresenta recursos para registrar ameaças, severidade, classificação STRIDE, evidências e recomendações. Verifique o escopo e a disponibilidade do produto antes de adotá-lo como dependência do processo. [2][8]
id: T01
title: Cross-tenant document access
component: document-api
flow: F08
category:
- elevation-of-privilege
- information-disclosure
asset:
- clinical-document
scenario: >
An authenticated user changes the document identifier and accesses
a document belonging to another tenant.
impact: high
likelihood: medium
risk: critical
mitigations:
- resource-level-authorization
- tenant-filter
- short-lived-signed-url
- access-audit
owner: document-team
status: open
reviewDate: 2026-08-15
O modelo como código ganha valor quando a mudança de arquitetura exige uma evidência mínima no pull request:
O CI pode validar sintaxe Mermaid, schema YAML, campos obrigatórios, links de evidência e ausência de segredos. Ele não substitui a revisão humana do cenário e do risco residual.
Threat Model é um artefato vivo.
Revise quando houver:
A OWASP recomenda atualizar o modelo após novas features, incidentes e mudanças de arquitetura ou infraestrutura. [9]
Para evitar que o modelo fique separado do código, converta os gatilhos em perguntas de pull request:
Se a resposta for sim, o PR deve apontar o modelo revisado ou registrar por que o impacto foi descartado.
Um sistema completo pode produzir centenas de ameaças genéricas.
Prefira:
Detalhe excessivo impede colaboração.
Comece no nível 0 e aprofunde somente os fluxos críticos.
Ruim:
Pode haver vazamento de dados.
Melhor:
Um profissional autenticado altera
documentIde acessa um documento de outro tenant porque o endpoint não aplica autorização por recurso.
“Implementar segurança melhor” não é uma ação.
Toda mitigação precisa de:
“Usamos JWT” não prova autorização correta.
“Usamos criptografia” não prova que:
Arquitetura muda. O modelo também precisa mudar.
Uma feature crítica só está pronta quando:
O DFD não entregou apenas um desenho.
Ele gerou:
Esse é o valor real do Threat Modeling:
converter uma conversa abstrata sobre segurança em decisões técnicas, testes, owners e evidências.
Threat Modeling não precisa ser uma cerimônia pesada nem uma atividade exclusiva do time de segurança.
Ele funciona melhor quando:
O Data Flow Diagram é especialmente valioso porque obriga o time a observar o sistema pelo caminho dos dados.
Quando descrevemos:
as ameaças deixam de ser genéricas.
No próximo capítulo da série, usaremos as ameaças de identidade encontradas neste modelo para construir uma estratégia completa de IAM na AWS, separando identidades humanas, workloads, credenciais temporárias, permission sets, roles, boundaries, SCPs, auditoria e resposta a comprometimento.
[1]: OWASP Threat Modeling Project
[3]: Microsoft Learn — Create a threat model using data-flow diagram elements
[4]: OWASP Threat Model Library
[5]: NIST SP 1800-39 — Data Classification Practices
[6]: OWASP Threat Modeling Cheat Sheet — STRIDE
[7]: OWASP Threat Dragon
[8]: AWS Security Agent — Run and review a threat model
[9]: OWASP Community — Threat Modeling
[10]: NIST SP 800-154 — Guide to Data-Centric System Threat Modeling
[11]: OWASP Authorization Cheat Sheet
[12]: OWASP API1:2023 — Broken Object Level Authorization
[13]: OWASP Logging Cheat Sheet
[14]: NIST Privacy Framework
[15]: CISA Secure by Design
[16]: MITRE ATT&CK
Este artigo apresenta práticas de engenharia e não substitui análise jurídica, regulatória ou de privacidade. Em sistemas que tratam dados pessoais, dados de saúde, pagamentos ou informações reguladas, envolva as áreas responsáveis por segurança, privacidade, jurídico e compliance.
As respostas da comunidade chegam em breve.