GitHubActions

GitHub Actionsで実装するセキュリティスキャンのベストプラクティス

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

GitHub Actions におけるセキュリティスキャンの重要性

CI/CD パイプラインに脆弱性検出を組み込むことで、コードが本番環境へ流入する前に問題点を把握できます。GitHub が提供する Security → Code scanningDependabot alertsSecret scanning といった標準機能は、プルリクエスト単位で自動的に結果を可視化し、開発フローへの介入コストを最小限に抑える設計となっています。ここでは、スキャン導入のメリットと、実務で直面する典型的な課題について概観します。

標準機能が提供する保護レイヤー

GitHub の組み込み機能は以下の3点でプロジェクトを守ります。

  1. コード解析 – CodeQL がプルリクエスト作成時に自動実行し、潜在的なバグや脆弱性を SARIF 形式で Checks に表示。
  2. 依存関係の監視 – Dependabot が pom.xmlpackage.json などを定期走査し、新たな CVE を検出したら PR を自動生成。
  3. シークレット漏洩防止 – Secret scanning がリポジトリ内にハードコーディングされた認証情報をリアルタイムで警告。

これらの機能だけでも基本的な保護は実現できますが、コンテナイメージや IaC(Infrastructure as Code)まで網羅したい場合は外部ツールとの併用が推奨されます。


スキャナツール選定基準と主要ツール比較

プロジェクトに最適なスキャナを選ぶ際は、言語対応・CI 連携の容易さ・レポート形式・コスト の4軸で評価します。

選定基準(表)

基準 評価ポイント
言語・プラットフォーム対応 対象コード、コンテナイメージ、K8s マニフェストの有無
CI 連携の容易さ GitHub Actions の公式アクションが提供されているか、設定例が充実しているか
レポート形式 SARIF が出力できれば Checks に自動表示可能。JSON/HTML は別途加工が必要
コスト・ライセンス 無料枠の上限と有償プランの価格感、商用利用時の制約

Trivy の概要

  • 対象:Docker イメージ、ファイルシステム、Kubernetes マニフェスト全般。
  • メリット:軽量・高速で脆弱性 DB が数分ごとに更新される点が実務向き。公式アクション aquasecurity/trivy-action@v0 が提供されており、format: sarif で直接 GitHub Checks に連携可能。
  • 留意点:コードレベルの静的解析は行わないため、CodeQL などと併用する必要がある。

