Qualquer tamanho de empresa hoje precisa de um servidor para guardar suas imagens docker. Muito além de apenas um repositório de imagens, o Harbor permite gerenciar o acesso de forma simples, além de garantir uma ótima performance. Mas o que vou tratar aqui é como tornar as imagens no Harbor seguras e confiáveis para o uso.

Não é incomum utilizarmos imagens do dockerhub para ganhar um pouco de tempo. Aquela imagem com Tomcat, PHP ou MySQL já preparada pronta pra subir com uma linha de comando, torna a vida do dev bem prática, mas, e a segurança? Sendo de fontes oficiais, o sistema operacional está atualizado? Os pacotes tem alguma vulnerabilidade? Podem seguramente ser usados em ambiente de produção?

Ainda temos outro ponto a nos preocupar. Há no dockerhub incontáveis imagens publicadas de fontes não oficiais com o objetivo de auxiliar devs, mas que podem conter outros scripts embutidos da qual não temos conhecimento.

Para tornar seguro o deploy de imagens do nosso registro para um cluster kubernetes por exemplo, temos que ter a confiança de que não há um virus, ransomware ou um minerador de bitcoin embutido. Para isso podemos utilizar o Trivy, que é um scanner de vulnerabilidade que pode ser ativado para scanear automaticamente as imagens assim que fizermos push para o nosso registry.

Sem mais delongas, acompanhe como é fácil levantar um servidor com Harbor, como fazer o scanner de modo automatizado, resolver algumas vulnerabilidades e até mesmo impedir que imagens não seguras sejam utilizadas em produção, garantindo um ambiente mais seguro para as nossas aplicações.

Instalando

Primeiro passo, instalação do docker e do docker compose. Se você já tiver ambas as aplicações instaladas, pode pular essa parte.

# Instalação do docker
curl https://releases.rancher.com/install-docker/19.03.sh | sh

# Instalação do docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Com os pré-requisitos atendidos, vamos ao download e instalação do harbor

wget https://github.com/goharbor/harbor/releases/download/v2.1.5/harbor-online-installer-v2.1.5.tgz

tar zxf harbor-online-installer-v2.1.5.tgz

Ao descompactar, será criado uma nova pasta chamada harbor com o seu conteúdo para instalação. Conforme mostrado abaixo, há um arquivo de template do manifesto de instalação. Copie o arquivo harbor.yml.tmpl para harbor.yml e abra com algum editor (vim, nano, etc) para modificar algumas linhas.

Conteúdo do arquivo descompactado.

Crie um domínio apontando para esse servidor e coloque na linha 5 o domínio que foi criado. Como não utilizaremos SSL por enquanto, comente as linhas 13 a 18. Salve e vamos para o passo da instalação. Se quiser fazer a instalação com certificado LetsEncrypt, veja o post Harbor com SSL que publiquei também.

Atentar para o hostname e desativar o https

Para instalar, vamos executar o comando com o addon do trivy.

./install.sh --with-trivy

Após concluído com sucesso, veremos o texto conforme a abaixo.

Instalação concluída.

Acessando e configurando

Agora que já temos o harbor instalado, vamos acessar e fazer umas configurações mínimas.

Tela inicial do harbor.

No primeiro acesso utilize o login admin e a senha Harbor12345
Lembre-se de alterar a senha do admin logo no primeiro acesso.

Dentro do Harbor, clique no botão New Project e preencha o campo Project Name. Você também poderá definir se o projeto é público e definir uma quota para ele.

Nome para o projeto e mais algumas definições.

Em Administration ==> User, crie um novo usuário para poder fazer push/pull das imagens.

Lembre-se de colocar uma senha segura.

Volte ao projeto e adicione o usuário criado como membro do projeto.

Digite o nome do usuário recém criado.

Ainda no projeto, clique em Configuration e marque a caixa Automatically scan images on push. Isso vai fazer com que o Harbor dispare o scan na imagem automaticamente quando alguém fizer um push.

No bash, vamos fazer login no nosso registry com a conta recém criada.

Testando uma imagem

Vamos baixar uma imagem qualquer, e enviar para nosso registry.

# Baixando uma imagem do PostgreSQL
docker pull postgres:9.4.13

# Tag
docker tag postgres:9.4.13 harbor.localhost.com/devops/postgres:9.4.13

# Enviando para nosso registry
docker push harbor.localhost.com/devops/postgres:9.4.13

Quando o push terminar, veremos a imagem no nosso projeto devops. Como o scaneamento é bem rápido, provavelmente você já verá o resultado conforme abaixo.

A imagem mostra a quantidade de vulnerabilidades encontrada nessa imagem. Isso mostra a série de cuidados que devemos ter antes de utilizar essa imagem em ambientes de produção, mesmo que não seja uma aplicação web por exemplo. Clicando na imagem, teremos mais detalhes das vulnerabilidades encontradas.

Lista de vulnerabilidades encontrada

O sistema mostra as vulnerabilidades ordenado por severidade e com detalhes de cada uma delas. Na maioria dos casos, em imagens oficiais, podemos resolver essas vulnerabilidades executando um update na imagem e reenviando ela novamente para o Harbor. Veja abaixo como podemos fazer.

# Vamos executar a imagem com seu bash
docker run -it postgres:9.4.13 bash

# Atualiza
apt-get update
apt-get upgrade

# Vamos fazer o commit 
docker commit <id do container>

# Tag
docker tag <hash do commit> harbor.localhost.com/devops/postgres:9.4.13

# Envia novamente para o registry
docker push harbor.localhost.com/devops/postgres:9.4.13

Como podemos ver na imagem abaixo, foi gerado uma nova imagem, porém, com as vulnerabilidades resolvidas.

Vulnerabilidade resolvida.

Agora temos uma imagem mais segura para ser usada em produção.

Reforçando a segurança

Podemos impedir que uma imagem não segura seja utilizada por engano. Para isso, entre nas configurações do projeto e marque a caixa Prevent vulnerable images from running.

Impedir imagens com vulnerabilidade de serem utilizadas.

Conforme mostrado abaixo, se tentarmos fazer o pull de alguma imagem com vulnerabilidade, o Harbor não vai permitir.

Com isso poderemos ter um registry que vai garantir muito mais segurança nas publicações das aplicações, uma vez que imagens não atualizadas e com vulnerabilidades conhecidas não poderão ser utilizadas.

Conclusão

O Harbor com Trivy ativado permitira manter imagens mais seguras garantindo um ambiente mais confiável. Nesse teste fizemos a instalação em server local, mas se você quiser utilizar de certificado e acesso via https, não deixe de ver o post Harbor com SSL.

Também, para complementar a segurança, você poderá fazer essa verificação de vulnerabilidade antes mesmo de fazer o push da imagem. Para isso, veja o posto Imagens seguras com Trivy.


Cleberson

Casado, pai de família, autodidata e amante de tecnologia. Especialista em PHP, MySQL e PostgreSQL, certificado em RedHat e formando em Gestão de TI.

1 comentário

Imagens seguras com trivy – Cleberson Blog · 15 de maio de 2021 às 03:42

[…] Você também pode executar a verificação em um registry passando a url dela. Veja em um exemplo no registry que eu criei no post Registry seguro com Harbor e Trivy. […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *