Contextualizando a segurança e apresentando o incidente
Vamos começar nosso curso entendendo que a segurança, como requisito arquitetural, existe desde os primeiros sistemas. Nos sistemas mais básicos, havia um usuário administrativo para recursos avançados, enquanto o acesso a ferramentas padrão muitas vezes nem exigia início de sessão. Esse cenário evoluiu devido ao aumento da demanda, do número de sistemas e dos pontos de contato com clientes.
Vejamos um exemplo de incidente que poderia ter sido evitado com medidas relacionadas ao que vamos aprender. Em 2019, a Capital One, uma das principais empresas de cartões de crédito dos Estados Unidos, sofreu um grande vazamento que expôs milhares de dados. O FBI atuou, identificou responsáveis, mas houve um dano expressivo, especialmente à reputação da Capital One, devido à sua relevância no mercado estadunidense. Até hoje, mantêm uma página em seu site explicando exatamente o que aconteceu. Na época, foram transparentes e comunicaram todes os clientes sobre a filtragem: tratava-se dos dados relacionados ao processo de solicitação de cartões de crédito. No processo de solicitação, a pessoa potencial cliente fornecia dados pessoais, dados de contato, dados de endereço, número de seguridade social, e havia uma análise de crédito. Todos esses dados, tanto os fornecidos quanto os relacionados à análise, foram expostos.
Detalhando a dinâmica do ataque e a falta de alertas
É importante entender que o sistema não foi invadido no sentido clássico. Não podemos afirmar simplesmente que um mecanismo de segurança foi quebrado. Nenhuma autenticação foi comprometida, nenhum acesso foi forçado, não houve ataque de força bruta. Nenhuma regra foi violada: as regras do firewall (barreira de rede) e as políticas foram respeitadas. Todas as credenciais em uso eram válidas e o acesso autorizado parecia legítimo. Observamos, portanto, um cenário em que a arquitetura existente não cobriu as necessidades.
O que ocorreu? Houve uma solicitação manipulada: uma entrada externa permitiu ao atacante enviar dados específicos, instruções para que o back-end (camada de servidor) as executasse. Com isso, foi possível acessar recursos porque o back-end tinha acesso livre a determinados componentes e havia uma confiança estabelecida entre o back-end e o que estava dentro da rede. Credenciais foram obtidas e dados foram acessados. O que permitiu esse ataque? Basicamente, quando o back-end recebia instruções, as aceitava sem validação específica, tanto da entrada quanto da saída. É comum validarmos a entrada, mas vamos entender que a saída também pode — e deve — ser validada. A resposta que está sendo devolvida é válida? É possível avaliá-la. O acesso interno não estava restrito; havia uma confiança implícita em tudo que vinha do perímetro.
Nesse caso, o atacante explorou um ataque que chamamos de Server-Side Request Forgery (falsificação de requisição no lado do servidor). Havia um OAuth, que é nosso primeiro ponto aqui de PEP. No nosso bloco sobre Zero Trust (confiança zero), vamos entender que PEP é um ponto de aplicação de políticas, em inglês, Policy Enforcement Point (ponto de aplicação de políticas). O PEP encaminha a solicitação a uma máquina e, mediante credenciais obtidas dentro do próprio ambiente — repare que o atacante não possuía credencial elevada para obter os dados —, o back-end tinha acesso a um cofre que continha essas informações. Assim, os dados puderam ser acessados e entregues como se nada estivesse errado, como se a transação fosse totalmente legítima.
Por que não houve alerta? Porque o acesso foi realizado pelo back-end; isso era esperado. As credenciais eram válidas e não havia sinais de suspeita: tudo funcionou como deveria. Muitas vezes, na área de tecnologia, temos uma falsa sensação de segurança por contarmos com um DLP, Data Loss Prevention (prevenção de perda de dados), uma ferramenta conectada à rede que tenta identificar vazamentos. O DLP funciona muito bem para vazamentos massivos e atípicos, mas, neste caso, as transações pareciam legítimas, e por isso o DLP não identificou nada inadequado.
Quantificando o impacto e introduzindo problemas arquiteturais
O impacto para o negócio da Capital One foi grande: mais de 100 milhões de registros de pessoas dos Estados Unidos e do Canadá foram expostos; houve mais de 80 milhões em multas e diversas sanções; e a reputação ficou extremamente prejudicada.
A partir desse ponto, passamos aos problemas arquiteturais que trataremos ao longo do curso. Primeiro, a confiança implícita: a ideia de que, uma vez dentro da rede, tudo é permitido. Se temos acesso ao sistema X, assume-se que tudo o que está atrás do sistema X está liberado. Isso ocorre, por exemplo, quando há uma autenticação em um front-end (camada de apresentação) que chama um back-end. Do back-end para uma derivação, a credencial original se perde e assume-se um usuário sistêmico, um service principal (identidade de serviço). Nessa situação, há uma confiança implícita de que nada que venha do back-end para dentro seja ilegal ou indevido.
Segundo, o modelo perimetral: aquele em que fazemos tratamento apenas na borda, no perímetro. Uma vez passado o perímetro, tudo é considerado seguro. É a lógica por trás da expressão “estou dentro”: ao obter acesso à rede — em filmes, muitas vezes, vemos a tentativa de romper um firewall (barreira de rede) e a celebração quando ele é vencido —, com confiança implícita e segurança perimetral, tudo lá dentro estaria liberado.
Terceiro, a falta de validação, controles insuficientes e ausência de contexto e de intenção. Com base no que está sendo invocado, no que a aplicação deveria fazer e no que ela tem acesso, percebemos que eram partes que não se comunicavam adequadamente.
Questionando abordagens tradicionais e valorizando contexto
Diante disso, como pessoas arquitetas, devemos nos perguntar: onde está o problema? O que falta nesse desenho? Como detectar quando ocorre algum tipo de abuso? E como evitá-lo? Precisamos sair da ideia de que ferramentas conectadas nas margens ou tangenciando nossa aplicação são suficientes para detectar esse tipo de problema. Não existe ferramenta plug-and-play (conectar e usar) que, instalada no ambiente, automaticamente o torne Zero Trust (confiança zero).
Vamos aprender que identidade não é suficiente. Uma identidade legítima não implica acesso irrestrito. Uma conta sistêmica não deve ser confiável por si só. Sabemos que às vezes existe a necessidade de usar um usuário sistêmico em aplicações — isso faz parte —, mas hoje já existem modelos mais modernos com OAuth que permitem uma chamada mista, na qual um determinado usuário está embutido dentro do nosso token (token) OAuth ao encaminharmos a requisição adiante. Assim, teremos uma identidade de sistema e também rastreabilidade para saber qual usuário está solicitando informação dentro de um determinado contexto.
Portanto, a confiança não pode ser implícita; o contexto deve ser considerado. Se um cliente acessa, por exemplo, um sistema bancário para realizar uma consulta de informação, isso exige um nível de segurança. Para executar uma transação, o nível é outro. Para alterar um dado cadastral, é um nível diferente. Cada contexto tem um peso, e precisamos graduar a autenticação, por exemplo, incorporando esse nível dentro de um token (token) conforme a necessidade.
Resgatando a evolução do conceito de confiança zero e padrões
Naturalmente, entendemos que a segurança precisa evoluir. Esse incidente ocorreu em 2019, mas, em 2004, um grupo ligado à organização The Open Group (The Open Group), o fórum chamado Jericho Forum (Fórum Jericho), começou a propor uma ideia que, até então, era nova e oferecia uma nova perspectiva sobre como abordamos a segurança. De forma didática, dizemos que o perímetro foi comprometido e já não pode ser defendido. O perímetro é aquela camada externa de segurança da nossa rede.
A premissa é que as cargas de trabalho, nossas aplicações, devem aprender a se proteger por si mesmas e considerar que os ambientes são hostis por padrão. Isso surgiu em 2004 e foi formalizado em 2007, muito antes de o órgão norte-americano de padronização, o NIST (Instituto Nacional de Padrões e Tecnologia), lançar a arquitetura Zero Trust (confiança zero) em 2020. A segurança como requisito foi incluída na ISO (Organização Internacional de Padronização) em 2011, como um atributo de qualidade.
Defendendo a segurança como requisito e decisões conscientes de risco
Sempre temos requisitos funcionais e requisitos não funcionais. Muitas vezes, a área de desenvolvimento acredita que, se a área de negócios não solicitar determinadas medidas de segurança, elas não são necessárias. Nós costumamos classificar isso como uma falha de entendimento. Um exemplo: nenhuma pessoa profissional de medicina precisa que lhe digam para lavar as mãos antes de uma cirurgia; nenhuma pessoa instrumentista precisa que lhe digam para higienizar os instrumentos. Espera-se que, ao contratar uma pessoa cirurgiã, médica ou instrumentista, ela saiba executar o procedimento da forma mais segura possível. O mesmo se aplica a uma pessoa analista de sistemas, a uma pessoa desenvolvedora, a uma pessoa programadora ou à liderança técnica (tech lead, liderança técnica). Espera-se que cuidemos desse tipo de aspecto. A área de negócios fornecerá requisitos de negócio, e a área técnica deve incorporar isso nas especificações do sistema, deixando claro qual é o risco se algo não for incluído dentro da sprint (iteração) e da aplicação.
Afirmamos, então, que toda decisão de arquitetura implica risco. Por exemplo, quando utilizamos um ambiente elástico, corremos o risco de ele não evoluir adequadamente para responder à demanda. Em uma Black Friday (sexta-feira de descontos), é comum aumentar o número de pods e de microserviços antes do pico, para que já estejam carregados e prontos para uso. Isso implica elevar o custo antes de existir a demanda real. Logo, toda decisão implica algum tipo de risco, seja operacional, financeiro ou reputacional. Precisamos tomar decisões de forma consciente e mitigar onde for possível.
Definindo domínios de foco e consequências arquiteturais
Devemos dar atenção especial a cinco domínios:
- Identidade: quem está acessando, seja um sistema ou uma pessoa.
- Aplicação: o que a aplicação faz, qual é seu domínio e seu entendimento do negócio. Nenhuma aplicação externa nem mecanismo de segurança conhecerá o negócio tão bem quanto a própria aplicação de negócio; certos riscos e abusos são inerentes a ela.
- Rede: embora o perímetro não seja mais seguro por padrão, não podemos negligenciá-lo. Trabalhamos com microsegmentação contextual para termos PEPs (Policy Enforcement Points, pontos de aplicação de políticas) mais contextuais e adaptativos. Assim, uma pessoa da área de contabilidade, por exemplo, terá acesso apenas ao escopo de rede específico de contabilidade.
- Dispositivos: avaliamos a postura dos dispositivos. Em um mundo em que muitas pessoas usam dispositivos pessoais para trabalhar, é importante avaliá-los. Aplicações bancárias, por exemplo, não devem ser executadas em um sistema Android em modo desenvolvedor, pois uma chamada pode ser interceptada. O mesmo vale para iOS com jailbreak (desbloqueio do sistema). Avaliamos também quais aplicações estão instaladas, por exemplo, por meio do mecanismo Play Integrity (integridade do Android) que verifica a integridade no sistema Android.
- Dados: cuidados clássicos de segurança, como segregação de credenciais, criptografia em trânsito e em repouso, mascaramento, entre outros.
Há consequências arquitetônicas importantes. O egress (saída de dados) é um ponto de atenção: entender o que está saindo é tão importante quanto validar entradas. Precisamos de validação contínua de acesso: não é porque uma pessoa usuária possui um JWT (JSON Web Token) que concederemos carta branca, pois o token pode ter sido comprometido. Adotamos monitoramento comportamental, logs (registros) e rastreabilidade, além de políticas adaptativas para oferecer fricção proporcional à necessidade.
Avaliando impactos financeiros e quantificando riscos
Não podemos desconsiderar impactos financeiros diretos e indiretos. Falamos de gastos operacionais e de custos decorrentes de processos legais. No Brasil, temos a LGPD; na Europa, a GDPR (Regulamento Geral de Proteção de Dados); cada país terá sua própria legislação. Existem também impactos reputacionais que podem afetar o aspecto financeiro, reduzindo o valor das ações de uma empresa. Tudo isso sempre competirá por investimentos; ao elaborarmos uma lista de investimentos, precisaremos equilibrar quando e quanto investir para obter segurança e previsibilidade. Frequentemente, o que as pessoas acionistas desejam é previsibilidade. Assim, um investimento muitas vezes funciona como um seguro: alocamos recursos para obter estabilidade no ambiente e sermos percebidos externamente como uma empresa estável. Quanto maior a estabilidade, maior tende a ser a capacidade de captação de investimentos.
Para atribuir números às nossas avaliações, muitas vezes qualitativas, podemos utilizar o framework FAIR (Análise de Fatores de Risco de Informação), que ajuda a medir e quantificar riscos. Nesse fluxo, a arquitetura dá uma direção; a área de segurança realiza uma avaliação de ameaças, frequentemente fornecendo retorno e solicitando algum ajuste ou mitigação; a área de negócios define seu apetite de risco. Um exemplo clássico é o de um supermercado com alto volume de atendimento: sabe-se que haverá alguns casos de fraude, mas o negócio aceita esse risco porque compensa. Assim, o apetite de risco é definido pelo negócio e, estando a decisão documentada, seguimos com o risco mitigado na medida adequada, sempre de forma consciente.
Reconhecendo compensações e orientando decisões
Existem compensações inevitáveis:
- Mais segurança, maior fricção. Se interrompermos um percurso para solicitar senha ou biometria, podemos reduzir a taxa de conversão.
- Mais controle, maior custo. É possível criar uma política específica para cada microcenário, mas isso implicará custos mais elevados.
- Mais proteção, menos agilidade. Submeter uma solução a uma avaliação de ameaças e apresentá-la a um fórum específico consome agilidade.
- Mais validação, maior latência. Se, para cada chamada recebida por um microserviço, consultarmos um motor de riscos e validarmos o JWT para verificar revogação, sobrecarregaremos a aplicação. Por isso, costumamos realizar essas validações em pontos críticos, como execução de pagamentos e modificação de dados cadastrais.
Nenhuma decisão é neutra. Sempre colocaremos na balança o que faz mais sentido. Segurança mal projetada compromete diversos pontos, gera retrabalho e pode comprometer o negócio. O negócio pode afirmar que não tinha conhecimento do risco. Por exemplo, entregamos uma solução para a Black Friday (sexta-feira de descontos) cumprindo o Time to Market (tempo de chegada ao mercado), mas ocorreu uma filtragem de dados. Muitas vezes, o negócio argumenta: “Entendemos que vocês encontrariam uma forma de cumprir o prazo com segurança.” Em muitos casos, a área técnica assume o risco sem comunicá-lo ao negócio. Precisamos documentar as etapas, formalizar a carta de riscos e colocar todas as informações sobre a mesa para a tomada de decisão.
Referenciando padrões e concluindo o bloco
Algumas referências técnicas que utilizaremos ao longo do curso: ISO (Organização Internacional de Padronização), NIST (Instituto Nacional de Padrões e Tecnologia), FAIR (Análise de Fatores de Risco de Informação) e TOGAF (The Open Group Architecture Framework, estrutura de arquitetura corporativa).
Em síntese, a segurança é obrigatória, não é opcional. A área de negócios pode não solicitá-la explicitamente, mas cabe à arquitetura e às análises considerá-la. Segurança não está isolada; ela está atrelada à jornada do negócio, à previsibilidade e aos trade-offs (compensações). Não é gratuita: envolve custos no sentido amplo, como latência, infraestrutura, perdas financeiras, reputação e processos legais. Tratamos a segurança como aspecto arquitetônico essencial para que o sistema funcione da maneira mais adequada, entendendo requisitos de negócio, atributos de qualidade e restrições.
Com isso, finalizamos este bloco e seguimos adiante.