APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【GitHub Actions】GitHub Advanced SecurityでDockleのイメージスキャン結果を表示してみよう!!

はじめに

こんにちは、ACS事業部の小原です。
せっかくCI/CDパイプラインにコンテナイメージスキャンを組み込んだのに、
いちいちワークフローの実行結果からスキャン結果を確認するのって大変ですよね?
そんなときはGitHub Advanced SecurityGitHub Actionsを組み合わせて、スキャン結果を見やすく可視化しちゃいましょう!

前提条件

この機能を使うにはいくつか前提条件があるので以下の通りまとめてみました。

  • パブリックリポジトリの場合
    • 追加ライセンス不要
    • デフォルトで使用可能
  • プライベートリポジトリの場合
    • GitHub Enterprise Cloud または GitHub Enterprise Server
    • GitHub Advanced Securityライセンス
    • リポジトリでGitHub Advanced Securityが有効化されていること

準備

今回使用するDockerfileです。
あえてスキャンに引っ掛かりそうなものを用意しました。

FROM python:3.9

WORKDIR /app

COPY requirements.txt .

RUN pip install -r requirements.txt

COPY app/ .

ARG APP_PASSWORD=password123

EXPOSE 8080

CMD ["python", "main.py"]

GitHub Actionsの実装

ワークフロー設定

シンプルに書くとこんな感じです。
肝心のDockleアクションはこちらを使用しています。

github.com

name: Container Security Scan

on:
 workflow_dispatch

# 必要な権限の設定
permissions:
 contents: read          # リポジトリ内容の読み取り権限
 security-events: write  # セキュリティスキャン結果のアップロード権限

jobs:
 build-and-scan: 
   runs-on: ubuntu-latest  
   steps:
     - name: Checkout
       uses: actions/checkout@v4

     - name: Set up Docker Buildx
       uses: docker/setup-buildx-action@v3

     - name: Build Docker image
       uses: docker/build-push-action@v6
       with:
         context: . 
         file: ./Dockerfile
         tags: ${{ github.sha }}
         push: false
         load: true

     # Dockleによるセキュリティスキャン
     - name: Scan the Docker image with Dockle
       uses: erzz/dockle-action@main
       with:
         image: ${{ github.sha }}
         report-format: "sarif"     # GitHub Advanced Securityで読み込めるSARIF形式で出力
         failure-threshold: "FATAL"
         exit-code: 0

     # スキャン結果のアップロード
     - name: Upload SARIF file
       uses: github/codeql-action/upload-sarif@v3
       with:
         sarif_file: dockle-report.sarif  # アップロードするSARIFファイルの指定

重要なのは以下3つのポイントです。
①permissionの設定、②SARIFファイルの出力フォーマット、③アップロードするファイルの指定

permissionの設定

スキャン対象のコンテンツ(Dockerfile)をRunnerが読み込むためにcontents: read,
そしてSecurityタブにスキャン結果を書き込む(表示させる)ためにsecurity-events: writeが必須になります。

②SARIFファイルの出力フォーマット

今回使用するのはサードパーティーのcode scanningツールにあたるため、
そのままスキャンを実行してもSecurityタブに結果を表示することはできません。

よってreport-formatを以下のように指定し、Securityタブに表示させるためのフォーマットで出力させます。
イメージの指定は必須なのでお忘れなく。

     - name: Scan the Docker image with Dockle
       uses: erzz/dockle-action@main
       with:
         image: ${{ github.sha }}
         report-format: "sarif"    

そして、このアクションで作成される一時ファイルはデフォルトでdockle-report.sarifというファイル名になります。
アップロードのアクションで必要になるので覚えておきましょう。
(jsonで出力した場合は.jsonになります)

諸々のオプションはこちらでご覧いただけます。

github.com

③アップロードするファイルの指定

Securityタブにスキャン結果を表示するためにSARIFファイルをGitHubにアップロードする必要があります。
GitHub Docsを参考にしつつ、github/codeql-action/upload-sarifというアクションを使用しましょう。

docs.github.com

     - name: Upload SARIF file
       uses: github/codeql-action/upload-sarif@v3
       with:
         sarif_file: dockle-report.sarif

②で作成された一時ファイルを指定してあげます。
ここまでワークフローが正常に動けばスキャン結果がSecurityタブから確認出来ちゃいます。

使用したアクションの定義はこちら。

github.com

スキャン結果の確認

ワークフローが正常に終了したので結果を確認してみましょう。
対象のリポジトリのSecurityタブを押下し、Code Scanningを選択します。

もちろんワークフローの実行結果からも確認できますが、
実際には様々なスキャンが必要になるOrganization、リポジトリを考えるとどちらがいいかは明白ですね。

※すごく便利ですが、セキュリティの概要からエクスポートできるCSVファイルには、
サードパーティーツールのレポートは含まれないので注意してください。

注: 概要ビュー ([概要]、[カバレッジ] および [リスク]) には、デフォルトのアラートのデータのみが表示されます。 サードパーティ製ツールからの Code scanning アラートと、プロバイダー以外のパターンまたは無視されたディレクトリに対する secret scanning アラートはすべて、これらのビューから省略されます。 その結果、概要ビューからエクスポートされたファイルには、これらの種類のアラートのデータは含まれません。   docs.github.com

終わりに

けっこう簡単に出来ちゃうのがお判りいただけたかと思います。
Dockleだけでなく、CheckovやTrivyなど他のツールでも可能なのでお試しあれ!


私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: 小原陽希