Introdução à Segurança de Contêineres com Docker

CompTIABeginner
Pratique Agora

Introdução

Bem-vindo a este laboratório prático sobre os fundamentos de segurança de contêineres com Docker. Docker é uma plataforma poderosa para desenvolver, distribuir e executar aplicações em contêineres. Embora os contêineres forneçam isolamento de processos, a sua segurança é crucial para proteger as suas aplicações e o sistema hospedeiro.

Neste laboratório, você explorará os fundamentos de segurança de contêineres Docker. Primeiro, você verificará se o Docker está configurado corretamente no ambiente LabEx. Em seguida, você executará um contêiner básico de servidor web Nginx, inspecionará seus processos em execução e examinará seu consumo de recursos. Finalmente, você aprenderá como aplicar controles de segurança fundamentais definindo limites de recursos em um contêiner.

Ao final deste laboratório, você terá uma compreensão prática dos passos iniciais envolvidos na segurança de um ambiente Docker.

Verificar Instalação e Configuração do Docker

Nesta etapa, você verificará se o Docker já está instalado no ambiente LabEx e garantirá que você tenha as permissões adequadas para usá-lo.

A máquina virtual LabEx vem com o Docker pré-instalado. Vamos primeiro verificar a versão do Docker para confirmar que ele está disponível.

docker --version

Você deverá ver uma saída semelhante a esta, confirmando que o Docker está instalado corretamente:

Docker version 20.10.21, build 20.10.21-0ubuntu1~22.04.3

Agora vamos verificar se o daemon do Docker está em execução:

sudo systemctl status docker

Este comando mostrará o status do serviço Docker. Você deverá ver que ele está ativo e em execução.

Para executar comandos Docker sem sudo, seu usuário precisa pertencer ao grupo docker. No ambiente LabEx, seu usuário já está configurado com as permissões adequadas. Vamos verificar isso:

groups $USER

Você deverá ver docker na saída, confirmando que seu usuário tem as permissões necessárias:

labex : labex sudo docker ssl-cert

Como seu usuário já está no grupo docker, você pode executar comandos Docker diretamente sem precisar de sudo.

Vamos testar se o Docker está funcionando corretamente executando um comando simples:

docker info

Este comando exibirá informações sobre o Docker em todo o sistema, confirmando que você pode se comunicar com o daemon do Docker com sucesso.

Executar um Contêiner Básico de Servidor Web

Nesta etapa, você executará seu primeiro contêiner. Usaremos a imagem oficial nginx, que fornece um servidor web leve e de alto desempenho.

Para executar um contêiner, você usa o comando docker run. Usaremos algumas flags comuns:

  • -d: Executa o contêiner em modo detached (em segundo plano).
  • -p 8080:80: Mapeia a porta 8080 no host para a porta 80 dentro do contêiner. Isso permite que você acesse o servidor Nginx através de localhost:8080.
  • --name webserver: Atribui um nome memorável ao seu contêiner.
  • nginx: O nome da imagem a ser usada.

Execute o seguinte comando para iniciar o contêiner Nginx:

docker run -d -p 8080:80 --name webserver nginx

O Docker primeiro verificará se a imagem nginx está disponível localmente. Se não estiver, ele a baixará automaticamente do Docker Hub e, em seguida, iniciará o contêiner. Você pode ver que o contêiner está em execução usando o comando docker ps.

docker ps

A saída mostrará seu contêiner webserver, seu ID, a imagem na qual ele se baseia e o mapeamento de portas.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a1b2c3d4e5f6   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   webserver

Agora, vamos testar se o servidor web está funcionando. Use curl para enviar uma requisição ao servidor na porta mapeada.

curl localhost:8080

Você deverá ver o HTML da página de boas-vindas padrão do Nginx como saída, o que confirma que seu contêiner está em execução e acessível.

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. For further configuration, refer to the
      <a href="http://nginx.org/">nginx.org</a> documentation.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

Examinar Processos e Uso de Recursos do Contêiner

Nesta etapa, você aprenderá como inspecionar os processos em execução dentro de um contêiner e monitorar seu consumo de recursos. Esta é uma habilidade fundamental para depurar e entender como sua aplicação conteinerizada se comporta.

