虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

コンテナイメージの脆弱性診断ツールTrivyを試してみた

こんにちは、虎の穴ラボの山田です。
本記事は虎の穴ラボ Advent Calendar 2020 - Qiita 10日目の記事になります。

9日目はS.SさんがサーバレスなWEBアプリを作ってみると言う記事を書かれています。

toranoana-lab.hatenablog.com

11日目はH.KさんがChrome拡張の公開方法などについて書かれる予定です。

本記事は表題の通り、コンテナイメージの脆弱性診断ツールであるTrivyを試しに使ってみた、と言うブログ記事になります。

github.com

最近、CI/CD関連のツールを色々検索したりしていた際に見つけたツールです。
コンテナイメージの脆弱性診断ツールには他にも、ClairAnchoreEngineなどがありますが、Trivyも、そういった脆弱性診断ツールのうちの一つです。

アジェンダ

  1. 特徴
  2. 診断内容
  3. 導入
  4. ローカル環境での実行
  5. CIツールでの実行
  6. まとめ

特徴

Trivyには以下のような特徴があります。

  • オープンソースで開発されている
    元々は日本の方が個人で開発を始められたようですが、2019年にAqua Security社に買収され、その後もOSSで開発が続けられています。
    また、買収を持ちかけられた際に開発されていた方も雇用を求められ、Aqua Security社に合流したようです。

    趣味で作ったソフトウェアが海外企業に買われるまでの話 - knqyf263's blog

  • 導入と操作が簡単
    前提となるデータベースやライブラリが無いので、ローカルにインストールしてすぐに実行できます。
    また、操作も非常にシンプルになっています。

  • アプリケーションの依存ライブラリもスキャン対象
    TrivyはコンテナのOSパッケージだけでなく、アプリケーションの依存ライブラリもスキャン対象としています。

  • Distrolessコンテナイメージもサポート
    Googleが公開しているDistrolessコンテナイメージもサポートしています。
    個人的には今後使ってみたいコンテナイメージなので、この辺りも注目しています。

  • 多くのCIツールに実装されている
    多くのCIツールに実装されていて、READMEにはCIツールのワークフローのサンプルが記載されています。

  • 脆弱性の検知率が高い
    特に、Alpine LinuxとRHEL/CentOSについては検知率が高いとされています。

  • READMEの内容が充実している
    実際にご覧になってもらうとわかると思うのですが、実行例、実装例など非常に充実したREADMEになっています。

診断内容

OSパッケージ

2020/12/09現在は、以下のようなOSパッケージをサポートしています。 これ以外にサポートしているOSパッケージについてはこちらをご覧下さい。

OS サポートしているバージョン 未修正の脆弱性の検出
Alpine Linux 2.2 - 2.7, 3.0 - 3.12 NO
Red Hat Enterprise Linux 6, 7, 8 YES
CentOS 6, 7 YES
Amazon Linux 1, 2 NO
Debian GNU/Linux wheezy, jessie, stretch, buster YES
Ubuntu 12.04, 14.04, 16.04, 18.04, 18.10, 19.04 YES
Distroless Any YES

アプリケーションの依存ライブラリ

Trivyはコンテナ内の以下のファイルを自動的に検出し、アプリケーションの依存ライブラリがもつ脆弱性もスキャンします。

  • Ruby
    • Gemfile.lock
  • Python
    • Pipfile.lock
    • poetry.lock
  • PHP
    • composer.lock
  • Node.js
    • package-lock.json
    • yarn.lock
  • Rust
    • Cargo.lock

導入

導入も非常に簡単で、CentOSやUbuntuであればリポジトリを指定し、通常のapt/yumコマンドでインストールができます。
macOSであればhomebrewでインストールができるので、今回はローカルのmacOSで試していきます。
他の環境へのインストール方法については、こちらを参照して下さい。

まずはローカルのmacOSに、以下のbrewコマンドでインストールを行います。

% brew install aquasecurity/trivy/trivy

インストール後は--helpを指定して実行し、オプションなどを確認しておきましょう。

% trivy --help
NAME:
   trivy - A simple and comprehensive vulnerability scanner for containers

USAGE:
   trivy [global options] command [command options] target

VERSION:
   0.14.0

