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.
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.
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.
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
