セキュリティ - まずはクィックスタート
1. はじめに
GitHubのセキュリティ機能は、単なるチェックリスト項目ではありません。適切に活用すれば、開発フローを妨げることなく、脆弱性の早期発見と修正を自動化できます。本記事では、GitHubが提供する包括的なセキュリティ機能を、実践的な視点から解説します。
2. GitHubセキュリティ機能の全体像
GitHubのセキュリティ機能は、3つの階層に分かれています。
2.1 基本機能(全プラン対応)
すべてのGitHubプランで利用できる機能です。これらは追加費用なしで利用できるため、まずはここから始めることをお勧めします。
2.2 GitHub Secret Protection
GitHub TeamまたはGitHub Enterprise Cloudで利用可能な、シークレット漏洩対策に特化した機能群です。
2.3 GitHub Code Security
コードの脆弱性検出と修正に特化した機能群です。パブリックリポジトリでは無料で利用できます。
3. Dependabot:依存関係管理の自動化
Dependabotは、依存関係の脆弱性を検出し、自動的に修正プルリクエストを作成します。3つの主要機能で構成されています。
3.1 Dependabot Alerts
依存関係に既知の脆弱性が含まれている場合、アラートを発行します。
主な特徴:
- GitHub Advisory Databaseと連携した脆弱性検出
- CVSSメトリクスによる重要度評価
- 自動トリアージルールによる誤検知フィルタリング
3.2 Dependabot Security Updates
セキュリティ脆弱性が検出された際、自動的に修正プルリクエストを作成します。
動作フロー:
3.3 Dependabot Version Updates
セキュリティとは関係なく、依存関係を最新バージョンに保つための機能です。
設定例(dependabot.yml):
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
# プルリクエストの上限を設定
open-pull-requests-limit: 10
# レビュアーを自動割り当て
reviewers:
- "tanaka-taro"
- "dev-team"
# ラベルを自動付与
labels:
- "dependencies"
- "javascript"
3.4 Dependabotの有効化手順
- リポジトリの「Settings」タブを開く
- 「Security」セクションから「Advanced Security」を選択
- Dependabot alerts、Dependabot security updates、Dependabot version updatesを有効化
注意: Dependabot version updatesを有効にすると、GitHubが自動的に.github/dependabot.ymlファイルを作成します。このファイルを編集してカスタマイズできます。
3.5 アラートの確認と対応
Dependabotアラートは、リポジトリの「Security」タブ内で確認できます。
アラート詳細に含まれる情報:
- 影響を受けるパッケージ
- 脆弱性の詳細説明
- CVSSスコアと重要度
- 修正バージョン
- 自動生成されたセキュリティアップデートPR(存在する場合)
対応方法:
- 「Review security update」をクリックして修正PRを確認
- PRの変更内容とコミットを検証
- 問題なければマージ
- アラートを却下する場合は理由を記録
3.6 カスタム自動トリアージルール
Dependabotアラートを大規模に管理するため、カスタム自動トリアージルールを設定できます。
ルールで実行可能なアクション:
- アラートの自動却下
- アラートのスヌーズ
- セキュリティアップデートの自動トリガー
4. Secret Scanning:シークレット漏洩の防止と検出
APIキーやトークンなどの機密情報がコードに含まれていないかをスキャンします。
4.1 Secret Scanning Alerts
コミット履歴全体をスキャンし、既知のパターンに一致するシークレットを検出します。
検出対象:
- パートナー提供のシークレットパターン(AWS、Azure、Google Cloudなど)
- カスタム定義パターン
- Copilot secret scanningによる非構造化シークレット(パスワードなど)
検出されるシークレットの例:
- APIキー
- アクセストークン
- プライベートキー
- データベース接続文字列
- OAuth トークン
4.2 Push Protection
シークレットを含むコードのプッシュを事前にブロックします。
Push Protection for Users:
パブリックリポジトリに対してデフォルトで有効になっており、個人アカウント設定で管理できます。リポジトリ側の設定に関係なく、ユーザーを保護します。
4.3 Delegated Bypass for Push Protection
プッシュ保護をバイパスする権限を制御し、レビュー・承認サイクルを実装します。
メリット:
- バイパス権限の細かい制御
- 承認フローによる監査証跡の確保
- セキュリティポリシーの一貫した適用
4.4 Custom Patterns
組織固有のシークレットパターンを定義できます。
設定例:
- 社内APIキーのフォーマット
- 独自の認証トークン形式
- 内部サービスの接続文字列
4.5 Copilot Secret Scanning
AI駆動でパスワードなどの非構造化シークレットを検出します。従来のパターンマッチングでは検出が難しかった、構造化されていない機密情報も識別できます。
5. Code Scanning:コードの脆弱性検出
ソースコード内のセキュリティ脆弱性とコーディングエラーを自動的に検出します。
5.1 CodeQL Analysis
GitHubが開発した静的解析エンジンです。コードをデータベースとして扱い、クエリを実行して脆弱性を検出します。
5.1.1 Default Setup(推奨)
GitHubが自動的に以下を判断します:
- スキャン対象の言語
- 実行するクエリスイート
- スキャンをトリガーするイベント
有効化手順:
- リポジトリの「Settings」→「Advanced Security」
- 「Code Security」または「GitHub Advanced Security」を有効化
- 「CodeQL analysis」の「Set up」→「Default」を選択
- 設定を確認して「Enable CodeQL」をクリック
5.1.2 Advanced Setup
より細かい制御が必要な場合、ワークフローファイルをカスタマイズできます。
ワークフロー例:
name: "CodeQL"
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
schedule:
- cron: '0 0 * * 1' # 毎週月曜日に実行
jobs:
analyze:
name: コード解析
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript', 'python' ]
steps:
- name: コードのチェックアウト
uses: actions/checkout@v4
- name: CodeQLの初期化
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
- name: 自動ビルド
uses: github/codeql-action/autobuild@v3
- name: CodeQL解析の実行
uses: github/codeql-action/analyze@v3
5.2 CodeQL CLI
ローカル環境やCI/CDパイプラインでCodeQLを実行できます。
使用例:
- オフライン環境でのスキャン
- カスタムCI/CDパイプラインとの統合
- 独自のクエリ開発とテスト
5.3 Copilot Autofix
Code scanningアラートに対して、自動的に修正案を生成します。
動作フロー:
メリット:
- 修正時間の大幅な短縮
- 学習機会の提供(修正理由の説明付き)
- 一貫性のある修正パターン
6. Dependency Review
プルリクエスト内の依存関係の変更を可視化し、脆弱性を含む依存関係の追加を防ぎます。
表示される情報:
- 追加・更新・削除された依存関係
- 既知の脆弱性の有無
- ライセンス情報
- 依存関係の変更による影響範囲
有効化条件:
- Dependency Graphが有効であること
- GitHub Code Securityライセンス(プライベート・内部リポジトリの場合)
7. Security Overview
組織全体のセキュリティ状況を一元的に可視化します。
主な機能:
- セキュリティアラートの集約表示
- トレンド分析と洞察
- リスクの高いリポジトリの特定
- セキュリティ設定の一括管理
フィルタリング機能:
- アラートタイプ別
- 重要度別
- リポジトリ別
- 期間別
8. GitHubシークレットの種類と管理
GitHubでは、用途に応じて3種類のシークレットを使い分けます。
8.1 Dependabotシークレット
用途:
- プライベートパッケージレジストリへの認証
- Dependabotがトリガーするワークフロー内での使用
スコープ:
- リポジトリレベル
- 組織レベル
アクセス権限:
- Dependabotが認証時に使用
- Dependabotトリガーのワークフローで使用可能
- Actionsシークレットは使用不可(重要)
設定例:
# dependabot.yml
version: 2
registries:
npm-private:
type: npm-registry
url: https://npm.example.com
token: ${{secrets.NPM_PRIVATE_TOKEN}}
updates:
- package-ecosystem: "npm"
directory: "/"
registries:
- npm-private
schedule:
interval: "daily"
8.2 Actionsシークレット
用途:
- GitHub Actionsワークフロー内での認証
- API呼び出しの認証情報
- デプロイメント用クレデンシャル
スコープ:
- リポジトリレベル
- 環境レベル
- 組織レベル
アクセス権限:
- GitHub Actionsワークフローからのみアクセス可能
- Dependabotトリガーのワークフローではアクセス不可
使用例:
name: デプロイ
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- name: 本番環境へデプロイ
env:
API_KEY: ${{ secrets.PRODUCTION_API_KEY }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
run: |
./deploy.sh
8.3 Codespacesシークレット
用途:
- Codespaces開発環境内での認証
- APIトークン、SSHキーの管理
スコープ:
- ユーザーアカウントレベル
- リポジトリレベル
- 組織レベル
アクセス権限:
- Codespaces内でのみアクセス可能
- GitHub Actionsからはアクセス不可
8.4 シークレット管理のベストプラクティス
共通の制限事項:
- 最大サイズ:48KB
- 組織シークレット:最大1,000個
- リポジトリシークレット:最大100個
- 環境シークレット:最大100個
セキュリティ考慮事項:
- シークレットは最小権限の原則に従って設定
- 定期的なローテーション
- 使用されていないシークレットの削除
- アクセス権限の定期的な見直し
9. セキュリティポリシーの設定
SECURITY.mdファイルを作成し、脆弱性報告の手順を明示します。
推奨される内容:
- サポート対象バージョン
- 脆弱性の報告方法
- 対応時間の目安
- 連絡先情報
作成手順:
- リポジトリの「Security」タブを開く
- 左サイドバーの「Policy」をクリック
- 「Start setup」をクリック
- SECURITY.mdファイルを編集
テンプレート例:
# セキュリティポリシー
## サポートバージョン
現在セキュリティアップデートの対象となっているバージョン:
| バージョン | サポート状況 |
| ------- | ----------- |
| 5.1.x | ✅ |
| 5.0.x | ✅ |
| 4.0.x | ❌ |
| < 4.0 | ❌ |
## 脆弱性の報告
セキュリティ上の問題を発見された場合は、以下の手順で報告してください:
1. security@example.comにメールを送信
2. 48時間以内に初回応答を行います
3. 修正完了まで秘密保持にご協力ください
報告いただいた脆弱性は、重要度に応じて以下の期間内に対応します:
- クリティカル:24時間以内
- 高:7日以内
- 中:30日以内
- 低:90日以内
10. データ漏洩防止のベストプラクティス
10.1 アカウントの保護
必須設定:
- 組織メンバー全員に2要素認証(2FA)を必須化
- 強固なパスワードガイドラインの策定
- Push Protection for Usersの有効化を推奨
- セキュリティポリシーの明文化
10.2 アクセス制御
推奨設定:
| 設定項目 | 推奨値 | 理由 |
|---|---|---|
| リポジトリのフォーク | 無効 | コード流出防止 |
| 可視性変更 | 制限 | 意図しない公開防止 |
| リポジトリ作成 | プライベート/内部のみ | デフォルトでの安全性確保 |
| リポジトリ削除/転送 | 制限 | 誤操作防止 |
| パーソナルアクセストークン | 最小権限 | 侵害時の影響範囲限定 |
10.3 ブランチ保護ルール
推奨設定:
設定項目:
- レビュー必須(最低1名以上)
- ステータスチェック必須
- 最新ブランチへの更新必須
- 管理者にもルールを適用
- 強制プッシュの禁止
- ブランチ削除の禁止
10.4 監査ログの活用
監視対象:
- シークレットスキャンアラートの作成・解決・再開
- Push Protectionのバイパス
- Dependabotアラートの作成・却下・解決
- アクセス権限の変更
- リポジトリ設定の変更
API経由での取得:
// 組織の監査ログを取得する例
const response = await fetch(
'https://api.github.com/orgs/soshiki-mei/audit-log?include=all&per_page=100',
{
headers: {
'Authorization': 'token YOUR_TOKEN',
'Accept': 'application/vnd.github+json'
}
}
);
const auditLog = await response.json();
11. インシデント対応
11.1 機密データが漏洩した場合
対応手順:
-
即座の対応
- 該当コミットの特定
- git filter-repoツールを使用した履歴からの削除
- 影響を受けるトークンの無効化
-
履歴のクリーンアップ
# git filter-repoのインストール
pip3 install git-filter-repo
# 機密ファイルを履歴から削除
git filter-repo --path config/secrets.yml --invert-paths
# 強制プッシュ
git push origin --force --all
-
トークンの無効化
- 漏洩したトークンをすぐに無効化
- 新しいトークンを生成
- シークレットスキャンによる検出を確認
-
報告と記録
- インシデントレポートの作成
- 影響範囲の調査
- 再発防止策の実施
11.2 DMCA対応
著作権侵害の申し立て:
- DMCA Takedown Notice Formを使用
- 問題のあるコミットハッシュを明記
- GitHub Supportに連絡
誤った申し立てへの対応:
- DMCA Counter Notice Formを使用
- 正当性を証明する資料を準備
12. Webhooksによる自動化
セキュリティアラートに対して自動的に対応するために、Webhooksを活用できます。
利用可能なWebhook:
code_scanning_alertdependabot_alertsecret_scanning_alert
設定例(Node.js):
const express = require('express');
const app = express();
app.post('/webhook', express.json(), (req, res) => {
const event = req.headers['x-github-event'];
const payload = req.body;
if (event === 'secret_scanning_alert') {
if (payload.action === 'created') {
// Slackに通知
notifySlack({
channel: '#security-alerts',
message: `シークレット漏洩検出: ${payload.alert.secret_type}`,
repository: payload.repository.full_name
});
// チケット自動作成
createJiraTicket({
summary: 'シークレット漏洩対応',
description: payload.alert.html_url,
priority: 'Critical'
});
}
}
res.status(200).send('OK');
});
app.listen(3000);
13. APIを活用した自動化
GitHub APIを使用して、セキュリティアラートの管理を自動化できます。
13.1 Dependabot Alerts API
// 組織内の全Dependabotアラートを取得
const response = await fetch(
'https://api.github.com/orgs/soshiki-mei/dependabot/alerts?state=open&severity=high',
{
headers: {
'Authorization': 'token YOUR_TOKEN',
'Accept': 'application/vnd.github+json'
}
}
);
const alerts = await response.json();
// 重要度でフィルタリング
const criticalAlerts = alerts.filter(
alert => alert.security_advisory.severity === 'critical'
);
13.2 Secret Scanning API
// Push Protectionをバイパスしたアラートを取得
const response = await fetch(
'https://api.github.com/repos/shoyusha-mei/repo-mei/secret-scanning/alerts',
{
headers: {
'Authorization': 'token YOUR_TOKEN',
'Accept': 'application/vnd.github+json'
}
}
);
const alerts = await response.json();
// バイパスされたアラートを抽出
const bypassedAlerts = alerts.filter(
alert => alert.push_protection_bypassed === true
);
13.3 Code Scanning API
// 特定のルールによるアラートを取得
const response = await fetch(
'https://api.github.com/repos/shoyusha-mei/repo-mei/code-scanning/alerts?state=open&rule_id=js/sql-injection',
{
headers: {
'Authorization': 'token YOUR_TOKEN',
'Accept': 'application/vnd.github+json'
}
}
);
const alerts = await response.json();
14. 実践:セキュリティ設定のチェックリスト
14.1 リポジトリレベル
- Dependency Graphの有効化
- Dependabot alertsの有効化
- Dependabot security updatesの有効化
- Dependabot version updatesの設定(dependabot.yml作成)
- Secret scanningの有効化
- Push protectionの有効化
- Code scanningの設定(Default setupまたはAdvanced setup)
- Dependency reviewの確認
- SECURITY.mdファイルの作成
- ブランチ保護ルールの設定
- 必須レビュアーの設定
- ステータスチェックの必須化
14.2 組織レベル
- 2要素認証の必須化
- リポジトリ作成ポリシーの設定
- リポジトリ削除・転送ポリシーの設定
- フォークポリシーの設定
- 可視性変更ポリシーの設定
- ドメイン認証の設定
- 組織レベルシークレットの設定
- Security overviewの定期的な確認
- 監査ログの定期的なレビュー
- Webhookの設定
- GitHub Customer Agreementへのアップグレード検討
14.3 個人レベル
- 2要素認証の有効化
- Push Protection for Usersの有効化
- パーソナルアクセストークンの最小権限設定
- 未使用トークンの削除
- SSH鍵の定期的なローテーション
15. まとめ
GitHubのセキュリティ機能は、開発プロセスを妨げることなく、継続的なセキュリティ向上を実現します。重要なのは、これらの機能を理解し、組織の要件に合わせて適切に設定することです。
段階的な導入アプローチ:
15.1 フェーズ1:基本設定(1週間)
- 2要素認証の必須化
- Dependency Graphの有効化
- Dependabot alertsの有効化
- SECURITY.mdの作成
15.2 フェーズ2:自動化(2-4週間)
- Dependabot security updatesの有効化
- Secret scanningの有効化
- Push protectionの有効化
- ブランチ保護ルールの設定
15.3 フェーズ3:高度な機能(1-2ヶ月)
- Code scanningの設定
- Copilot Autofixの活用
- カスタムパターンの定義
- Webhooksによる自動化
15.4 フェーズ4:継続的改善
- Security overviewでのモニタリング
- 監査ログの定期的なレビュー
- ポリシーの見直しと更新
- チームへのトレーニング
セキュリティは一度設定すれば終わりではなく、継続的な取り組みが必要です。GitHubの提供するツールを活用し、開発速度を維持しながら、セキュアな開発環境を構築していきましょう。