Skip to main content

Da segurança de imagens à segurança de workloads

Escrito por

31 de outubro de 2019

0 minutos de leitura

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

Leia mais

feature insights announcement
Blog

Comprometimento da cadeia de suprimentos do node-gyp: um worm npm que se autopropaga e se esconde em binding.gyp

Um novo worm do npm está explorando binding.gyp para acionar o node-gyp durante a instalação, permitindo que pacotes maliciosos executem código sem scripts de ciclo de vida. Ele rouba credenciais, mantém persistência no GitHub e se propaga entre contas de mantenedores.

Article

Versões maliciosas de node-ipc publicadas no npm após suspeita de comprometimento da conta de um mantenedor

Em 14 de maio de 2026, várias versões maliciosas do popular pacote npm node-ipc foram publicadas no registro do npm. As informações públicas disponíveis identificam node...

blog feature toolkit
Blog

Versão maliciosa do pacote elementary-data no PyPI rouba credenciais de nuvem de engenheiros de dados

Atacantes exploraram uma vulnerabilidade de injeção de script no GitHub Actions para publicar uma versão maliciosa da CLI Python elementary-data (v0.23.3), com um backdoor que rouba credenciais e tinha como alvo perfis do dbt, chaves de provedores de nuvem e segredos SSH em ambientes de engenharia de dados.