Segurança de contêineres — Uma nova fronteira (Parte 2)
Uma série de blog em duas partes sobre considerações para manter o uso de contêineres seguro.
Segurança de contêineres, com uma nova dimensão
Descrevemos os desafios de segurança que os contêineres podem apresentar em nossa primeira postagem no blog. Isso nos deixa com dúvidas sobre como devemos pensar sobre a segurança de contêineres.
Achamos que devemos começar com (e seguir) os conselhos do Kubernetes de usar uma abordagem em camadas e de defesa profunda que considere quatro C's: nuvem, clusters, contêineres e código. Também achamos que devemos considerar como conter ameaças que comprometem contêineres, por meio da segmentação.
Sendo esse o caso, propomos a contenção como um quinto C.
Discutimos anteriormente a necessidade não apenas de proteger os contêineres, mas também de garantir que eles não possam ser explorados e usados como ponto de partida para se moverem lateralmente dentro de um data center. É aí que a necessidade de contenção entra em jogo.
Vamos examinar a orientação inicial do Kubernetes sobre os 4 C's e depois discutiremos a contenção.
Contentores
Para executar o software no Kubernetes, ele deve estar em um contêiner. Por isso, há algumas considerações gerais de segurança descritas pelo Kubernetes:
- Escanear: escaneie seus contêineres em busca de vulnerabilidades conhecidas. Ferramentas como a Clair do CoreOS podem ser úteis.
- Assine imagens de contêiner: mantenha a confiança no conteúdo do contêiner usando o Docker Content Trust, integrado ao Docker Engine. O projeto Portieris da IBM pode ser usado como um controlador de admissão para reforçar a confiança no conteúdo de imagens devidamente assinadas.
- Controle os privilégios do usuário: procure criar usuários dentro dos contêineres que tenham o menor nível de privilégio do sistema operacional necessário para cumprir a meta do contêiner.
Código
Examinando o nível do código do aplicativo, a orientação do Kubernetes aborda alguns pontos:
- Permitir acesso somente por TLS: torne padrão a criptografia de tudo em trânsito, mesmo entre serviços de rede protegidos pelo firewall.
- Limite os intervalos de comunicação das portas: Exponha apenas as portas do seu serviço que são absolutamente essenciais.
- Analise o código estático: analise o código em busca de práticas de codificação potencialmente inseguras.
- Teste para ataques de sondagem dinâmica: use Ferramentas OWASP para automatizar ataques comuns, como injeção de SQL, CSRF etc.
Nuvem
Cada provedor de nuvem fornece recomendações abrangentes sobre como executar cargas de trabalho de contêiner em sua infraestrutura de nuvem. As ofertas de segurança podem ser diferentes para diferentes provedores de nuvem e os usuários devem ser meticulosos ao seguir essas recomendações. Links para provedores de nuvem populares e recomendações de segurança são encontrados em https://kubernetes.io/docs/concepts/security/#the-4c-s-of-cloud-native-security.
A orientação geral inclui:
- Restrinja o acesso à rede: a maioria dos provedores de segurança em nuvem fornece segurança de rede usando listas de controle de acesso — por exemplo, a AWS fornece grupos de segurança que permitem que as cargas de trabalho sejam segmentadas em grupos e permitem que as ACLs sejam configuradas por grupo.
- Restrinja o acesso à API: idealmente, somente os servidores necessários para administrar um cluster devem ter acesso aos servidores da API.
- Restrinja o acesso às APIs de cluster do Kubernetes: é melhor fornecer ao cluster acesso ao provedor de nuvem que siga as princípio do menor privilégio para os recursos que ele precisa administrar. Um exemplo de Kops na AWS pode ser encontrado aqui: https://github.com/kubernetes/kops/blob/master/docs/iam_roles.md#iam-roles.
- Restrinja o acesso a 'etcd': é nesse diretório que existem os arquivos de configuração de nuvem para o Kubernetes. Sempre use o TLS para acessar e fazer modificações nesses arquivos.
- Criptografe todas as unidades, especialmente as unidades etcd: impeça que usuários não autorizados visualizem arquivos de configuração e armazenamentos de dados críticos pertencentes ao seu cluster Kubernetes.
Clusters
- Restrinja o acesso à API Kubernetes ao cluster usando BRACO.
- Autentique todo o acesso à API que controla o cluster.
- Criptografe todas as chaves secretas usadas pelo cluster, incluindo todos os dados no etcd.
- Controle os aspectos de segurança dos pods: os objetos de segurança do pod definem um conjunto de condições com as quais um pod deve ser executado para ser aceito no sistema.
- Controle a utilização de recursos: os nós do Kubernetes que executam seu aplicativo dependem uns dos outros para confiabilidade e balanceamento de recursos. Portanto, deve haver políticas que restrinjam a quantidade de recursos usados por esses nós.
- Controle todas as políticas de rede para pods usando listas de controle de acesso. Essas são as políticas de segurança Norte-Sul. Para políticas dentro do data center, consulte Contenção abaixo.
- Restrinja todo o acesso de entrada para ser via TLS.
Contenção
Isso nos leva ao quinto C de contenção que impede a propagação de brechas iniciadas a partir de um contêiner. A contenção deve levar em conta algumas coisas para que seja mais eficaz:
- Descubra contêineres recém-criados em tempo real.
- Permita a segmentação automatizada para novas cargas de trabalho de contêineres para que a segurança esteja automaticamente presente “no nascimento”.
- Centralize a visibilidade dos contêineres junto com outros ambientes de computação para obter uma visão única de cargas de trabalho em contêineres, máquinas virtuais, nuvem pública e privada, porque você não pode proteger o que não pode ver.
- Aplique políticas uniformes em todos os contêineres — e em todo o resto — para que você segmente com uma política unificada, independentemente do ambiente. Isso evita várias ferramentas pontuais para segmentação de VMs, servidores bare-metal, nuvens e contêineres.
Com uma ampla abordagem de defesa aprofundada para contêineres, as organizações podem ter certeza da viabilidade de segurança dos contêineres para implantá-los com ainda mais confiança.