InfraestruturaSem categoria

Arquitetura Imutável em AppSec

Falar sobre infraestrutura imutável requer que voltemos um pouco no tempo e comecemos explicando como eram, e em alguns casos ainda são, as infraestruturas que dão suporte à grande maioria das aplicações.

Há alguns anos, toda a infraestrutura de uma aplicação muitas vezes era compartilhada. Ou seja: uma aplicação era hospedada em servidores que mantinham não somente uma, mas várias aplicações. 

Desta forma, qualquer mudança nesta estrutura era feita por meio de seus administradores, que remotamente acessavam estes servidores para realizar as mudanças necessárias.

Você pode também ouvir a versão em áudio deste artigo:

Mutabilidade e imutabilidade

Isto nos apresenta ao conceito de mutabilidade, onde a mudança ou alteração de algo é considerado possível. Neste caso, se aplicava às configurações, ou mesmo características do servidor. Durante muito tempo esta foi a prática empregada – e é também ainda hoje, em algumas situações.

Esse tipo de abordagem traz para a estrutura alguns pontos que sempre trouxeram problemas. Por exemplo: nem sempre essa mudança era documentada, e aconteciam até mesmo erros durante a configuração, levando à exposição da estrutura.

Revendo conceitos

No entanto, se pensarmos sobre o tema, vamos perceber que o conceito de mutabilidade e imutabilidade não é algo novo. Afinal, programadores já conhecem esse tipo de conceito, e muitos sabem que dados também possuem suas características de mutabilidade e de imutabilidade. 

Em junho de 2013, Chad Fowler escreveu um artigo em que explica a necessidade de pensarmos de forma diferente sobre a infraestrutura. Na obra, ele sugere o uso de conceito de imutabilidade em arquitetura de software também para a infraestrutura.

Como já falamos acima, o uso de infraestrutura mutável é muito suscetível a erros e, por isso, queremos falar um pouco sobre o tema das imutabilidades.

O que é Infraestrutura Imutável?

Inicialmente falamos de forma macro sobre o conceito de imutabilidade – que é  uma característica de algo que é imutável, estável. 

Então, partindo deste conceito, podemos dizer que uma infraestrutura imutável é uma estrutura onde seus componentes básicos não podem ser mudados ou modificados

Nesta primeira imagem, podemos ver como são realizadas as mudanças em uma estrutura mutável, ou seja, onde podemos mudar os componentes. Neste caso, trata-se de sistemas e aplicações em um servidor.

O atributo alt desta imagem está vazio. O nome do arquivo é r_7HX8IF0gjh0MmOj9yH-aAEiAT3bN0xn7cqmR4TIcymF6KM-NzMqbmYbwPTuDHwkVvSNYdAmDH3Hy4VF8Rq8LFlymjHAdqyYBNzeigO9LvXG0sGkEUUOr1qNxUuLhuuu31u1h7E

Neste exemplo, podemos ver que houve a atualização de uma aplicação web e a mudança de um servidor web, e após a reinicialização da máquina, deveríamos ter tudo funcionando corretamente.

Temos que imaginar que, durante o processo de atualização e mudança de sistemas, por mais que a equipe siga padrões já pré-estabelecidos, cada um realiza as tarefas a seu modo. Isso pode gerar uma série de problemas. E se imaginarmos que em uma infraestrutura de alta disponibilidade o principal objetivo é manter o sistema operando o maior tempo possível, ter que reiniciar máquinas não é a melhor solução.

Vamos a um exemplo?

A figura abaixo mostra uma infraestrutura imutável e como ela é operada para reduzir a margem de erros e o tempo fora de operação.

O atributo alt desta imagem está vazio. O nome do arquivo é IRUDjeUD0BGbbelVKdyYdMCtX9f-OUt41ggs-1EDSJ76ItbQNAYHlZwnqhc92UNcTX9-AgIjZbKKO7Eow5yPkOqVro0fXD7BcgiqT3ypKRs6uOxpXZ0gbJTeLbWplORipnQvML2f

Em uma infraestrutura imutável, o estado do servidor não está sujeito a mudanças. Podemos perceber que é uma maneira alternativa de construir uma infraestrutura e ajuda a corrigir muitos dos problemas encontrados na abordagem de infraestrutura mutável.

