Skip to main content

Use imagens UBI para minimizar vulnerabilidades em contêineres

Escrito por
Headshot of Rags Srinivas

Rags Srinivas

Blog Design Red

27 de março de 2020

0 minutos de leitura

Na Snyk, trabalhamos continuamente para aprimorar nossas soluções de segurança para contêineres e ambientes cloud-native. Como parte desse esforço, Snyk Container permite que os desenvolvedores assumam total responsabilidade pela segurança de suas imagens de contêiner.

Uma fonte comum de vulnerabilidades em contêineres é a imagem base usada como alicerce para criar imagens personalizadas. Em vez de apenas reagir a novas vulnerabilidades, é recomendável adotar uma abordagem proativa e começar com um conjunto de imagens base bem selecionadas e atualizadas continuamente.

Neste post, vamos conhecer as Red Hat Universal Base Images, que ajudam a atingir esse objetivo.

O que é a Universal Base Image (UBI)?

Anunciadas no Red Hat Summit em 2019, as Universal Base Images da Red Hat são criadas em uma plataforma de nível empresarial, o Red Hat Enterprise Linux (RHEL). São imagens de sistema operacional base para contêineres compatíveis com OCI, com diversas linguagens de runtime e pacotes que podem ser redistribuídos gratuitamente. Por exemplo, as imagens UBI 8 são atualizadas sempre que as imagens base do RHEL 8 são atualizadas e quando CVEs críticas são corrigidas.

Do ponto de vista técnico, elas são praticamente idênticas às imagens do Red Hat Enterprise Linux, o que significa que oferecem segurança, desempenho e ciclos de vida excelentes. Elas são disponibilizadas sob um Contrato de Licença de Usuário Final diferente. É possível criar um aplicativo em contêiner usando UBI, enviá-lo para qualquer servidor de registro, compartilhá-lo facilmente com outras pessoas e, por ser redistribuível gratuitamente, até mesmo implantá-lo em plataformas que não são da Red Hat.

Confira todos os detalhes na documentação da Red Hat sobre criação, execução e gerenciamento de contêineres. As imagens de contêiner certificadas também estão disponíveis no catálogo de contêineres da Red Hat. As imagens UBI abrangem diversas linguagens de programação populares, incluindo dotnet, golang, nodejs, Python, PHP e Ruby.

Você encontra mais informações sobre as imagens UBI nas perguntas frequentes da Red Hat. Como mostramos a seguir, é fácil incorporar imagens UBI ao seu fluxo de trabalho.

Como criar imagens de contêiner usando UBI

Vamos começar com um exemplo de Dockerfile para Python. É possível usar imagens UBI para diferentes runtimes de linguagem seguindo uma abordagem semelhante.

Veja um Dockerfile gerado automaticamente para um exemplo simples de “Hello World!” em Python que usa o Flask.

FROM python
ENV PORT 8080
EXPOSE 8080
WORKDIR /usr/src/app

COPY requirements.txt . 
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENTRYPOINT ["python"] 
CMD ["app.py"]

Em vez de usar python como imagem base, vamos usar a imagem UBI do registro da Red Hat e modificar o Dockerfile conforme mostrado abaixo. (Talvez você precise das credenciais corretas para autenticar e usar as imagens.) Observe que a única alteração está na primeira linha, onde usamos a imagem UBI.

FROM registry.redhat.io/ubi8/python-36
ENV PORT 8080
EXPOSE 8080
WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENTRYPOINT ["python"] 
CMD ["app.py"]

Gerar um aplicativo em contêiner com uma imagem UBI como base é igual a fazer isso com uma imagem que não seja UBI, como mostrado abaixo:

docker build -t ragsns/example-python-ubi .

Ao executar o Snyk no aplicativo em contêiner que usa uma imagem UBI como base, você obtém uma lista de vulnerabilidades, conforme mostrado abaixo.

snyk test --container ragsns/example-python-ubi --file=Dockerfile          

Testing ragsns/example-python-ubi...

✗ Low severity vulnerability found in npm
  Description: RHEA-2020:0330
  Info: https://snyk.io/vuln/SNYK-RHEL8-NPM-555355
  Introduced through: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  From: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:6.13.4-1.12.14.1.1.module+el8.1.0+5466+30f75629

✗ Low severity vulnerability found in nodejs
  Description: RHEA-2020:0330
  Info: https://snyk.io/vuln/SNYK-RHEL8-NODEJS-555347
  Introduced through: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  From: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:12.14.1-1.module+el8.1.0+5466+30f75629

✗ High severity vulnerability found in systemd-pam
  Description: RHSA-2020:0575
  Info: https://snyk.io/vuln/SNYK-RHEL8-SYSTEMDPAM-552042
  Introduced through: systemd-pam@239-18.el8_1.2
  From: systemd-pam@239-18.el8_1.2
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 0:239-18.el8_1.4

✗ High severity vulnerability found in systemd-libs
  Description: RHSA-2020:0575
  Info: https://snyk.io/vuln/SNYK-RHEL8-SYSTEMDLIBS-552044
  Introduced through: systemd-libs@239-18.el8_1.2
  From: systemd-libs@239-18.el8_1.2
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 0:239-18.el8_1.4

