quarta-feira, 18 de fevereiro de 2026

Devops - Trivy

 


Trivytripronuncia-se como "trigger ", vypronuncia-se como "en- vy ") é um scanner de vulnerabilidades simples e abrangente para contêineres. Uma vulnerabilidade de software é uma falha, defeito ou fraqueza presente no software ou em um sistema operacional. TrivyEle detecta vulnerabilidades de pacotes do sistema operacional (Alpine, RHEL, CentOS, etc.) e dependências de aplicativos (Bundler, Composer, npm, yarn, etc.). TrivyÉ fácil de usar. Basta instalar o binário e você estará pronto para escanear. Tudo o que você precisa fazer para escanear é especificar o nome da imagem do contêiner.

Demonstração

Características

  • Detectar vulnerabilidades abrangentes
    • Pacotes de SO (Alpine, Red Hat Universal Base Image , Red Hat Enterprise Linux, CentOS, Debian, Ubuntu, Amazon Linux e Distroless)
    • Dependências da aplicação (Bundler, Composer, Pipenv, Poetry, npm, yarn e Cargo)
  • Simples
  • Instalação fácil
    • apt-get installé possível (Veja yum installInstalação )brew install
    • Não há pré-requisitos , como instalação de banco de dados, bibliotecas etc. (A exceção é a necessidade de rpminstalar o pacote para analisar imagens baseadas em RHEL/CentOS. Este pacote é incluído automaticamente se você usar nossos instaladores ou a imagem de contêiner Trivy. Consulte a seção Detecção de Vulnerabilidades para obter mais informações.)
  • Alta precisão
    • Especialmente Alpine Linux e RHEL/CentOS
    • Outros sistemas operacionais também são altos
  • DevSecOps
    • Adequado para integração contínua (CI) como Travis CI, CircleCI, Jenkins, etc.
    • Veja o exemplo de CI

Início rápido

Basta especificar um nome de imagem (e uma tag). latesttag deve ser evitada, pois pode causar problemas com o cache de imagens. Consulte Limpar caches de imagens .

Básico

$ trivy [YOUR_IMAGE_NAME]

Por exemplo:

$ trivy python:3.4-alpine

Docker

Substitua [YOUR_CACHE_DIR] pelo diretório de cache em sua máquina.

$ docker run --rm -v [YOUR_CACHE_DIR]:/root/.cache/ aquasec/trivy [YOUR_IMAGE_NAME]

Exemplos

Digitalizar uma imagem

Basta especificar o nome da imagem (e uma etiqueta).

$ trivy knqyf263/vuln-image:1.2.3

Filtre as vulnerabilidades por gravidade.

$ trivy --severity HIGH,CRITICAL ruby:2.3.0

Ignorar atualização do banco de dados de vulnerabilidades

TrivyO sistema sempre atualiza seu banco de dados de vulnerabilidades ao iniciar a operação. Isso geralmente é rápido, pois se trata de uma atualização de diferenças. Mas, se você quiser ignorar até mesmo essa atualização, use a --skip-updateopção.

$ trivy --skip-update python:3.4-alpine3.9

Atualizar apenas as distribuições especificadas

Por padrão, Trivyo banco de dados de vulnerabilidades é sempre atualizado para todas as distribuições. Use a --only-updateopção se desejar especificar quais distribuições devem ser atualizadas.

$ trivy --only-update alpine,debian python:3.4-alpine3.9
$ trivy --only-update alpine python:3.4-alpine3.9

Baixe apenas o banco de dados de vulnerabilidades.

Você também pode solicitar Trivysimplesmente a recuperação do banco de dados de vulnerabilidades. Isso é útil para inicializar processos em sistemas de Integração Contínua. Na primeira execução, a --only-updateopção é ignorada silenciosamente.

$ trivy --download-db-only
$ trivy --download-db-only --only-update alpine

Ignore as vulnerabilidades não corrigidas

Por padrão, Trivytambém detecta vulnerabilidades não corrigidas. Isso significa que você não poderá corrigir essas vulnerabilidades mesmo se atualizar todos os pacotes. Se desejar ignorá-las, use a --ignore-unfixedopção.

$ trivy --ignore-unfixed ruby:2.3.0

Especifique o código de saída

Por padrão, Trivyo programa é encerrado com o código 0, mesmo quando vulnerabilidades são detectadas. Use a --exit-codeopção se desejar encerrar com um código de saída diferente de zero.

$ trivy --exit-code 1 python:3.4-alpine3.9

Essa opção é útil para CI/CD. No exemplo a seguir, o teste falhará somente quando uma vulnerabilidade crítica for encontrada.