No exemplo da imagem acima, a equipe de operações atualiza diretamente os sistemas e aplicações no código da imagem que será usada como base  e não manualmente no servidor. Então, após essas mudanças no código, a equipe de desenvolvimento pode passar a realizar os testes em um ambiente isolado. Este, sendo validado, pode ser novamente passado para a equipe de operações que, a partir deste, passa a criar uma nova instância de um servidor usando alguma ferramenta de continuous integration.

Claramente já podemos perceber um grande benefício do uso deste tipo de solução. Quando há o deploy por parte da equipe de operações, este já foi testado em um outro ambiente e validado. Portanto dificilmente teremos um erro neste processo.

Tendo isso sido feito, em algum momento o antigo servidor será destruído e a operação seguirá normalmente.

Deployment Canary

Em alguns casos há o uso de um conceito chamado deployment canary. 

Essa técnica remonta aos tempos onde os mineradores colocavam pequenos canários em gaiolas dentro das minas. Desta forma, caso acontecesse o vazamento de algum gás nocivo ao ser humano, isso afetaria primeiro o canário, mostrando assim que algo está errado.

Este pensamento foi colocado para a validação de estruturas imutáveis, conseguindo assim que parte do tráfego de uma aplicação web, por exemplo, seja direcionado a servidores que foram alterados. Então, caso alguma coisa estivesse errada, apenas uma pequena parte dos usuários sofreria um impacto, o que possibilitaria a correção. 

O atributo alt desta imagem está vazio. O nome do arquivo é HHk9dbhCH9NG_6ylEwxVtB2PxVkNgA2gfIZd0iH7tRlOM9KNYVCxTzLsNZCVJFQiri4Ka4amXPtiDsg4hBPrOHHpfDqvGcJAlg8BA2UFPB6IgNtujGmlyhGHIWIZ5fv3k8xJfjiD

Esse tipo de estrutura pode ser uma grande vantagem para a grande maioria das empresas e dos sistemas. No entanto, entendemos que em alguns casos não é viável o uso deste tipo de solução. 

Para aqueles casos em que é aplicável, soluções open source como Netflix Animator ou mesmo soluções da AWS como o EC2 Builder podem ajudar na automação do processo.

E há desafios ?

Sempre há !

Podemos dizer que um dos pontos de desafio que esse novo conceito traz é para os times de segurança mais tradicionais. Afinal, eles possivelmente não tiveram sua estrutura pensada para acompanhar esse modelo.

Imagine que em um determinado momento uma ferramenta de varredura de vulnerabilidades está sendo executada em um determinado host. Neste modelo de infraestrutura imutável, onde o servidor (host) pode ser substituído assim que necessário, é possível que, ao terminar de realizar a varredura, esta seja substituída por outra, com nova versão e novas configurações.

Estes novos desafios exigem uma mudança de pensamento e estruturação. O foco de busca por vulnerabilidades nos hosts ativos passaria para serem realizados testes na imagem que serve de origem para as novas instâncias que serão ativadas. Esse pensamento também serve para containers.

Conclusão

A infraestrutura imutável oferece grandes oportunidades de criar novas formas de  gerenciamento – mais eficientes e que possibilitem um maior controle e segurança sobre a  atualização de software e sua estrutura de suporte.

No entanto, precisamos entender que há desafios e mudanças que devem ser feitas para que esse tipo de estratégia seja alcançada com sucesso. 

A mudança de pensamentos e de cultura das equipes de DevOps são essenciais para que a introdução deste novo conceito seja feita de forma efetiva. 

Leia todos os artigos que já publicamos sobre AppSec

Nova call to action
About author

Articles

Mais de 15 anos de experiência em segurança da informação e aplicações, graduado em processamento de dados, trabalhei como professor universitário e participei ativamente como instrutor de treinamento para mais de 6000 desenvolvedores em equipes de TI. Sou pai de duas meninas e trader nas horas vagas.
Related posts
Infraestrutura

O dilema do uso de Infrastructure as Code (IaC) para a Segurança de Aplicações

Construir aplicações seguras vai muito além de construir apenas código seguro. Quando falamos de…
Read more
Sem categoria

Modelagem de Ameaças - o que é e por que desenvolvedores devem ficar atentos a isso

Dentro do processo de construção de um software, entender sua funcionalidade e identificar…
Read more
Code FightersSem categoria

Code Comprehension: O que é?

Antes de discutir Code Comprehension, é importante falar um pouco sobre Engenharia de Software.
Read more

Deixe um comentário