✗ High severity vulnerability found in systemd
  Description: RHSA-2020:0575
  Info: https://snyk.io/vuln/SNYK-RHEL8-SYSTEMD-552048
  Introduced through: systemd@239-18.el8_1.2
  From: systemd@239-18.el8_1.2
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 0:239-18.el8_1.4

✗ High severity vulnerability found in npm
  Description: RHSA-2020:0579
  Info: https://snyk.io/vuln/SNYK-RHEL8-NPM-555375
  Introduced through: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  From: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:6.13.4-1.10.19.0.1.module+el8.1.0+5726+6ed65f8c

✗ High severity vulnerability found in npm
  Description: RHSA-2020:0598
  Info: https://snyk.io/vuln/SNYK-RHEL8-NPM-557042
  Introduced through: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  From: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:6.13.4-1.12.16.1.1.module+el8.1.0+5811+44509afe

✗ High severity vulnerability found in nodejs
  Description: RHSA-2020:0579
  Info: https://snyk.io/vuln/SNYK-RHEL8-NODEJS-555367
  Introduced through: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  From: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:10.19.0-1.module+el8.1.0+5726+6ed65f8c

✗ High severity vulnerability found in nodejs
  Description: RHSA-2020:0598
  Info: https://snyk.io/vuln/SNYK-RHEL8-NODEJS-557034
  Introduced through: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  From: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:12.16.1-1.module+el8.1.0+5811+44509afe

Organization:      rags
Package manager:   rpm
Target file:       Dockerfile
Project name:      docker-image|ragsns/example-python-ubi
Docker image:      ragsns/example-python-ubi
Base image:        registry.redhat.io/ubi8/python-36
Licenses:          enabled

Tested 417 dependencies for known issues, found 9 issues.

Executar a imagem de contêiner baseada em UBI também é igual a executar o aplicativo baseado em uma imagem que não seja UBI, como mostrado abaixo.

docker run -it -p8080:8080 ragsns/example-python-ubi

Isso é possível graças ao que a documentação descreve: “As novas Red Hat Universal Base Images permitem criar seu contêiner UMA VEZ e redistribuí-lo gratuitamente em várias plataformas de implantação.”

Ou, se preferir usar o conjunto de ferramentas de contêiner da Red Hat para testar ou executar o aplicativo, você pode usar o seguinte comando:

podman run -p 8080:8080 ragsns/example-python-ubi

Agora que vimos um exemplo com Python, em vez de abordar individualmente cada exemplo de runtime de linguagem (que talvez exija algumas pequenas alterações para funcionar com o runtime correspondente), vamos analisar todos em conjunto.

Imagens UBI para várias linguagens

Como mencionamos, há imagens UBI para vários runtimes de linguagem. A execução do Snyk nas diferentes imagens UBI gera resultados resumidos na tabela a seguir.

Imagem UBI

Dependências

Vulnerabilidades

registry.redhat.io/ubi8/nodejs-10

373

9

registry.redhat.io/ubi8/python-36

417

9

registry.redhat.io/ubi8/ruby-26

481

9

registry.redhat.io/ubi8/php-73

403

9

registry.redhat.io/ubi8/go-toolset

371

13

registry.redhat.io/ubi8/dotnet-21

248

10

A variedade de linguagens disponíveis nas imagens UBI e o baixo número de vulnerabilidades são resultado do trabalho cuidadoso da Red Hat para selecionar e atualizar esses componentes, incluindo o sistema operacional base, os repositórios yum usados para instalar pacotes e ferramentas, além das linguagens e dos frameworks. Este artigo da Red Hat explica o processo em detalhes, que inclui a manutenção de uma lista de bugs das imagens UBI e sua atualização periódica, em um processo semelhante ao usado no próprio sistema operacional base.

Resumo e próximos passos

Mostramos como é fácil usar imagens UBI como base para aplicativos em contêiner que utilizam diversos runtimes de linguagem. As alterações, incluindo a obtenção da imagem UBI da Red Hat, são fáceis de implementar e incorporar ao pipeline de CI/CD ou desenvolvimento, sem deixar de seguir os fluxos de trabalho habituais.

Do ponto de vista da segurança, as imagens UBI são uma boa opção para colocar seus aplicativos em contêineres. Como vimos, elas passam por um processo rigoroso de manutenção, alinhado ao processo já consolidado do sistema operacional RHEL. Como há imagens UBI para vários runtimes de linguagem, usá-las como base para suas imagens de contêiner ajuda a minimizar as vulnerabilidades no aplicativo.

A Snyk ajuda a proteger o desenvolvimento de aplicativos durante todo o ciclo de vida do desenvolvimento de software, com integrações ao registro de imagens, ao repositório do Dockerfile, aos pipelines de CI/CD e aos clusters do Kubernetes, incluindo ambientes OpenShift 4. O Snyk Container oferece suporte a imagens UBI e RHEL, além de outras distribuições Linux populares.

Segurança de contêineres que prioriza os desenvolvedores

O Snyk encontra e corrige automaticamente vulnerabilidades em imagens de contêiner e workloads do Kubernetes.