Uma característica chave dos contêineres é o isolamento de processos. Da perspectiva do host, você pode ver o que está em execução dentro de um contêiner sem precisar usar exec para entrar nele. O comando docker top permite visualizar os processos principais de um contêiner.

Execute o seguinte comando para ver os processos dentro do seu contêiner webserver:

docker top webserver

A saída mostra o processo mestre do Nginx em execução como root e seus processos de trabalho em execução como systemd+ (um usuário do sistema para melhor segurança). Observe que existem múltiplos processos de trabalho, o que é típico para o Nginx lidar com requisições concorrentes de forma eficiente.

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4098                4078                0                   14:34               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            4161                4098                0                   14:34               ?                   00:00:00            nginx: worker process
systemd+            4162                4098                0                   14:34               ?                   00:00:00            nginx: worker process

Em seguida, vamos analisar o uso de recursos do contêiner. O comando docker stats fornece um fluxo em tempo real da CPU, memória, rede e I/O de disco de um contêiner. Para obter um snapshot estático para este laboratório, usaremos a flag --no-stream.

docker stats --no-stream webserver

Este comando exibirá uma tabela com as métricas de recursos atuais para o contêiner webserver.

CONTAINER ID   NAME        CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O     PIDS
bda2386621a1   webserver   0.00%     3.125MiB / 3.505GiB   0.09%     6.31kB / 1.27kB   0B / 12.3kB   3

A partir desta saída, você pode ver que o contêiner está usando muito pouca CPU (0,00%), cerca de 3,1 MiB de memória dos 3,5 GiB de memória do sistema disponíveis (0,09%) e tem 3 processos em execução (o mestre do Nginx e 2 processos de trabalho). Essas informações são vitais para identificar gargalos de desempenho ou possíveis vazamentos de recursos em suas aplicações.

Inspecionar Propriedades de Segurança do Contêiner, como Limites de Recursos

Nesta etapa, você explorará um dos recursos de segurança de contêineres mais básicos, porém críticos: os limites de recursos. Por padrão, um contêiner pode usar o quanto de CPU e memória do host desejar. Definir limites impede que um único contêiner consuma todos os recursos disponíveis e afete outros contêineres ou o próprio host.

Primeiro, vamos inspecionar a configuração do contêiner webserver que criamos anteriormente. O comando docker inspect fornece uma saída JSON detalhada com todas as configurações do contêiner.

docker inspect webserver

A saída é muito longa. Você pode usar a flag --format para extrair campos específicos. Vamos verificar se algum limite de memória está definido.

docker inspect --format='{{.HostConfig.Memory}}' webserver

A saída será 0, o que significa que não há limite de memória.

0

Agora, vamos criar um novo contêiner com um limite de memória. Primeiro, você precisa parar e remover o contêiner existente, pois reutilizaremos o mapeamento de porta.

docker stop webserver
docker rm webserver

Em seguida, execute um novo contêiner Nginx, mas desta vez adicione a flag --memory="100m" para limitar seu uso de memória a 100 megabytes. Também daremos a ele um novo nome.

docker run -d -p 8080:80 --name webserver-limited --memory="100m" nginx

Agora, inspecione o limite de memória deste novo contêiner.

docker inspect --format='{{.HostConfig.Memory}}' webserver-limited

Desta vez, a saída será o limite de memória em bytes (100 × 1024 × 1024).

104857600

Você aplicou com sucesso uma restrição de recursos a um contêiner, o que é um passo fundamental na segurança de contêineres e no gerenciamento de recursos.

Resumo

Neste laboratório, você adquiriu experiência prática com os aspectos fundamentais do Docker e da segurança de contêineres.

Você com sucesso:

  • Verificou a instalação do Docker e configurou permissões de acesso adequadas no ambiente LabEx.
  • Executou um servidor web Nginx básico como um contêiner Docker.
  • Mapeou portas para acessar a aplicação conteinerizada a partir do host.
  • Inspecionou os processos em execução dentro de um contêiner usando docker top.
  • Monitorou o uso de recursos em tempo real com docker stats.
  • Aprendeu como definir limites de recursos, como memória, em um contêiner para melhorar a estabilidade e segurança do sistema.

Essas habilidades são os blocos de construção para gerenciar e proteger aplicações mais complexas e com múltiplos contêineres em um ambiente de produção.