$ trivy --exit-code 0 --severity MEDIUM,HIGH ruby:2.3.0
$ trivy --exit-code 1 --severity CRITICAL ruby:2.3.0

Ignore as vulnerabilidades especificadas

Usar .trivyignore.

$ cat .trivyignore
# Accept the risk
CVE-2018-14618

# No impact in our settings
CVE-2019-1543

$ trivy python:3.4-alpine3.9

Especifique o diretório de cache.

$ trivy --cache-dir /tmp/trivy/ python:3.4-alpine3.9

Limpar cache de imagens

Essa --clear-cacheopção remove os caches de imagem. Ela é útil se a imagem que possui a mesma tag for atualizada (como ao usar latesta tag).

$ trivy --clear-cache python:3.7

Reiniciar

Essa --resetopção remove todos os caches e o banco de dados. Depois disso, o processo demora bastante, pois o banco de dados de vulnerabilidades precisa ser reconstruído localmente.

$ trivy --reset

Integração Contínua (IC)

Analise sua imagem criada no Travis CI/CircleCI. O teste falhará se uma vulnerabilidade for encontrada. Caso não queira que o teste falhe, especifique --exit-code 0.

Observação : A primeira vez pode demorar um pouco (a partir da segunda vez, o carregamento será mais rápido devido ao cache).

Travis CI

$ cat .travis.yml
services:
  - docker

env:
  global:
    - COMMIT=${TRAVIS_COMMIT::8}

