はじめに
こんにちは、ACS事業部の小原です。
せっかくCI/CDパイプラインにコンテナイメージスキャンを組み込んだのに、
いちいちワークフローの実行結果からスキャン結果を確認するのって大変ですよね?
そんなときはGitHub Advanced SecurityとGitHub 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アクションはこちらを使用しています。
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
になります)
諸々のオプションはこちらでご覧いただけます。
③アップロードするファイルの指定
Securityタブにスキャン結果を表示するためにSARIFファイルをGitHubにアップロードする必要があります。
GitHub Docsを参考にしつつ、github/codeql-action/upload-sarif
というアクションを使用しましょう。
- name: Upload SARIF file uses: github/codeql-action/upload-sarif@v3 with: sarif_file: dockle-report.sarif
②で作成された一時ファイルを指定してあげます。
ここまでワークフローが正常に動けばスキャン結果がSecurityタブから確認出来ちゃいます。
使用したアクションの定義はこちら。
スキャン結果の確認
ワークフローが正常に終了したので結果を確認してみましょう。
対象のリポジトリのSecurityタブを押下し、Code Scanningを選択します。
もちろんワークフローの実行結果からも確認できますが、
実際には様々なスキャンが必要になるOrganization、リポジトリを考えるとどちらがいいかは明白ですね。
※すごく便利ですが、セキュリティの概要からエクスポートできるCSVファイルには、
サードパーティーツールのレポートは含まれないので注意してください。
注: 概要ビュー ([概要]、[カバレッジ] および [リスク]) には、デフォルトのアラートのデータのみが表示されます。 サードパーティ製ツールからの Code scanning アラートと、プロバイダー以外のパターンまたは無視されたディレクトリに対する secret scanning アラートはすべて、これらのビューから省略されます。 その結果、概要ビューからエクスポートされたファイルには、これらの種類のアラートのデータは含まれません。 docs.github.com
終わりに
けっこう簡単に出来ちゃうのがお判りいただけたかと思います。
Dockleだけでなく、CheckovやTrivyなど他のツールでも可能なのでお試しあれ!
私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。