GitHub ActionsでTrivyのスキャンを実行する

GitHub ActionsでTrivyのスキャンを実行する

ども!今回はTrivyをGitHub Actionsで使用する方法についてまとめました。ローカルでDockerを用いて構築する方法がわからなかったのですが、Dockerを読む力が上がって構築できるようになりました。セキュリティスキャン記事第二弾!GitHub Actionsでセキュリティ

はじめもす

どもども!一気に寒くなってお家から出かけるのが億劫になってる龍ちゃんです。そんなこと言いつつ昨日は手羽餃子が食べたくなって、食べに出かけました。毎日、GitHub Actionsを触っているのでいい加減抵抗感が減ってきましたね。

さて、前回はGitHub Actions上でOWASP ZAPのスキャンを実行しました。今回はDockerのイメージをスキャンしたいということで、Trivyについてスキャンを実施してみたのでまとめておきます。

この記事でわかることは以下になります。

  • ローカルPCでTrivyのスキャンを実行する
  • GitHub Actions上でTrivyのスキャンを実行する

それでは、本題に入ってきましょう。この記事は2024/01/18日時点の情報です!。

そもそもTrivyって何?

ざっくりと公式ホームページの情報をまとめました。

もともとOSSだけど、今は会社がメンテしているや~つ

対応しているスキャン対象
コンテナイメージ・ファイルシステムスキャン・IaC

検出できるもの
脆弱性・IaCの設定・シークレット検知・ライセンス

スキャン結果
テーブル/JSON/SARIF/SBOM etc...

今回は、脆弱性検知とシークレット検知の二点を利用するために調査してみました。IaCの設定ミスなども検知することができます。意外と検証用にシークレットをべた書きしていたりするので、検知してアラートが出るというのはうれしいですね。

ファイルシステムとコンテナイメージのスキャンどちらにも対応しているので、要件によって導入がしやすいというのもうれしいところです。

最近いろいろと話題になっている、SBOMに対応しているのもうれしいところですね。

Trivyスキャンしていく!

まず最初にローカルでTrivyをセットアップしてスキャンしてみます。その後、GitHub Actionsでスキャンをしていきます。

ローカルでTrivyをスキャンしてみる

それでは、Trivyをセットアップしていきます。前提としてはWSL上にDockerが構築されている必要があります。公式のページを置いておきます。

まずはイメージを引いてきましょう。

docker pull aquasec/trivy:0.48.3

公式の方法に則り、お試しでpythonのイメージをスキャンするコマンドを以下に置いておきます。特にカスタマイズはしていませんが、—rmのフラグを付けてスキャン後にコンテナを破棄しておきます。

docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ --rm aquasec/trivy:0.48.3 image python:3.4-alpine

上記のコマンドだと、どこが変数かわかりにくい可能性があるかと思うのでサンプルとして以下に出しておきます。${特定のイメージ名をスキャンする}の部分をイメージ名に変更することでスキャンを行えます。

docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy:0.48.3 image ${特定のイメージ名をスキャンする}

脆弱性検知とシークレット検知はデフォルトで設定されています。ライセンス検知と設定ミスを検知するためには、追加のフラグを与える必要があります。以下にサンプルを置いておきます。

docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ --rm aquasec/trivy:0.48.3 image --scanners license,secret,vuln,misconfig  ${特定のイメージ}

以上で、コンテナイメージスキャン周りの説明は以上になります。

ファイルスキャンの場合は、imagefsにして、イメージ名の部分をファイルパスに置き換えることで処理が走ります。カレントディレクトリをスキャンするサンプルを以下に置いておきます。

docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ --rm aquasec/trivy:0.48.3 fs .

GitHub Actionsでスキャンをしていく!

やっとで本題まで来ました。スキャンをするためには、スキャンするアプリケーションが必要になります。せっかくなので、脆弱性のあるアプリケーションを使用してスキャンを実施したいと思います。肝心のアプリはOWASP Juice shopを使用したいと思います。こちらは、ふんだんに脆弱性が仕込まれています。もちろんDockerで起動することができます。

Trivyのスキャンは、GitHub Actionsに手軽にインストールすることができます。こちらが、GitHubのページになります。

#
name: Trivy Scan to OWASP Juice shop

on:
  push:
    branches: ["main"]

jobs:
  build-and-push-image:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Pull Docker
        run: docker pull bkimminich/juice-shop

      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: "bkimminich/juice-shop"
          scan-type: "image"
          format: "table"
          exit-code: "0" # 0だと脆弱性検知しても通る 1だと検知後落ちる
          ignore-unfixed: true
          vuln-type: "os,library"
          severity: "CRITICAL,HIGH"
          scanners: "license, secret vule misconfig"

exit-codeがローカル版と異なる部分になります。01で、脆弱性検知後に処理が落ちるようになっています。スキャン結果は、CI上で表示されます。

面白い話ですが、公式のREADMEにはscannersに設定できる項目にはlicenseの記載がありません。ですが、設定したら動きました。なので、CI上でもライセンスチェックが行えますね。

おわりもす

ひとまず、スキャンができることは確認することができました。最初は、Docker上での構築ができませんでした。WSL上にセットアップしたのが良い思い出です。本来ならば、スキャン結果をartifactに保存して、Issueに自動で登録などもあると思います。その辺は、実運用に回るときにセットしていきましょう。

GitHub Actionsでスキャンが連続で失敗してもめげない心を手に入れました。これからも程よく頑張っていきます( *´艸`)

以降がDocker周りの記事になります。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です