GitHub - セキュリティ

提供: MochiuWiki : SUSE, EC, PCB

概要

GitHubのセキュリティ機能は、ソフトウェアサプライチェーン全体を保護するための統合的なセキュリティプラットフォームである。

GitHubセキュリティは以下に示す3つの柱で構成されている。

  • Secret Scanning
    APIキー、パスワード、トークンなどの認証情報がコードに混入することを検出・防止する機能である。
    Git履歴全体およびIssues、PR、Discussions、Wikiもスキャン対象となる。
  • Code Scanning
    CodeQLをはじめとする静的解析エンジンによりコードの脆弱性を自動検出する機能である。
    PR作成時にインライン表示でフィードバックを提供する。
  • Supply Chain Security
    Dependabotによる依存関係の脆弱性検出、自動修正PR作成、Dependency Graphによる依存関係の可視化を提供する機能である。


GitHub Advanced Security (GHAS) は、これらのセキュリティ機能を包括的に提供するアドオンである。
GHASはGitHub Code Security (CodeQL、Dependabotの高度機能) とGitHub Secret Protectionの2つのプロダクトで構成される。

公開リポジトリでは一部の機能が無料で利用できるが、プライベートリポジトリでの利用にはGitHub Enterprise Cloudまたはサーバライセンスが必要である。


Dependabot

Dependabotとは

Dependabotは、リポジトリの依存関係を継続的に監視し、脆弱性の検出・修正および最新バージョンへの更新を自動化するGitHubの機能である。

Dependabotは、以下に示す3つのコンポーネントで構成される。

Dependabotのコンポーネント
項目 説明
Dependabot Alerts 脆弱な依存関係を検出してアラートを通知する。
Dependabot Security Updates セキュリティ上の脆弱性を修正するパッチを自動的にPRとして作成する。
Dependabot Version Updates 依存関係を最新バージョンに更新するPRを定期的に作成する。


Dependabot Alerts

Dependabot Alertsは、リポジトリで使用している依存関係にGitHub Advisory Databaseに登録された既知の脆弱性が含まれている場合に、自動でアラートを生成する機能である。

脆弱性の検出時、書き込み権限 / メンテナンス権限 / 管理者権限を持つユーザに通知が送信される。
通知の設定は個人レベル・リポジトリレベル・組織レベルのそれぞれで制御できる。

アラートはリポジトリの[Security]タブからも確認でき、影響を受けるパッケージ名 / 脆弱性の種類 / 重大度 (Critical/High/Medium/Low) が表示される。

Dependabot Security Updates

Dependabot Security Updatesは、Dependabot Alertsで脆弱性が検出された時に、脆弱性を修正したバージョンへの更新PRを自動的に作成する機能である。

自動作成されるPRには、以下に示す情報が含まれる。

  • 変更対象のパッケージ名とバージョン
  • 修正される脆弱性の内容 (CVE番号・説明)
  • リリースノートおよびコミット履歴へのリンク


PRをマージすることにより、最小限の変更で脆弱性を解消できる。

Dependabot Version Updates

Dependabot Version Updatesは、依存関係を定期的にチェックして、新しいバージョンが利用可能になった時にPRを作成する機能である。

この機能を有効化するには、リポジトリに .github/dependabot.yml ファイルを作成して設定を記述する必要がある。

dependabot.ymlの設定

.github/dependabot.yml ファイルの基本的な設定項目を以下に示す。

 version: 2
 updates:
   - package-ecosystem: "npm"
     directory: "/"
     schedule:
       interval: "weekly"
     allow:
       - dependency-type: "direct"
     ignore:
       - dependency-name: "example-package"
         versions: ["1.x", "2.x"]
     commit-message:
       prefix: "chore"
       include: "scope"


下表に、主要な設定項目を示す。

dependabot.ymlの主要な設定項目
項目 説明
version 設定ファイルのバージョンを指定する。
現在は 2 のみ有効である。
updates 更新設定のリストを記述する。
複数のエコシステムを対象にする場合は複数のエントリを記述する。
package-ecosystem 監視対象のパッケージエコシステムを指定する。
directory パッケージマニフェストファイルが存在するディレクトリを指定する。
schedule.interval 更新チェックの頻度を指定する。
daily (毎日)、weekly (週次)、monthly (月次)から選択する。
allow 更新を許可する依存関係の種類を制限する。
direct (直接依存)または indirect (間接依存)を指定できる。
ignore 更新対象から除外するパッケージや特定バージョンを指定する。
commit-message DependabotがPRを作成する時のコミットメッセージのプレフィックスを設定する。