before_install:
  - docker build -t trivy-ci-test:${COMMIT} .
  - export VERSION=$(curl --silent "https://api.github.com/repos/aquasecurity/trivy/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
  - wget https://github.com/aquasecurity/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
  - tar zxvf trivy_${VERSION}_Linux-64bit.tar.gz
script:
  - ./trivy --exit-code 0 --severity HIGH --no-progress --auto-refresh trivy-ci-test:${COMMIT}
  - ./trivy --exit-code 1 --severity CRITICAL --no-progress --auto-refresh trivy-ci-test:${COMMIT}
cache:
  directories:
    - $HOME/.cache/trivy

Exemplo: https://travis-ci.org/aquasecurity/trivy-ci-test
Repositório: https://github.com/aquasecurity/trivy-ci-test

CircleCI

$ cat .circleci/config.yml
jobs:
  build:
    docker:
      - image: docker:18.09-git
    steps:
      - checkout
      - setup_remote_docker
      - restore_cache:
          key: vulnerability-db
      - run:
          name: Build image
          command: docker build -t trivy-ci-test:${CIRCLE_SHA1} .
      - run:
          name: Install trivy
          command: |
            apk add --update curl
            VERSION=$(
                curl --silent "https://api.github.com/repos/aquasecurity/trivy/releases/latest" | \
                grep '"tag_name":' | \
                sed -E 's/.*"v([^"]+)".*/\1/'
            )

            wget https://github.com/aquasecurity/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
            tar zxvf trivy_${VERSION}_Linux-64bit.tar.gz
            mv trivy /usr/local/bin
      - run:
          name: Scan the local image with trivy
          command: trivy --exit-code 0 --no-progress --auto-refresh trivy-ci-test:${CIRCLE_SHA1}
      - save_cache:
          key: vulnerability-db
          paths:
            - $HOME/.cache/trivy
workflows:
  version: 2
  release:
    jobs:
      - build

Exemplo: https://circleci.com/gh/aquasecurity/trivy-ci-test
Repositório: https://github.com/aquasecurity/trivy-ci-test

GitLab

$ cat .gitlab-ci.yml
stages:
  - test

trivy:
  stage: test
  image: docker:stable-git
  before_script:
    - docker build -t trivy-ci-test:${CI_COMMIT_REF_NAME} .
    - export VERSION=$(curl --silent "https://api.github.com/repos/aquasecurity/trivy/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
    - wget https://github.com/aquasecurity/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
    - tar zxvf trivy_${VERSION}_Linux-64bit.tar.gz
  variables:
    DOCKER_DRIVER: overlay2
  allow_failure: true
  services:
    - docker:stable-dind
  script:
    - ./trivy --exit-code 0 --severity HIGH --no-progress --auto-refresh trivy-ci-test:${CI_COMMIT_REF_NAME}
    - ./trivy --exit-code 1 --severity CRITICAL --no-progress --auto-refresh trivy-ci-test:${CI_COMMIT_REF_NAME}
  cache:
    directories:
      - $HOME/.cache/trivy

Autorização para registro Docker privado

O Trivy consegue baixar imagens de um registro privado sem a necessidade de instalar Dockernenhuma ferramenta de terceiros. Isso porque ele é fácil de executar em um processo de CI (Integração Contínua).

Tudo o que você precisa fazer é instalar Trivye configurar as variáveis ​​de ambiente. Mas eu não recomendo o uso de variáveis ​​de ambiente na sua máquina local.

Docker Hub

O Docker Hub precisa de `--env` TRIVY_AUTH_URL, ` --env` TRIVY_USERNAMEe `--env` TRIVY_PASSWORD. Você não precisa definir variáveis ​​de ambiente ao baixar de um repositório público.

export TRIVY_AUTH_URL=https://registry.hub.docker.com
export TRIVY_USERNAME={DOCKERHUB_USERNAME}
export TRIVY_PASSWORD={DOCKERHUB_PASSWORD}

Amazon ECR (Elastic Container Registry)

O Trivy utiliza o SDK da AWS. Você não precisa instalar awsa ferramenta de linha de comando. Você pode usar as variáveis ​​de ambiente da AWS CLI .

GCR (Google Container Registry)

O Trivy utiliza o SDK do Google Cloud. Você não precisa instalar gcloudnenhum comando.

Se você deseja usar o repositório do projeto de destino, pode fazer isso através de GOOGLE_APPLICATION_CREDENTIAL.

# must set TRIVY_USERNAME empty char
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/credential.json

Registro auto-hospedado (Autenticação Básica)

O servidor BasicAuth precisa TRIVY_USERNAMEde e TRIVY_PASSWORD.

export TRIVY_USERNAME={USERNAME}
export TRIVY_PASSWORD={PASSWORD}

# if you want to use 80 port, use NonSSL
export TRIVY_NON_SSL=true

Detecção de Vulnerabilidades

Pacotes do SO

As vulnerabilidades não corrigidas/incorrigíveis significam que a correção ainda não foi disponibilizada na distribuição.

SOVersões suportadasPacotes TargetDetecção de vulnerabilidades não corrigidas
Alpine Linux2,2 - 2,7, 3,0 - 3,10Instalado por apkNÃO
Imagem base universal do Red Hat7, 8Instalado por yum/rpmSIM
Red Hat Enterprise Linux6, 7, 8Instalado por yum/rpmSIM
CentOS6, 7Instalado por yum/rpmSIM
Amazon Linux1, 2Instalado por apt/apt-get/dpkgNÃO
Debian GNU/LinuxWheezy, Jessie, Stretch, BusterInstalado por apt/apt-get/dpkgSIM
Ubuntu12.04, 14.04, 16.04, 18.04, 18.10, 19.04Instalado por apt/apt-get/dpkgSIM
DistrolessQualquerInstalado por apt/apt-get/dpkgSIM

As informações de pacotes do RHEL, CentOS e Amazon Linux são armazenadas em formato binário, e o Trivy usa o rpmexecutável para analisar essas informações ao verificar uma imagem baseada em RHEL ou CentOS. A imagem do contêiner Trivy inclui o executável rpm, e os instaladores o incluem como uma dependência. Se você instalou o trivybinário usando o instalador wgetou curlo instalador de instalação, ou se você o compilou a partir do código-fonte, também precisará garantir que o executável rpmesteja disponível.

Distroless: https://github.com/GoogleContainerTools/distroless

Dependências do aplicativo

TrivyDetecta automaticamente os seguintes arquivos no contêiner e verifica vulnerabilidades nas dependências do aplicativo.

  • Gemfile.lock
  • Pipfile.lock
  • poesia.lock
  • composer.lock
  • arquivo package-lock.json
  • fio.lock
  • Carga.lock

O caminho desses arquivos não importa.

Exemplo: https://github.com/aquasecurity/trivy-ci-test/blob/master/Dockerfile

Formato de imagem Tar

Trivy escaneia uma imagem de alcatrão com o seguinte formato.

  • Especificação da imagem Docker (https://github.com/moby/moby/tree/master/image/spec)
    • Projeto Moby (https://github.com/moby/moby/)
    • Buildah, Podman (https://github.com/containers/buildah)
    • img (https://github.com/genuinetools/img)
  • Kaniko
    • Kaniko (https://github.com/GoogleContainerTools/kaniko)

Fonte de dados

  • PHP
    • https://github.com/FriendsOfPHP/security-advisories
  • Python
    • https://github.com/pyupio/safety-db
  • Rubi
    • https://github.com/rubysec/ruby-advisory-db
  • Node.js
    • https://github.com/nodejs/security-wg
  • Ferrugem
    • https://github.com/RustSec/advisory-db

Uso

NAME:
  trivy - A simple and comprehensive vulnerability scanner for containers
USAGE:
  trivy [options] image_name
VERSION:
  0.1.6
OPTIONS:
  --format value, -f value    format (table, json) (default: "table")
  --input value, -i value     input file path instead of image name
  --severity value, -s value  severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL")
  --output value, -o value    output file name
  --exit-code value           Exit code when vulnerabilities were found (default: 0)
  --skip-update               skip db update
  --only-update value         update db only specified distribution (comma separated)
  --reset                     remove all caches and database
  --clear-cache, -c           clear image caches
  --quiet, -q                 suppress progress bar and log output
  --no-progress               suppress progress bar
  --ignore-unfixed            display only fixed vulnerabilities
  --refresh                   refresh DB (usually used after version update of trivy)
  --auto-refresh              refresh DB automatically when updating version of trivy
  --debug, -d                 debug mode
  --vuln-type value           comma-separated list of vulnerability types (os,library) (default: "os,library")
  --cache-dir value           cache directory (default: "/path/to/cache")
  --help, -h                  show help
  --version, -v               print the version

Comparação com outros scanners

Visão geral

Scanner
Pacotes do SO

Dependências do aplicativo
Fácil de usarPrecisãoAdequado
para CI
Curiosidades
Clara×
Motor Anchore
Cais××
Microscanner×
Docker Hub×××
GCR××

vs Clair

O Clair utiliza o alpine-secdb . No entanto, o objetivo deste banco de dados é possibilitar a identificação de quais pacotes possuem correções retroportadas. Como indicado no arquivo README, não se trata de um banco de dados completo de todos os problemas de segurança do Alpine.

TrivyColeta informações sobre vulnerabilidades no Alpine Linux a partir do repositório aports do Alpine Linux . Em seguida, essas vulnerabilidades serão salvas na lista vuln-list .

alpine-secdbPossui 6959 vulnerabilidades (em 12/05/2019). vuln-listPossui 11101 vulnerabilidades relacionadas ao Alpine Linux (em 12/05/2019). Há uma diferença na precisão da detecção porque o número de vulnerabilidades quase dobrou.

Além disso, Trivyanalisa também as camadas intermediárias para descobrir qual versão da biblioteca foi usada para a vinculação estática.

ClairNão consegue lidar com os seguintes casos porque analisa a imagem após aplicar todas as camadas.

RUN apk add --no-cache sqlite-dev \
 && wget https://xxx/yyy.tar.gz \
 && tar zxvf yyy.tar.gz && cd yyy \
 && make && make install \
 && apk del sqlite-dev

E como muitos sabem, é difícil selecionar um Claircliente porque muitos clientes estão obsoletos.

Por fim, Trivytambém pode detectar vulnerabilidades em bibliotecas dependentes de aplicativos, como Bundler, Composer, Pipenv, etc.

vs Motor Anchore

Assim como no Clair, há uma diferença na precisão da detecção no Alpine Linux. Além disso, como mencionado anteriormente, o Clair Anchore Enginenão detecta vulnerabilidades irreparáveis ​​no RHEL/CentOS, enquanto Trivyo Clair detecta.

Além disso, Anchore Enginesão necessários alguns passos para iniciar a digitalização. TrivyÉ muito mais fácil de usar.

vs Quay, Docker Hub, GCR

Pelo que Quayparece usar Clairinternamente, tem a mesma precisão que o ClairDocker HubSó consegue analisar imagens oficiais. GCRQuase não detecta vulnerabilidades no Alpine Linux. Além disso, está vinculado a um registro específico.

TrivyPode ser utilizado independentemente do registro e é facilmente integrado aos serviços de CI/CD.

Migração

Em 19 de agosto de 2019, os repositórios do Trivy foram migrados de knqyf263/trivypara aquasecurity/trivy. Se você instalou o Trivy anteriormente, deve atualizar quaisquer scripts ou registros do gerenciador de pacotes conforme descrito nesta seção.

Visão geral

Se você tiver um script que instala o Trivy (por exemplo, em seus pipelines de CI), você deve atualizá-lo para obtê-lo do novo local, substituindo knqyf263/trivy por aquasecurity/trivy.

Por exemplo:

# Before
$ wget https://github.com/knqyf263/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz

# After
$ wget https://github.com/aquasecurity/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz

Debian/Ubuntu

$ apt-get remove --purge trivy
$ sed -i s/knqyf263/aquasecurity/g /etc/apt/sources.list.d/trivy.list
$ apt-get update
$ apt-get install trivy

Nenhum comentário:

Postar um comentário