Dockerイメージスキャン用GitHub Actionの設定
2023年5月19日
0 分で読めます現在、多くのGitリポジトリでは、最終成果物としてDockerイメージを作成し、それをKubernetesのデプロイに使用します。セキュリティが大きな注目を集めている今(それには十分な理由があります)、CIで作成するDockerイメージをスキャンすることは不可欠です。
この記事では、GitHub Actionsを使ってDockerイメージをビルドし、セキュリティ上の脆弱性をスキャンする方法を紹介します。CIでビルドしたDockerイメージは、GitHubのDockerレジストリにもプッシュします。

GitHub Actionsのワークフローを作成する
これから作成するCIワークフローは、次のような構成です。
テスト
イメージをビルド
イメージをスキャン
2つ目のステップでビルドしたイメージをGitHub Dockerレジストリにプッシュし、3つ目のステージで再度そこからプルします。
テストジョブを作成する
GitHubリポジトリにCI設定がない場合、`.github/workflows/ci.yaml`に次の内容のファイルを作成します。
`on`属性では、このワークフローを実行するイベントを指定します。この例では、`master`ブランチへのプッシュと、すべてのプルリクエストによってCIワークフローが実行されます。
ジョブのステップは次のとおりです。
Checkout 🔔: リポジトリからコードを取得します
Setup Node environment 🧱: Node.js 18環境をインストールします
Install and test 🪲: 依存関係をインストールし、テストを実行します
ここでのテストジョブは、Node.jsプロジェクトの単体テストを実行する例にすぎません。プロジェクトの言語や構成に合わせて自由に変更してください。
Dockerイメージのビルドにテストジョブは必須ではありませんが、適切な方法なので、この例では含めています。
Dockerビルドジョブを作成する
Dockerビルドジョブを作成するには、まずファイルの先頭にある`on`の下に、2つの環境変数を作成します。
次に、`build_docker job`を作成しましょう。
コードを見ていきましょう。DockerイメージをGitHubのレジストリにプッシュするため、permissionsセクションが必要です。
このジョブは最新のUbuntuバージョンで実行され、テストジョブの完了を必要とします。これにより、正常に動作するコードのDockerイメージだけを作成できます。テストジョブを省略した場合は、needsの行を削除してください。
次はステップです。
Checkout 🔔: リポジトリからコードを取得します。Dockerfileとそのコンテキストを取得するために必要です。
Containerレジストリにログイン 📦
Dockerイメージをビルドしてプッシュ 🐳: このステップでは、ファイルの先頭で定義した環境変数を使って、Dockerイメージのタグを指定します。
スキャンジョブを作成する
次に、Dockerイメージのスキャンジョブを追加しましょう。
このステップでは、`docker scan`の基盤となるセキュリティスキャンエンジン、Snykを使用します。利用するには無料アカウントを作成し、そのトークンをシークレットに保存する必要があります。
それでは、各ステップを見ていきましょう。
Checkout 🛎️: Dockerfileにもアクセスできると、スキャナーの性能が向上します。
Containerレジストリにログイン 📦: 先ほどプッシュしたDockerイメージを取得するためです。
Dockerイメージをスキャン 🐳: このジョブでDockerイメージをスキャンし、脆弱性を`snyk.sarif`というファイルに出力します。このファイル形式はGitHubに認識され、PRに表示できます。そのため、次のステップを追加します。
Snykのレポートをsarif形式でアップロード 📦: 前のステップで生成した`sarif`ファイルをGitHubにアップロードします
GitHubにアップロードされた脆弱性は、次のようにPRに表示されます。

まとめ
この記事では、テストの実行、DockerイメージのビルドとGitHubレジストリへのプッシュ、セキュリティ上の問題のチェック、そして脆弱性レポートのアップロードを行う3つのジョブからなるGitHub Actionsワークフローを作成しました。これにより、GitHubが脆弱性レポートを認識し、PRに表示できるようになります。
付録: GitHubでCIシークレットを追加する
リポジトリで次の操作を行います。
Settingsタブをクリックします。
左側のメニューパネルで、SecurityセクションにあるSecrets and variablesをクリックします。
新しく表示されたメニュー項目から、Actionsをクリックします。
右上にある緑色のNew repository secretボタンをクリックします。
Name欄に、`SNYK_TOKEN`などの任意の名前を入力します。
Secret欄にシークレットを貼り付けます。たとえば、SnykのWebサイトからコピーしたSnykトークンを貼り付けます。
最後に、緑色のAdd secretボタンをクリックします。