CodeQL の概要

  • 対象言語:C/C++、Java、Python、JavaScript、Go など主要言語。
  • メリット:GitHub が公式に保守しているので github/codeql-action/*@v2 系列で安定動作。SARIF 出力が標準化されており、PR ごとに詳細な注釈を付与できる。
  • 留意点:カスタムクエリの作成や高度なチューニングには学習コストがかかる。

Dependabot・Snyk・OWASP Dependency‑Check の比較

ツール 主な機能 ライセンス 対応依存関係
Dependabot (GitHub) 脆弱性 PR 自動生成、バージョン更新提案 無料(GitHub の一部) npm, Maven, RubyGems, Docker, GitHub Actions など
Snyk 脆弱性データベースと自動パッチ適用、IaC スキャン 有償プランあり(無料枠あり) コンテナ、IaC、依存関係全般
OWASP Dependency‑Check ローカル実行型スキャナー、HTML/JSON レポート生成 オープンソース Maven, Gradle, npm, Python 等

実践的なワークフロー構築例(Trivy・CodeQL・Dependabot の組み合わせ)

以下は GitHub Actions で イメージスキャン → コード解析 → 依存関係監査 を順次実行し、すべての結果を SARIF 形式で GitHub Checks にアップロードするサンプルです。各ジョブは needs キーワードで明示的に依存関係を定義しています。

ワークフローファイル全体像

ポイント

  • バージョン固定aquasecurity/trivy-action@v0github/codeql-action/*@v2 など、安定版タグを使用して将来的な互換性リスクを回避。
  • SARIF 変換ツールaudit2sarif は npm パッケージとして公式に提供されており、バージョンを明示できるので信頼性が高い。

Trivy ステップのベストプラクティス

項目 推奨設定
DB キャッシュ actions/cache@v3~/.cache/trivy をキャッシュし、ダウンロード時間を約2分短縮
スキャン対象 ローカルでビルドしたイメージをプッシュせずにスキャン(docker run --rm でも可)
脆弱性レベルの絞り込み --severity HIGH,CRITICAL オプションで重要度の高いものだけをレポート

CodeQL ステップのベストプラクティス

  • 初期化時に queries ディレクトリを指定し、社内カスタムクエリを同梱できる。
  • 分析結果は必ず SARIF で出力し、upload-sarif アクションだけでチェックランが自動生成されるので追加作業は不要。

npm audit → SARIF 変換ステップの注意点

  1. audit2sarif は Node.js 環境に依存するため、node-version を明示的に指定すると安定します(例:uses: actions/setup-node@v3)。
  2. 出力ファイル名は .sarif 拡張子で統一し、upload-sarif が正しく検出できるようにする。

シークレット管理と最小権限設定

セキュリティスキャンが外部レジストリやプライベートパッケージへアクセスする場合、シークレットは最小権限で扱うことが重要です。

ワークフローレベルの permissions 設定例

ジョブ単位での権限制御

このようにジョブごとに権限を絞ることで、万が一アクションが乗っ取られた際の被害範囲を最小化できます。

シークレットの登録例

シークレット名 用途
DOCKER_USERNAME プライベートレジストリへの認証
DOCKER_PASSWORD 同上(GitHub Secrets に暗号化保存)
GH_TOKEN カスタム API 呼び出しや外部サービス連携時に使用

アーティファクトとしての結果保存と可視化

アーティファクトはジョブ完了後に UI から手動で取得でき、外部へ自動転送しなければ情報漏洩リスクは低減します。

チェックランへの自動コメント例(GitHub Script)


スキャン失敗時の制御・キャッシュ活用・トラブルシューティング

必須チェックでマージをブロックする手順

  1. リポジトリ設定 → Branches → 保護ルール を開く。
  2. 「Require status checks to pass before merging」を有効化し、Security Scan (trivy-scan), Security Scan (codeql-analysis) などのチェック名を選択。

これにより、いずれかのスキャンが失敗した PR はマージできません。

ジョブ停止とステータスマネジメント

  • デフォルトではジョブがエラーで終了すると needs がある後続ジョブは自動的に skipped になります。
  • 明示的に「失敗時も次のジョブへ」進めたい場合は continue-on-error: true を設定し、結果に応じたカスタムロジック(例:Slack 通知)を追加します。

Trivy DB のキャッシュ例

キャッシュを有効にすると、毎回 DB をダウンロードする時間(約2分)が削減され、CI の実行コストが低下します。

よくあるエラーと対処法

エラー例 原因 推奨対策
docker pull がタイムアウト ネットワーク障害またはレジストリ認証失敗 services: docker を追加し、DOCKER_USERNAME/DOCKER_PASSWORD をシークレットで提供
npm audit が ENOTFOUND エラー プロキシ未設定または DNS 解決不可 環境変数 HTTP_PROXY/HTTPS_PROXYNO_PROXYenv: で明示
SARIF 出力が期待通りでない 使用ツールのバージョン差異 アクション・パッケージを固定バージョン (@v2, audit2sarif@1.0.0) に更新し、format: sarif オプションを必ず指定

まとめ

  • セキュリティスキャンは CI の必須要素 – GitHub Actions と標準 Security 機能だけでも早期検出が可能です。
  • ツール選定は言語対応・CI 連携・レポート形式・コストの4軸で判断し、イメージは Trivy、コードは CodeQL、依存関係は Dependabot 系列で網羅的にカバーします。
  • 実装例 workflow は 3 つのジョブを needs で連結し、すべて SARIF 形式で GitHub Checks に自動アップロードする構成がベストプラクティスです。
  • シークレットは最小権限で管理し、ワークフロー全体の permissions を明示的に設定することでリスクを低減できます。
  • 失敗時のブロック設定・キャッシュ活用・トラブルシューティング により、開発フローへの影響を最小限に抑えつつ安定運用が実現します。

本稿で示したベストプラクティスとサンプルコードを自プロジェクトへ取り入れれば、GitHub Actions を活用した 包括的なセキュリティスキャン がすぐにでも始められるはずです。ぜひご活用ください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-GitHubActions