COMMANDS:
   image, i          scan an image
   filesystem, fs    scan local filesystem
   repository, repo  scan remote repository
   client, c         client mode
   server, s         server mode
   help, h           Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --quiet, -q        suppress progress bar and log output (default: false) [$TRIVY_QUIET]
   --debug, -d        debug mode (default: false) [$TRIVY_DEBUG]
   --cache-dir value  cache directory (default: "/Users/user1/Library/Caches/trivy") [$TRIVY_CACHE_DIR]
   --help, -h         show help (default: false)
   --version, -v      print the version (default: false)

ローカル環境での実行

イメージの指定

インストール後の実行も簡単です。基本的には、コンテナイメージを指定するだけで脆弱性の診断ができます。

% trivy image [IMAGE_NAME]

ローカル環境にインストールしたTrivyを使用する場合は、ローカル環境のコンテナイメージ、またはDocker Hubのコンテナイメージを診断します。

% docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycustomed_image    latest              aabcb21daa8e        27 minutes ago      138MB

% trivy image mycustomed_image:latest   <- タグにlatestを指定しているので警告が出ます。

% trivy image rails:5.0.1   <- ローカルにない場合、Docker Hub上のイメージを診断します。

コンテナのイメージ名を指定する際、タグに最新版を示す latest を指定すると(デフォルトでlatestは指定される為、タグを指定しない場合にも)、latestを指定しないように警告が出ます。 診断の際にコンテナイメージがキャッシュされる為、診断に支障をきたす場合があるようです。指定する場合は都度 trivy image --clear-cacheを実行し、キャッシュをクリアしてから実行するようにしてください。

dockerコマンドを使用し、Docker Hub上のTrivyのDockerコンテナを使用して診断することもできます。この場合はTrivyのインストールも必要ありません。
ローカルにあるイメージを診断する場合は、以下のように実行します。

% docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy [IMAGE_NAME]

Docker Hub上のイメージを診断する場合は、以下のように実行します。

% docker run --rm -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy [IMAGE_NAME]

dockerコマンドを使用しての診断後は、TrivyのDockerイメージが残っているのが確認できます。

% docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycustomed_image    latest              aabcb21daa8e        27 minutes ago      138MB
aquasec/trivy       latest              09f84b619d1c        6 days ago          48.4MB

ローカルのコンテナイメージ、Docker Hub上のコンテナイメージの他にも、コンテナのイメージファイル、Gitリポジトリ、指定されたファイルシステムなども診断対象とできます。

診断結果の出力

場合によっては大量に画面に表示される診断結果ですが、Trivyでは出力内容、出力方法などを指定することができます。

  • 脆弱性のレベルでフィルタリング
    --severityオプションを使用し、診断結果をあるレベル以上のものに絞り込むことができます。
% trivy image --severity HIGH,CRITICAL rails:5.0.1
  • 診断結果をファイル出力
    -o オプションを指定することで診断結果をファイルに出力できます。
% trivy image -o results.out rails:5.0.1
  • 診断結果の形式を指定
    -f オプションを指定して、デフォルトのtable形式からjson形式に変更したり、指定したテンプレート形式で出力することもできます。
% trivy image -f json -o results.json rails:5.0.1

CIツールでの実行

Circle CI、Travis CIといった各種CIツールでの実装方法についてもワークフローのサンプルが記載されています。 (このブログを記述している2020年12月時点では、GitHub Actionsのアクションについてはcurrently Experimentalと注意書きがされているため、実験段階の模様です。)

まとめ

できる事、やる事がすごくよくまとまったツールだと思います。ヘルプを見るとオプション自体は少なくシンプルなのですが、診断対象の形式が豊富だったり、診断結果の出力を変更できたりと、痒いところに手が届いている感じです。
導入も簡単で、とりあえず試してみる、とりあえずCIツールに設定してみるといった時の壁が非常に低いのも好感です。
どこか実装できる環境があれば、実装していこうかなと思っています。

P.S.

カジュアル面談
弊社エンジニアと1on1で話せます、カジュアル面談も現在受付中です!こちらも是非ご検討ください。 yumenosora.connpass.com

その他採用情報
虎の穴ラボでの開発に少しでも興味を持っていただけた方は、採用説明会やカジュアル面談という場でもっと深くお話しすることもできます。ぜひお気軽に申し込みいただければ幸いです。
カジュアル面談では虎の穴ラボのエンジニアが、開発プロセスの内容であったり、「今期何見ました?」といったオタクトークから業務の話まで何でもお応えします。 カジュアル面談や採用情報はこちらをご確認ください。 yumenosora.co.jp