Da segurança de imagens à segurança de workloads
31 de outubro de 2019
0 minutos de leituraEsta é a terceira parte de uma série de quatro artigos sobre como criar sua estratégia de AppSec para Kubernetes. Confira aqui a parte I e aqui a parte II.
Em uma publicação anterior, falamos sobre como o empacotamento de aplicações está passando para as mãos dos desenvolvedores, à medida que as organizações adotam contêineres. Mas não é só o empacotamento que está migrando da administração de sistemas para o desenvolvimento: o gerenciamento de configurações também.
Kubernetes e o desafio das configurações
A API do Kubernetes é uma abstração poderosa para criar sistemas nativos da nuvem. Porém, uma consequência inesperada dessa API avançada é que os desenvolvedores precisam criar manualmente grandes volumes de configurações, principalmente em YAML. Veja, por exemplo, esta descrição de um Deployment do Kubernetes:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
Esses arquivos de configuração costumam ser armazenados em sistemas de controle de versão, às vezes junto com o código da aplicação e, em outros casos, separadamente. Só no GitHub, há mais de 1,5 milhão de arquivos de configuração do Kubernetes públicos.
Inseguro por padrão
Infelizmente, a grande variedade de opções de configuração do Kubernetes abre espaço para diversos problemas de segurança. A apresentação The Path Less Travelled, de Ian Coldwater e Duffie Cooley, resume bem alguns problemas relacionados às configurações padrão do Kubernetes do ponto de vista da segurança. Entre as propriedades de configuração comuns que muitas vezes não são definidas estão:
Limites de CPU e memória | Definir limites de CPU e memória previstos traz benefícios operacionais e de segurança. Do ponto de vista da segurança, isso limita o impacto de possíveis ataques de negação de serviço sobre a aplicação, em vez de afetar o nó e, potencialmente, todo o cluster. |
runAsNonRoot | Por padrão, os contêineres são executados como usuário root. Essa propriedade impede isso no ambiente de execução do contêiner. Assim, se um invasor conseguir executar um comando no contexto do contêiner, terá permissões limitadas. |
readOnlyRootFilesystem | Por padrão, o sistema de arquivos montado para o contêiner permite gravações. Isso significa que um invasor que comprometer o contêiner também poderá gravar no disco, facilitando certos ataques. Se seus contêineres não mantêm estado, não é necessário permitir gravações no sistema de arquivos. |
Capabilities | As capabilities do Linux controlam, em baixo nível, o que os processos fazem no contêiner — desde gravar no disco até se comunicar pela rede. É possível remover todas as capabilities e adicionar apenas as necessárias, mas isso exige conhecer a lista de capabilities. |
Essas propriedades de configuração não são vulnerabilidades por si só, mas, em geral, facilitam a exploração de uma vulnerabilidade em uma imagem. Caso ocorra uma exploração, as propriedades de configuração podem ampliar os danos. Seu nível de exposição ao risco não depende apenas das vulnerabilidades existentes, mas também do contexto em que elas aparecem.
Configuração em todo o SDLC
À medida que transferimos mais responsabilidades de segurança para os desenvolvedores, vale a pena analisar esse desafio de configurações seguras sob a perspectiva do SDLC, assim como fazemos com as vulnerabilidades em imagens.
Etapa | Descrição | Feedback | Abrangência |
Local | Ferramentas locais que ajudam a criar configurações seguras, desde integrações com fluxos de testes unitários até sugestões em IDEs. Porém, resolvem problemas individuais, não os da equipe ou da organização. | Rápido | Baixa |
CI/CD | Interromper rapidamente o build quando os arquivos de configuração forem potencialmente inseguros ou não atenderem a uma política interna. No entanto, isso precisa ser implementado em todos os pipelines relevantes. | Rápido | Variável |
Repositório | Atualmente, as configurações são armazenadas principalmente em sistemas de controle de versão — embora valha notar que o Helm 3 adiciona suporte ao armazenamento de imagens em registros OCI compatíveis. Como ajudar os desenvolvedores a escrever configurações seguras entre o envio de pull requests e a criação de branches? | Médio | Média |
Admissão | Os controladores de admissão do Kubernetes bloqueiam solicitações à API e permitem impedir configurações inseguras proibidas. No entanto, as políticas podem variar entre clusters. Além disso, elas afetam novas solicitações, não os workloads existentes. | Lento | Alta |
Produção | A API do Kubernetes representa a configuração em execução — é aqui que você deve prestar mais atenção às configurações. Mas os problemas nessa etapa podem afetar workloads reais, e os ciclos de feedback para resolvê-los podem ser lentos. | Lento | Alta |
Assim como nos testes de imagens de contêiner, há diferentes vantagens e desvantagens em cada etapa. Testar em apenas uma etapa pode gerar feedback rápido, mas oferecer menos controle, ou vice-versa. Da mesma forma que acontece com as vulnerabilidades em imagens, um processo de segurança moderno e maduro provavelmente envolve testar as configurações em várias etapas.
Conclusões
Nossas aplicações não são apenas as imagens que usamos para empacotá-las, mas também as configurações usadas para executá-las. No melhor dos casos, consideramos esses dois aspectos domínios separados para proteger. Porém, na maioria das vezes, as conversas sobre segurança de contêineres para desenvolvedores se concentram exclusivamente nas vulnerabilidades em imagens. À medida que a responsabilidade pela segurança das aplicações passa para as equipes de desenvolvimento, torna-se cada vez mais importante entender a relação entre as vulnerabilidades em imagens e as configurações, além de contar com ferramentas que ajudem a proteger ambas.
Comece a participar de desafios de Capture the Flag
Aprenda a resolver desafios de Capture the Flag assistindo sob demanda ao nosso workshop virtual introdutório.