対応パッケージエコシステム

下表に、Dependabotが対応しているパッケージエコシステムを示す。

Dependabot対応エコシステム一覧
エコシステム package-ecosystemの値 マニフェストファイル
npm (Node.js) npm package.json
pip (Python) pip requirements.txt, Pipfile
Maven (Java) maven pom.xml
Gradle (Java/Kotlin) gradle build.gradle
Composer (PHP) composer composer.json
RubyGems (Ruby) bundler Gemfile
Cargo (Rust) cargo Cargo.toml
Go modules gomod go.mod
NuGet (.NET) nuget *.csproj, packages.config
Pub (Dart/Flutter) pub pubspec.yaml
GitHub Actions github-actions .github/workflows/*.yml
Docker docker Dockerfile
Terraform terraform *.tf


Auto-Triage Rules

Auto-Triage Rulesは、Dependabot Alertsを自動で仕分けするルールを定義する機能である。
この機能により、特定の条件に合致するアラートを自動で却下・スヌーズ・承認することができる。

組織レベルまたはリポジトリレベルで設定でき、以下に示すような条件を組み合わせてルールを定義する。

  • 脆弱性の重大度 (Critical / High / Medium / Low)
  • 脆弱性の種類 (CWEコード)
  • 対象のスコープ (runtime / development)
  • パッケージ名


例えば、開発依存関係 (devDependencies) の低・中程度の脆弱性を自動で却下するルールを設定することにより、アラートの過負荷を軽減できる。


Code Scanning

Code Scanningとは

Code Scanningは、コードに含まれるセキュリティ上の脆弱性やプログラミング上の問題を自動的に発見するGitHubの静的解析機能である。

PRの作成 / プッシュのタイミングでスキャンが実行されて、検出された問題はPR上にインラインコメントとして表示される。
また、全てのアラートは、リポジトリの[Security]タブでも管理できる。

デフォルトの解析エンジンとしてCodeQLが使用されるが、SARIFファイルを通じてサードパーティの静的解析ツールとも統合できる。

CodeQL

CodeQLは、GitHubが開発したセマンティックコード解析エンジンであり、コードをデータとして扱い、クエリによって脆弱性のパターンを検索する仕組みを持つ。

CodeQLが対応している言語を以下に示す。

  • C / C++
  • C#
  • Go
  • Java / Kotlin
  • JavaScript / TypeScript
  • Python
  • Ruby
  • Swift


CodeQLは、SQLインジェクション、クロスサイトスクリプティング、バッファオーバーフロー、安全でない暗号化処理等の脆弱性パターンを検出できる。
ローカル環境での分析には、CodeQL CLIが利用できる。

セットアップ

Code Scanningのセットアップ方法は、デフォルトセットアップと詳細セットアップの2種類がある。

デフォルトセットアップ

デフォルトセットアップは、GitHubが自動的に解析設定を管理するセットアップ方式である。

設定の手順を以下に示す。

  1. リポジトリの[Security]タブを開く。
  2. [Code scanning]セクションの[Set up]ボタンを押下する。
  3. [Default]を選択して、セットアップを完了する。


リポジトリで使用されている言語が自動検出されて、適切なCodeQLクエリスイートが適用される。
設定変更が不要な場合やすぐに利用を開始したい場合に適している。

詳細セットアップ

詳細セットアップは、GitHub Actionsのワークフローファイル (YAML) を自分でカスタマイズするセットアップ方式である。

設定の手順を以下に示す。

  1. リポジトリの[Security]タブを開く。
  2. [Code scanning]セクションの[Set up]ボタンを押下する。
  3. [Advanced]を選択する。
  4. 生成された .github/workflows/codeql.yml ファイルを編集して、コミットする。


カスタムクエリの追加、スキャン対象の絞り込み、スケジュールの変更等、詳細な制御が必要な場合に適している。

.github/workflows/codeql.yml ファイルの基本的な構成例を以下に示す。

 name: "CodeQL"
 
 on:
   push:
     branches: [ "main" ]
   pull_request:
     branches: [ "main" ]
   schedule:
     - cron: '0 0 * * 1'
 
 jobs:
   analyze:
     name: Analyze
     runs-on: ubuntu-latest
     permissions:
       actions: read
       contents: read
       security-events: write
 
     strategy:
       matrix:
         language: [ 'javascript', 'python' ]
 
     steps:
       - name: Checkout repository
         uses: actions/checkout@v4
 
       - name: Initialize CodeQL
         uses: github/codeql-action/init@v3
         with:
           languages: ${{ matrix.language }}
 
       - name: Perform CodeQL Analysis
         uses: github/codeql-action/analyze@v3


Code Scanning Alerts

Code Scanningで検出されたアラートは、以下に示す方法で確認・管理できる。

  • PRでのインライン表示
    PRの差分ビューに対して、問題のある行に直接コメントとしてアラートが表示される。
    開発者がコードレビュー時にセキュリティ問題を認識できる。
  • Securityタブでの管理
    リポジトリの[Security]タブから全てのCode Scanningアラートを一覧表示できる。
    言語、ルール、重大度、ステータスでフィルタリングして管理できる。
    アラートを OpenFixedDismissed の状態で管理できる。


アラートを却下 (Dismiss) する時は、却下理由 (false positive / won't fix / used in tests等) を記録することが推奨される。

SARIFとの統合

SARIF (Static Analysis Results Interchange Format) は、静的解析ツールの結果を表現するためのJSONベースの標準フォーマットである。
GitHub Code Scanningは、SARIFファイルのインポートに対応しており、CodeQL以外の静的解析ツールの結果もGitHub上で一元管理できる。

SARIFファイルは、以下に示すGitHub Actionsアクションを使用してアップロードする。

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


下表に、SARIFとの統合に対応した主なサードパーティツールを示す。

サードパーティ製静的解析ツールの例
ツール 説明
SonarQube / SonarCloud オープンソースおよびプロプライエタリなコード品質・セキュリティ解析ツール
Fortify Static Code Analyzer Micro Focusが提供するエンタープライズ向け静的解析ツール
Checkmarx エンタープライズ向けアプリケーションセキュリティテストプラットフォーム
Semgrep オープンソースの軽量静的解析ツール
カスタムルールを記述しやすい特徴を持つ。



Secret Scanning

Secret Scanningとは

Secret Scanningは、APIキー、パスワード、トークン、証明書等の機密情報 (シークレット) がリポジトリに誤ってコミットされることを検出・防止する機能である。

コードベース全体だけでなく、Git履歴全体も対象としてスキャンが実行される。

検出対象

Secret Scanningが検出するシークレットのパターンは、以下に示す4種類に分類される。

Secret Scanningの検出パターン種別
種別 説明
Partner secrets GitHubがパートナー企業と連携して定義したパターンである。
検出した場合、パートナー企業に対してシークレットの無効化を自動通知する。
AWS、Google、Azure、Slack、Stripe等、多数のサービスプロバイダーに対応している。
Non-provider patterns 特定のサービスに紐付かない一般的なシークレットパターンである。
プライベートキー、汎用的なトークンパターン等が含まれる。
Custom patterns ユーザが正規表現で定義した自社固有のシークレットパターンである。
リポジトリ、組織、エンタープライズの各レベルで設定できる。
AI-powered detection 機械学習モデルを使用して、パターン定義のない未知のシークレットを検出する。


スキャン対象

下表に、Secret Scanningのスキャン対象範囲を示す。

Secret Scanningのスキャン対象
対象 説明
Gitコミット履歴全体 リポジトリ作成時からの全コミット履歴をスキャンする。
過去に誤ってコミットされたシークレットも検出できる。
Issues Issueのタイトル、本文、コメントをスキャンする。
Pull Requests PRのタイトル、本文、コメント、レビューコメントをスキャンする。
Discussions Discussionsの投稿内容をスキャンする。
Wiki リポジトリのWikiページをスキャンする。


Push Protection

Push Protectionは、シークレットを含むコミットをプッシュ時の段階でブロックする機能である。
Push Protectionはコマンドライン (CLI)、GitHub WebUI、GitHub APIのいずれの方法でのプッシュに対しても機能する。

シークレットが検出された場合、プッシュはブロックされて、開発者に警告が表示される。
開発者はシークレットを除去してから再プッシュ、または、以下に示す理由を指定してブロックをバイパスすることができる。

  • これは偽陽性である (It's a false positive)
  • 本番環境では使用しない (It's only used for tests)
  • リスクを承知の上でプッシュする (I'll fix this later)


バイパスが実行された場合、その操作はログに記録されて、アラートが生成される。

Push Protectionは、リポジトリ / ユーザ / 組織の各レベルで有効化・設定できる。

カスタムパターン

カスタムパターンを使用することにより、自社固有のシークレット形式を正規表現で定義してスキャン対象に追加できる。

設定手順を以下に示す。

  1. リポジトリの[Settings] - [Advanced Security] - [Custom patterns]を開く。
  2. [New pattern]を選択する。
  3. パターン名、正規表現、サンプル文字列を入力する。
  4. [Save and dry run]でテストを実行して検出結果を確認する。
  5. 問題がなければパターンを公開する。


カスタムパターンはリポジトリレベル、組織レベル、エンタープライズレベルで設定でき、上位レベルで設定したパターンは下位レベルのリポジトリに継承される。

ドライラン (dry run) 機能を使用することにより、実際にアラートを生成する前にパターンの検出精度を検証できる。

Validity Checks

Validity Checksは、検出されたシークレットが実際に有効であるかどうかをサービスプロバイダーに問い合わせて確認する機能である。
この機能により、既に無効化されたシークレットに関するアラートと今まさに有効なシークレットに関するアラートを区別して優先度を付けることができる。

有効性のステータスは、ActiveInactiveUnknown の3種類で表示される。

対応しているシークレットの種類は、GitHubが定義したPartner secretsの範囲内に限られる。


セキュリティポリシー

SECURITY.md

SECURITY.md ファイルは、脆弱性の報告方法を説明するセキュリティポリシー文書である。

このファイルはリポジトリのルートディレクトリ・docs/.github/ のいずれかに配置することにより、リポジトリのSecurityタブに自動的に表示される。

SECURITY.md ファイルには、以下に示す情報を記載することが推奨される。

  • サポートしているバージョンの一覧
  • 脆弱性の報告先 (メールアドレス・連絡フォーム等)
  • 報告から対応完了までのプロセスと期待されるタイムライン
  • 公開ポリシー (responsible disclosureポリシー)


セキュリティアドバイザリ

セキュリティアドバイザリは、リポジトリのセキュリティ上の問題を非公開で協議・修正して、修正後に公開するための機能である。

リポジトリメンテナーは[Security]タブからドラフトアドバイザリを作成して、信頼できる協力者を招待して非公開の環境で脆弱性の詳細を共有できる。

修正が完了した後、アドバイザリを公開することにより、CVE番号のリクエストやGitHub Advisory Databaseへの登録が行われる。

プライベート脆弱性報告

Private Vulnerability Reporting (プライベート脆弱性報告) は、セキュリティリサーチャーがリポジトリメンテナーに対して脆弱性を非公開で報告するための仕組みである。

この機能を有効化すると、リポジトリの[Security]タブに[Report a vulnerability]ボタンが表示され、誰でも非公開の脆弱性報告フォームからメンテナーに連絡できる。

報告内容はメンテナーとリポートした人だけが閲覧でき、修正作業を非公開の環境で進めることができる。


依存関係のレビュー

Dependency Graph

Dependency Graphは、リポジトリで使用している全ての依存関係を自動的に解析して可視化する機能である。

リポジトリのInsightsセクションから確認でき、直接依存関係だけでなく間接依存関係 (依存関係の依存関係) も表示される。

Dependency Graphは以下に示す機能の基盤となっている。

  • Dependabot Alertsの脆弱性検出
  • Dependabot Security UpdatesのPR作成
  • Dependency ReviewのPRチェック
  • SBOMの生成


対応しているマニフェストファイル形式は、npm、pip、Maven、Gradle、Composer、RubyGems、Cargo、Go modules、NuGet等、多数に及ぶ。

Dependency Review

Dependency Reviewは、PRのマージ前に依存関係の変更内容をチェックする機能である。

PRで追加 / 更新 / 削除される依存関係に対して、以下に示す情報を確認できる。

  • 追加されるパッケージに既知の脆弱性が含まれていないか
  • ライセンスが組織のポリシーに適合しているか
  • 旧バージョンや非推奨パッケージでないか


Dependency Reviewを自動化するには、actions/dependency-review-action を使用したGitHub Actionsワークフローを設定する。

 name: Dependency Review
 
 on:
   pull_request:
 
 jobs:
   dependency-review:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout repository
         uses: actions/checkout@v4
 
       - name: Dependency Review
         uses: actions/dependency-review-action@v4
         with:
           fail-on-severity: moderate
           deny-licenses: GPL-3.0, AGPL-3.0


SBOM

SBOM (Software Bill of Materials、ソフトウェア部品表) は、ソフトウェアに含まれる全ての依存関係コンポーネントを一覧化した文書である。

GitHubはDependency Graphの情報をもとに、SPDX形式またはCycloneDX形式のSBOMファイルを生成・エクスポートする機能を提供している。

SBOMはコンプライアンス監査、サプライチェーンのリスク評価、インシデント対応において使用される。

リポジトリの[Insights] - [Dependency Graph]ページからSBOMをダウンロードできる。


セキュリティ概要ダッシュボード

組織レベル

組織のセキュリティ概要ダッシュボードは、組織内の全リポジトリのセキュリティ状況を一元的に把握するための機能である。

ダッシュボードでは以下の情報を確認できる。

  • トレンド分析
    組織全体のアラート数の時系列推移を可視化する。
    特定の期間にアラートが急増したリポジトリを特定できる。
  • カバレッジ監視
    各セキュリティ機能 (Code Scanning / Secret Scanning / Dependabot Alerts) の有効化状況を確認できる。
    未設定のリポジトリを特定して対応できる。
  • Push Protectionの有効性
    組織全体でのPush Protectionのブロック状況、バイパス状況を確認できる。
  • CodeQL PR分析
    PRに対してCode Scanningが実行されているリポジトリの割合を確認できる。


このダッシュボードは、GitHub Enterprise CloudまたはGitHub Advanced Security (GHAS) ライセンスが必要である。

リポジトリレベル

リポジトリレベルのセキュリティ情報は、各リポジトリのSecurityタブから確認できる。

Securityタブでは、以下に示す情報を管理できる。

Securityタブの機能一覧
項目 説明
Overview リポジトリのセキュリティ機能の有効化状況とアラートの概要を表示する。
Dependabot Alerts 脆弱な依存関係のアラート一覧を表示・管理する。
Code Scanning Alerts Code Scanningで検出されたアラート一覧を表示・管理する。
Secret Scanning Alerts 検出されたシークレットのアラート一覧を表示・管理する。
Security policy SECURITY.md ファイルの内容を表示する。
Security advisories リポジトリのセキュリティアドバイザリを管理する。



GitHub Advisory Database

CVEデータベース

GitHub Advisory Databaseは、GitHubが管理するオープンソースソフトウェアの脆弱性データベースである。

2026年3月時点で、レビュー済みのアドバイザリが27,583件、未レビューのアドバイザリが294,507件以上登録されている。

データベースのコンテンツはCC-BY-4.0ライセンスの下で公開されており、オープンソースプロジェクトからの貢献も受け付けている。

各アドバイザリには以下の情報が含まれる。

  • CVE識別子 (CVE番号)
  • GHSA識別子 (GitHub独自の識別子)
  • 影響を受けるパッケージ・バージョン範囲
  • 脆弱性の種類 (CWEコード)
  • 重大度スコア (CVSS)
  • 修正バージョン


対応しているエコシステムは、npm、Maven、Composer、Go、pip、RubyGems、NuGet、Cargo、Pub、GitHubActions等、多岐にわたる。

アドバイザリの検索

GitHub Advisory Databaseは、GitHub Advisory Databaseから検索できる。

以下に示す条件でアドバイザリを検索およびフィルタリングできる。

  • エコシステム (npm / Maven / pip 等)
  • 重大度 (Critical / High / Medium / Low)
  • CWEコード (脆弱性の種類)
  • CVE番号による直接検索
  • キーワード検索


GitHub CLIを使用してアドバイザリを検索することも可能である。

# 特定パッケージの脆弱性を検索する
gh api /advisories?affects=npm/lodash


また、GraphQL APIを使用することにより、プログラムからアドバイザリデータを取得して、独自のセキュリティダッシュボードを構築することも可能である。