Trivy( tripronuncia-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
- Especifique apenas o nome da imagem.
- Consulte o Guia Rápido e os Exemplos.
- Instalação fácil
apt-get installe é possível (Vejayum 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). A 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.
| SO | Versões suportadas | Pacotes Target | Detecção de vulnerabilidades não corrigidas |
|---|---|---|---|
| Alpine Linux | 2,2 - 2,7, 3,0 - 3,10 | Instalado por apk | NÃO |
| Imagem base universal do Red Hat | 7, 8 | Instalado por yum/rpm | SIM |
| Red Hat Enterprise Linux | 6, 7, 8 | Instalado por yum/rpm | SIM |
| CentOS | 6, 7 | Instalado por yum/rpm | SIM |
| Amazon Linux | 1, 2 | Instalado por apt/apt-get/dpkg | NÃO |
| Debian GNU/Linux | Wheezy, Jessie, Stretch, Buster | Instalado por apt/apt-get/dpkg | SIM |
| Ubuntu | 12.04, 14.04, 16.04, 18.04, 18.10, 19.04 | Instalado por apt/apt-get/dpkg | SIM |
| Distroless | Qualquer | Instalado por apt/apt-get/dpkg | SIM |
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 usar | Precisão | Adequado 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 Clair. Docker 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