Alura > Cursos de DevOps > Cursos de Segurança > Conteúdos de Segurança > Primeiras aulas do curso Containers e Kubernetes: segurança de aplicações e supply chain

Containers e Kubernetes: segurança de aplicações e supply chain

Introdução à segurança de contêineres - Apresentação

Apresentando o curso e o instrutor

Olá a todos! Bem-vindos ao curso de Segurança de Contêineres na Nuvem. Meu nome é Karollyne costa e, junto com a Alura, vou ministrar este curso que busca capacitar profissionais de cibersegurança a proteger aplicações que são executadas dentro de contêineres e orquestradores de contêineres, como o Kubernetes.

Falando um pouco sobre minha experiência, sou especialista em nuvem pública, com mais de 10 anos de experiência, e busco resolver problemas por meio de soluções de engenharia. Isso significa que analiso a raiz do problema, crio o processo e projeto a solução que lidará com ele de forma definitiva, não apenas paliativa.

Explorando a segurança de contêineres e aplicações

Neste curso, vamos aprender sobre a conexão entre contêineres e aplicações. Dessa forma, poderemos entender que garantir a segurança do contêiner e do orquestrador de contêineres assegura diretamente a segurança da aplicação. Vamos explorar o que são contêineres e suas imagens, o que constitui uma imagem segura, o que caracteriza um contêiner mal configurado, e como criar um Dockerfile com melhores configurações. Principalmente, veremos as metodologias de segurança que podem ser aplicadas dentro desse processo de gestão.

Vamos discutir o que é uma cadeia de segurança, como garantir a integridade, e explorar conceitos como SBOM (Software Bill of Materials). Alguns marcos de segurança já bastante comentados na comunidade serão abordados, e teremos a oportunidade de entender como aplicá-los na prática para proteger o ambiente.

Abordando vulnerabilidades e gestão de sistemas

Também faremos a conexão com a questão da vulnerabilidade. Por exemplo, se um contêiner for detectado com uma vulnerabilidade, como proceder?

Neste curso, abordaremos como gerenciar um sistema quando ele já está em execução, bem como a gestão preventiva. Exploraremos ambos os aspectos dentro da metodologia proposta. Ao analisarmos o Kubernetes, será necessário traduzir o conceito de uma conta de serviço do Kubernetes para um ambiente em nuvem. Discutiremos como garantir o princípio do menor privilégio de uma identidade para uma conta de serviço, além de correlacionar qual é o recurso por trás de um contêiner, pod, namespace, armazenamento, entre outros.

Examinando mecanismos de segurança no Kubernetes

Ao examinarmos o Kubernetes, teremos uma lista bastante completa de mecanismos de segurança. Abordaremos como controlar desde o momento da admissão do contêiner, passando pela sua criação, até o monitoramento contínuo dentro do ambiente Kubernetes. Este curso pretende apresentar alguns cenários e suas possíveis soluções.

Recomendando leituras e práticas adicionais

Recomendamos a leitura de alguns livros mencionados aqui e a realização de laboratórios, além de responder às perguntas do curso da Alura. Incentivamos a prática constante para entender como esses cenários podem ser adaptados ao seu ambiente.

Começamos sugerindo o livro "Kubernetes in Action". Ele está disponível em inglês e também em português, e foi publicado em março de 2013. O livro é excelente, pois começa explicando o que é um contêiner, como uma aplicação se conecta a um contêiner, até chegar ao Kubernetes e como desenvolvemos o contêiner dentro do Kubernetes.

Estamos animados para este percurso e esperamos encontrá-los na primeira aula.

Introdução à segurança de contêineres - Contêineres e superfície de ataque

Introduzindo os fundamentos de segurança em contêineres

Olá a todos! Bem-vindos ao primeiro módulo do nosso curso. Aqui, discutiremos os fundamentos de segurança em contêineres, começando com uma introdução e abordando a superfície de ataque.

Para entendermos o modelo de operação que temos hoje, onde a escalabilidade está diretamente ligada ao uso de orquestradores de contêineres, precisamos voltar aos anos 2000. Naquela época, o Google se deparou com a questão de ter diversos serviços e aplicações compartilhando o mesmo recurso computacional. A pergunta era: como resolver esse problema? Nos anos 2000, o crescimento ainda estava vinculado aos recursos físicos, como servidores físicos e servidores on-premise. Isso significava que, para uma empresa se tornar global, era necessário ter servidores em diferentes partes do mundo.

