情報
- github.com/aquasecurity/trivy
- knqyf263's blog 趣味で作ったソフトウェアが海外企業に買われるまでの話が有名
- 対象の OS
- 対象の依存ライブラリ管理ツール
準備
基本的な使い方は README を読めばすべて解決する理想的なツールです。
いろいろあるけど、インストールスクリプトを使う方法が一番楽だと思います。
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s -- -b /usr/local/bin command -v trivy /usr/local/bin/trivy
Go 処理系が入っているなら go get でもいける。
go get -u github.com/aquasecurity/trivy/cmd/trivy command -v trivy /home/y.okazawa/.go/bin/trivy
今のところ Windows の Git Bash ではちゃんと動かないみたいなので、WSL で操作するといいでしょう。
使用例
コンテナイメージをスキャンする
コンテナイメージのファイルシステムをスキャンするだけで特別な違いはなさそうです。
実行中のコンテナをスキャンしたいときは docker save で保存した tar ファイルを指定する。
trivy image name:tag trivy image --input image.tar
ファイルシステムをスキャンする
Docker コンテナをビルドするときはこちらの使い方をするといいみたい。
trivy fs path/to/source
共通するオプション
- 発見したい脆弱性の種類を指定する
--vuln-typeosあるいはlibraryをカンマ区切りで並べる- 初期値は
os,library
- 脆弱性の有無に関わらずスキャンしたパッケージを表示する
--list-all-pkgs- 前回の結果と比較すればパッケージの増減を検出できるな
- 出力する深刻度(severity)を指定する
--severity- 初期値は
UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL
スキャンした結果の出力形式
JSON 形式。jq とかで必要な情報を抽出する感じになりそう。
trivy image --format json name:tag
テンプレートで Go template 直書き。いい感じにログ出力するとかそういう用途にいいのかな。
trivy image --format template --template '{{ range . }} {{ .Target }} {{ end }}' name:tag
テンプレートで Go template で記述した外部ファイルを指定。これは JUnit XML 形式の場合。
Jenkins や Bamboo などの CI サーバーなら JUnit XML 形式をいい感じに処理できるのでお勧め ユニットテストや結合テストの結果と同じように扱える
curl -fsSL --remote-name https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/junit.tpl trivy image --format template --template '@junit.tpl' name:tag
CI サービスでの使い方
Docker Registry へのアクセス
trivy からそれぞれのサービスにアクセスするための認証情報は次のように制御できるそうです。
Docker Hub の場合は環境変数。
export TRIVY_AUTH_URL=https://registry.hub.docker.com
export TRIVY_USERNAME={DOCKERHUB_USERNAME}
export TRIVY_PASSWORD={DOCKERHUB_PASSWORD}
Amazon ECR の場合は AWS CLI の認証情報。
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY export AWS_DEFAULT_REGION=us-west-2 ## あるいは export AWS_PROFILE=profile
GCR の場合は gcloud の認証情報。
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/credential.json