0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

セキュリティ - まずはクィックスタート

Posted at

セキュリティ - まずはクィックスタート

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の有効化手順

  1. リポジトリの「Settings」タブを開く
  2. 「Security」セクションから「Advanced Security」を選択
  3. Dependabot alerts、Dependabot security updates、Dependabot version updatesを有効化

注意: Dependabot version updatesを有効にすると、GitHubが自動的に.github/dependabot.ymlファイルを作成します。このファイルを編集してカスタマイズできます。

3.5 アラートの確認と対応

Dependabotアラートは、リポジトリの「Security」タブ内で確認できます。

アラート詳細に含まれる情報:

  • 影響を受けるパッケージ
  • 脆弱性の詳細説明
  • CVSSスコアと重要度
  • 修正バージョン
  • 自動生成されたセキュリティアップデートPR(存在する場合)

対応方法:

  1. 「Review security update」をクリックして修正PRを確認
  2. PRの変更内容とコミットを検証
  3. 問題なければマージ
  4. アラートを却下する場合は理由を記録

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が自動的に以下を判断します:

  • スキャン対象の言語
  • 実行するクエリスイート
  • スキャンをトリガーするイベント

有効化手順:

  1. リポジトリの「Settings」→「Advanced Security」
  2. 「Code Security」または「GitHub Advanced Security」を有効化
  3. 「CodeQL analysis」の「Set up」→「Default」を選択
  4. 設定を確認して「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個

セキュリティ考慮事項:

  1. シークレットは最小権限の原則に従って設定
  2. 定期的なローテーション
  3. 使用されていないシークレットの削除
  4. アクセス権限の定期的な見直し

9. セキュリティポリシーの設定

SECURITY.mdファイルを作成し、脆弱性報告の手順を明示します。

推奨される内容:

  • サポート対象バージョン
  • 脆弱性の報告方法
  • 対応時間の目安
  • 連絡先情報

作成手順:

  1. リポジトリの「Security」タブを開く
  2. 左サイドバーの「Policy」をクリック
  3. 「Start setup」をクリック
  4. 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 アカウントの保護

必須設定:

  1. 組織メンバー全員に2要素認証(2FA)を必須化
  2. 強固なパスワードガイドラインの策定
  3. Push Protection for Usersの有効化を推奨
  4. セキュリティポリシーの明文化

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 機密データが漏洩した場合

対応手順:

  1. 即座の対応

    • 該当コミットの特定
    • git filter-repoツールを使用した履歴からの削除
    • 影響を受けるトークンの無効化
  2. 履歴のクリーンアップ

# git filter-repoのインストール
pip3 install git-filter-repo

# 機密ファイルを履歴から削除
git filter-repo --path config/secrets.yml --invert-paths

# 強制プッシュ
git push origin --force --all
  1. トークンの無効化

    • 漏洩したトークンをすぐに無効化
    • 新しいトークンを生成
    • シークレットスキャンによる検出を確認
  2. 報告と記録

    • インシデントレポートの作成
    • 影響範囲の調査
    • 再発防止策の実施

11.2 DMCA対応

著作権侵害の申し立て:

  • DMCA Takedown Notice Formを使用
  • 問題のあるコミットハッシュを明記
  • GitHub Supportに連絡

誤った申し立てへの対応:

  • DMCA Counter Notice Formを使用
  • 正当性を証明する資料を準備

12. Webhooksによる自動化

セキュリティアラートに対して自動的に対応するために、Webhooksを活用できます。

利用可能なWebhook:

  • code_scanning_alert
  • dependabot_alert
  • secret_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の提供するツールを活用し、開発速度を維持しながら、セキュアな開発環境を構築していきましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?