コンテナイメージの脆弱性スキャンについて
Docker Meetup Kansai #4 (19.08)
やっさん
@yassan168
前回は Portus について話しました
CVE
データベース
脆弱性情報を同期
Portus
(Web UI)
Nginx
(Proxy)
PostgreSQL
Portus
(Background)
Web UI
Registry
Service
User/Team/Namespace
/Image一覧/etcの更新
Image一覧の同期
脆弱性スキャン
脆弱性
情報の取得
今回は 脆弱性のスキャンについて
CVE
データベース
脆弱性情報を同期
Portus
(Web UI)
Nginx
(Proxy)
PostgreSQL
Portus
(Background)
Web UI
Registry
Service
User/Team/Namespace
/Image一覧/etcの更新
Image一覧の同期
脆弱性スキャン
脆弱性
情報の取得 この辺の話
コンテナイメージの脆弱性スキャン
コンテナイメージの脆弱性スキャンツールといえば、、
• Docker Bench for Security
• Docker社公式のベストプラクティスのチェックツール
• クラウドのコンテナレジストリでのセキュリティスキャン
• Docker Trusted Registry(DTR)、Quay、GCR
• Clair
• Anchore Engine
• Microscanner
個人的な脆弱性スキャンのイメージ
1. 導入がめんどくさい
a. RDB用意して、LB用意して、、、
b. 簡単なやつはお高い。そして、だいたいクラウド。
2. 実行に時間がかかる
だるいょ
そこで現れた救世主
https://github.com/aquasecurity/trivy
golang製のCLIツール。
READMEが充実していてとてもありがたい。
使うがよい〜
Trivy
もともとは、日本人が個人的に開発していたものが、
Aquaの人に買われて現在は、 AquaのOSS(AGPLv3)になっています。
趣味で作ったソフトウェアが海外企業に買われるまでの話 - knqyf263's blog
特徴
1. 幅広い脆弱性の検知
• OSパッケージだけでなく、アプリケーションの依存ライブラリにも対応
• Red Hat Universal Base Imageにも対応
2. 簡単
• イメージ名指定だけでOK
3. 導入が容易
• DBなどの準備が一切不要
• OSのパッケージャ または バイナリの配置 だけですぐに利用可能
4. 精度が高い
• 特に AlpineとRHEL/CentOSの検知精度が高い (参考: ここ)
5. DevSecOps
• 簡単に使えるのでCI/CDに組み込みやすい
導入方法
RHEL/CentOS、Debian/Ubuntu、Arch、Homebrewは、パッケージイン
ストールが可能。
golang製なので、GitHubからバイナリを取得してつかうのもあり。
# Ubuntu 18の場合
$ sudo apt-get install apt-transport-https gnupg
$ wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo
apt-key add -
$ echo deb https://aquasecurity.github.io/trivy-repo/deb bionic main | sudo tee
-a /etc/apt/sources.list.d/trivy.list
$ sudo apt-get update
$ sudo apt-get install trivy
他のScannerとの比較
※https://github.com/aquasecurity/trivy#overview
Scanner
OS
Packages
Application
Dependencies
Easy to use Accuracy
Suitable
for CI
Trivy ◯ ◯ ◯ ◎ ◯
Clair ◯ × △ ◯ △
Anchore Engine ◯ △ △ ◯ △
Quay ◯ × ◯ ◯ ×
MicroScanner ◯ × ◯ ◯ ◯
Docker Hub ◯ × ◯ × ×
GCR ◯ × ◯ ◯ ×
チェック対象
スキャンする対象は大きく2つ。
1. OSパッケージ
• Dockerfileに記載したパッケージ(apt、yumとか)
2. アプリケーションの依存ライブラリ
• Gemfile.lock などのファイル名が存在すればそれをチェック
※現状はファイル名は固定
対応するOSパッケージ
以下に対応。ただし、make installしたようなものは未対応。
OS バージョン パッケージ
未修正の脆弱
性検知
Alpine Linux 2.2 - 2.7, 3.0 - 3.10 apk NO
Red Hat Universal
Base Image
7, 8 yum/rpm YES
Red Hat Enterprise
Linux
6, 7, 8 yum/rpm YES
CentOS 6, 7 yum/rpm YES
Debian GNU/Linux
wheezy, jessie, stretch,
buster
apt/apt-get/dpkg YES
Ubuntu
12.04, 14.04, 16.04, 18.04,
18.10, 19.04
apt/apt-get/dpkg YES
OSパッケージの脆弱性情報はどこから?
From where does trivy fetch CVE info? · Issue #105 · aquasecurity/trivy
で回答している通り、自前のライブラリvuln-list-update を使ったりして取得。
毎日更新しているとの事。
Source URL
Alpine Linux Bug tracker https://bugs.alpinelinux.org/projects/alpine/issues
Security Bug Tracker https://security-tracker.debian.org/tracker/
National Vulnerability Database https://nvd.nist.gov/
OVAL https://www.debian.org/security/oval/
Security Data https://www.redhat.com/security/data/metrics/
Ubuntu CVE Tracker https://people.canonical.com/~ubuntu-security/cve/
対応するアプリケーションの依存ライブラリ
決め打ちで以下のファイル名で検索してチェック
• Gemfile.lock
• Pipfile.lock
• poetry.lock
データソースは、以下の通り。どうやってるかは ここ 参照。
PHP:FriendsOfPHP/security-advisories
Python:pyupio/safety-db
Ruby:rubysec/ruby-advisory-db
Node.js:nodejs/security-wg
Rust:RustSec/advisory-db
• package-lock.json
• yarn.lock
• Cargo.lock
どうやって使うか?
とっても簡単。
$ trivy [イメージ名]
例: $ trivy yassan/test-trivy:0.1
ただし、初回実行時は脆弱性情報の取得に時間がかかります。
2回目以降は差分となるので速くなります(スキップして別途取得も可能)
cf. コマンドの利用例:https://github.com/aquasecurity/trivy#examples
コマンドの詳細
USAGE:
trivy [options] image_name
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 重大度の指定 (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL")
--output value, -o value output file name
--exit-code value 見つけたときのExit code指定 (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
--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 チェックするタイプ (default: "os,library")
--cache-dir value cache directory (default: "/home/yassan/.cache/trivy")
--help, -h show help
--version, -v print the version
デモします
https://github.com/aquasecurity/trivy#continuous-integration-ci
CIにどうやって組み込むん?
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 --quiet --auto-refresh
trivy-ci-test:${CIRCLE_SHA1}
- save_cache:
key: vulnerability-db
paths:
- $HOME/.cache/trivy
 ;
(略)
(再掲)特徴
1. 幅広い脆弱性の検知
• OSパッケージだけでなく、アプリケーションの依存ライブラリにも対応
• Red Hat Universal Base Imageにも対応
2. 簡単
• イメージ名指定だけでOK
3. 導入が容易
• DBなどの準備が一切不要
• OSのパッケージャ または バイナリの配置 だけですぐに利用可能
4. 精度が高い
• 特に AlpineとRHEL/CentOSの検知精度が高い (参考: ここ)
5. DevSecOps
• 簡単に使えるのでCI/CDに組み込みやすい
後は試すだけ!
おまけ
補足
• aquasecurity/trivy: A Simple and Comprehensive Vulnerability Scanner for
Containers, Suitable for CI
• aquasecurity/vuln-list-update
• 趣味で作ったソフトウェアが海外企業に買われるまでの話 - knqyf263's blog
• CIで使えるコンテナの脆弱性スキャナ - Qiita
• ダ鳥獣戯画 – 鳥獣戯画ベクター素材化サイト

コンテナイメージの脆弱性スキャンについて