Explorando a evolução dos contêineres

A solução surgiu em 2006, quando os engenheiros do Google lançaram os Process Containers, ou Cgroups, grupos de controle. Embora pareça simples agora, essa inovação revolucionou a forma como usamos o kernel do Linux, permitindo a segregação de aplicações e recursos. Com isso, uma aplicação que possui um nível crítico, que faz parte da carga de trabalho principal e que necessita de mais recursos, como memória e CPU, agora pode ser segregada. Isso possibilita que, em momentos de grande tráfego, a aplicação possa responder adequadamente.

Pouco depois, surgiu o LXC de Linux Containers, que combinou o Cgroups com a nomenclatura de namespaces, permitindo a divisão de aplicações por namespaces. Atualmente, temos mais de um tipo de contêiner que pode ser executado dentro de um namespace. Naquele período, o objetivo era tornar o namespace mais claro por serviço.

Ampliando o acesso aos contêineres com Docker e Kubernetes

Em 2013, tivemos o lançamento do Docker, que, em nossa opinião, ampliou o acesso ao conhecimento sobre como usar contêineres. Hoje, quando falamos em criar um novo contêiner, automaticamente pensamos em um Dockerfile, buscamos no Docker Hub e verificamos se está na sintaxe do Docker, que é uma linguagem declarativa. Definimos apenas o que queremos e, em poucos momentos, temos nosso contêiner pronto.

Continuando com a questão de ampliar o acesso aos contêineres e à orquestração de contêineres, o Google lançou o Kubernetes. O Kubernetes é uma orquestração de contêineres, como se fosse a orquestração de uma ópera.

Definindo papéis e parcerias no ecossistema de contêineres

Temos papéis muito bem definidos para cada tipo de momento e para cada etapa desse contêiner, desde a admissão até que ele fique exposto publicamente ou internamente. Isso inclui se ele terá uma conta de serviço, se terá armazenamento ou não. O Google fez uma parceria com a Linux Foundation para que todo esse ecossistema de gestão fosse público, com documentação acessível. É possível acessar o GitHub da Linux Foundation, fazer contribuições e também apresentar ideias à comunidade, com o objetivo de expansão.

Recentemente, temos a Oracle Cloud discutindo sobre o OCI, a Open Container Initiative (Iniciativa de Contêineres Abertos), que visa criar a gestão de contêineres sem a necessidade de gerenciar os servidores, tentando escalar sem a preocupação de quanto será necessário alocar de memória no AWS EKS para manter a aplicação em funcionamento.

Abordando a segurança e a superfície de ataque

Agora que já sabemos como chegamos até aqui, por que devemos nos preocupar quando queremos defender a segurança desse contêiner? Chegamos à questão da superfície de ataque, frequentemente mencionada como attack surface. É importante entender quais são os limites, as portas e as janelas de entrada para saber se o contêiner está seguro ou não.

Dentro da definição de superfície de ataque, temos três categorias: a superfície digital, a superfície física e a engenharia social. Vamos nos concentrar bastante na parte digital, onde entenderemos que essa aplicação web está alojada em um contêiner. Precisamos, então, entender como protegê-la. No entanto, cada uma dessas categorias é extremamente importante de entender, pois fazem parte de todo o fluxo que envolve trabalhar com cibersegurança.

Equipando-se com recursos confiáveis para segurança

Quando falamos de superfície de ataque, também é importante se equipar com sites e recursos confiáveis. Temos o site Zero Day, o FortiGuard Labs tratando sobre ameaças, e algumas empresas de proteção de contêineres, como a Wiz, que contribui bastante. Por exemplo, uma vulnerabilidade crítica e como ela se aplica ao contêiner, como foi explorada. Utilizando essas fontes confiáveis, podemos entender como essa exploração foi realizada e verificar se nosso ambiente está vulnerável a essa vulnerabilidade.

Esta é uma aula em que começamos a entrar em contato com as vulnerabilidades e o contêiner. Vamos aprofundar nos cenários, entender como realizar essas explorações, o que é vulnerável e o que não é. Obrigado por assistir até aqui e nos vemos na próxima!

Introdução à segurança de contêineres - Containers vs VMs

Introduzindo o tema da aula

Olá a todos! Bem-vindos à segunda aula do nosso módulo de Fundamentos de Segurança em Contêineres. Vamos discutir sobre contêineres e máquinas virtuais (VMs), as diferenças entre eles e os riscos associados ao uso de cada um.

Na aula passada, abordamos o contexto de por que utilizar contêineres e como surgiu a orquestração de contêineres com Kubernetes. Para começar, utilizamos uma metáfora rápida: uma VM é como um condomínio de casas, onde cada inquilino tem seu lote e precisa construir sua própria porta e instalação elétrica. Em contrapartida, um contêiner é como um edifício com vários apartamentos por andar, onde compartilham a mesma porta de entrada, móveis e regras.

Comparando arquiteturas de VMs e contêineres

Traduzindo isso para a arquitetura de computadores, as VMs possuem um kernel e um hypervisor independentes. É como se tivéssemos um computador real ali, com um sistema operacional convidado, onde o kernel não é compartilhado; é uma VM, uma máquina completa. Já no contêiner, utilizamos a camada de aplicação. O contêiner roda sobre o kernel e utiliza conceitos como namespaces e cgroups, empacotando tudo.

Quando falamos de VMs, mencionamos CPU, RAM, armazenamento, e o problema do uso de servidores físicos, nos quais é necessário aumentar essas capacidades para garantir escalabilidade. Caso contrário, haverá limitações. Em contrapartida, o contêiner é leve, inicia rapidamente, permite uma maior densidade de cargas de trabalho no mesmo host e compartilha o kernel do Linux.

Explorando riscos de segurança

Trouxemos um artigo muito interessante da Atlassian, uma empresa de referência mundial, que discute essas diferenças e permite um aprofundamento maior. Vamos focar nos riscos de segurança ao utilizar cada uma dessas tecnologias.

Dado o modelo em que as VMs possuem isolamento de hardware, com seu próprio sistema operacional, kernel e memória, elas são mais seguras, pois é necessário comprometer a máquina inteira para obter acesso indevido. Em contrapartida, quando falamos de contêineres, se de algum modo comprometemos um namespace, há a possibilidade de comprometer o kernel, e ao comprometer o kernel, comprometemos as aplicações, já que compartilham o mesmo host.

Avaliando cenários de uso

Ao considerar situações, podemos nos perguntar: o que é melhor, VM ou contêiner? Suponhamos que temos aplicações legadas ou que são executadas em sistemas operacionais distintos. Nesse caso, ao utilizar VMs, será necessário uma VM para cada sistema operacional diferente. Quando falamos de contêineres, que parecem ser uma melhor opção para aplicações legadas, eles compartilham o mesmo kernel, e cada contêiner terá seu próprio sistema operacional.

Outro exemplo é quando falamos sobre a necessidade de isolamento. Precisamos que um serviço que manipula dados sensíveis não tenha nenhum tipo de contato com outras aplicações. Entendemos que a VM, com seu próprio sistema operacional e hypervisor, oferece essa barreira, funcionando como um computador completo para uma aplicação muito restrita. Em contrapartida, o contêiner requer camadas de isolamento na orquestração, como no Kubernetes, para protegê-lo. São necessárias políticas de rede e compreensão sobre qual é a conta de serviço e quais serviços podem se comunicar com a aplicação crítica.

Concluindo a discussão sobre segurança

Embora hoje em dia o contêiner esteja amplamente difundido, por certos aspectos, ainda temos a VM com sua robustez e segurança. No entanto, nada impede que tenhamos contêineres seguros da mesma forma, com mais camadas para garantir a mesma robustez e segurança. Essas são as diferenças: basicamente, podemos ter um caso em que um compartilha o kernel e o outro não. Contudo, é importante lembrar que podemos proteger ambos.

Como o foco aqui é falar de contêineres, continuaremos em nossas aulas focando em como levar a robustez de segurança ao ambiente de contêineres e orquestração. Agradecemos por assistir a esta aula e nos vemos na próxima.

Sobre o curso Containers e Kubernetes: segurança de aplicações e supply chain

O curso Containers e Kubernetes: segurança de aplicações e supply chain possui 261 minutos de vídeos, em um total de 69 atividades. Gostou? Conheça nossos outros cursos de Segurança em DevOps, ou leia nossos artigos de DevOps.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Segurança acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas