SECURITY GUIDE

セキュリティ編

GitHubで安全に開発する

事故を未然に防ぐために知っておくべきこと

→ キーで次へ

この編の全体像

ゴール: 開発中のセキュリティリスクを理解し、事故を未然に防ぐ習慣を身につける

Section 1

なぜセキュリティが重要か

実際の事故事例と対策の概要
→ 実際の事故例で危機感を持つ

Section 2

Secrets管理

.env・環境変数・.gitignoreの使い方
→ APIキーを漏洩させない具体的な方法

Section 3

自動防御ツール

git-secrets / Dependabotの導入と設定
→ git-secrets / Dependabotで人間のミスを機械が防ぐ

Section 4

署名と認証

GPG署名・2FA・SSH鍵の設定
→ 「本人が書いた」ことを証明する仕組み

Section 5

保護と監視

ブランチ保護・Advanced Security
→ ブランチ保護 / Advanced Securityで組織的に守る

Section 6

チェックリスト

セキュリティ対策の確認項目
→ 今日からできるセキュリティ対策一覧

なぜセキュリティが重要か?

実際にあった事故

AWS APIキーをGitHubにpush

→ 数分でボットに検出される

→ 仮想通貨マイニングに悪用

→ 一晩で数十万円の請求

GitHubの公開リポジトリは常にスキャンされている。シークレットを1秒でも公開すると危険。

でも防げる!

  • .gitignore で機密ファイルを除外
  • git-secrets でコミット前にチェック
  • GitHub Secret Scanning で自動検出
  • 環境変数でシークレットを管理
  • 2FA で不正ログインを防止

正しい知識があれば、事故はほぼ100%防げる

Secrets管理 — 機密情報を守る

.env ファイル

DATABASE_URL=postgres://user:pass@host/db
API_KEY=sk-abcdef123456789
SECRET_TOKEN=ghp_xxxxxxxxxxxx

これを絶対にコミットしない!

.gitignore

# 環境変数
.env
.env.local
.env.production
# 認証情報
credentials.json
*.pem

プロジェクト開始時に必ず設定

secrets-demo

git-secrets — コミット前にブロック

git-secrets とは?

AWSが開発したツール。git commit 時にフックが走り、AWSキーやパスワードのパターンを検出してコミットをブロックする。

git-secrets-demo

Dependabot — 脆弱性を自動修正

何をしてくれる?

  • 依存パッケージの脆弱性を検出
  • 修正バージョンへのPRを自動作成
  • 定期的にバージョンアップのPRも作成
  • GitHub上で無料で使える

有効化方法

# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
my-app Pull requests
Bump express from 4.17.1 to 4.18.2 security
Bump lodash from 4.17.20 to 4.17.21 security
Bump axios from 0.21.1 to 1.6.5 dependencies

Dependabotが自動でPRを作成。レビューしてマージするだけ。

Security Advisories — 脆弱性アラート

my-app
Code
Issues
Pull requests
Security
Actions
Critical: Prototype Pollution in lodash CVE-2021-23337

lodash < 4.17.21 に任意コード実行の脆弱性。Dependabot PRで修正可能。

High: Regular Expression DoS in express CVE-2024-xxxx

express 4.17.x にReDoS脆弱性。4.18.2以上にアップデート推奨。

react: No known vulnerabilities

GitHubはCVEデータベースと連携し、使用中のパッケージに脆弱性が見つかるとアラートを送信。
Settings → Code security and analysis で通知を有効化しよう。

署名付きコミット (GPG/SSH)

なぜ署名が必要?

git config user.email は誰でも自由に設定できる。つまり他人になりすましてコミットできてしまう。

GPG/SSH署名で「このコミットは本当に自分が作った」と証明できる。

署名なし: abc1234 feat: update
署名あり: abc1234 feat: update Verified

SSH署名がおすすめ

Git 2.34以降はSSH鍵で署名可能。GPGより設定が簡単!

# 設定3行でOK
git config gpg.format ssh
git config user.signingkey ~/.ssh/id_ed25519.pub
git config commit.gpgsign true
gpg-signing-demo

2FA(二要素認証)

🔐

パスワードだけでは危険

パスワードが漏洩すると、誰でもあなたのアカウントにログインできてしまう。

2023年からGitHubは全ユーザーに2FA必須化を段階的に実施中

設定方法

1. 認証アプリを用意

Google Authenticator / 1Password / Authy など

2. GitHubで有効化

Settings → Password and authentication → Enable 2FA

3. リカバリーコード保存

スマホ紛失時のためにリカバリーコードを安全な場所に保管!

4. セキュリティキー(推奨)

YubiKeyなどのハードウェアキーが最も安全

多くの企業・OSSプロジェクトでは2FA必須。設定していないとOrganizationに参加できないことも。

Branch Protection Rules

セキュリティの観点からmainブランチを守る設定

Require pull request reviews

直接pushを禁止し、PRレビューを必須にする。悪意あるコードや脆弱なコードが混入するのを防ぐ。

Require signed commits

署名なしのコミットをブロック。なりすましコミットを防止。

Require status checks

CIテスト(GitHub Actions)が通らないとマージ不可。セキュリティスキャンを必須にできる。

Restrict who can push

特定のユーザー/チームだけがmainにpush可能。管理者でもルール適用を強制できる。

Settings → Branches → Add branch protection rule で設定。
Do not allow bypassing the above settings にチェックを入れると管理者にも適用。

SECURITY.md — 脆弱性報告ポリシー

SECURITY.md とは?

脆弱性を発見した人に「どこに・どうやって報告すればいいか」を伝えるファイル。Responsible Disclosure(責任ある開示)のガイド。

リポジトリルートまたは .github/ に置く。GitHub Security タブにも表示される。

テンプレート

# Security Policy

## Supported Versions
| Version | Supported |
| 2.x    | ✓       |
| 1.x    | ✗       |

## Reporting a Vulnerability
security@example.com に連絡。
公開Issueには書かないでください。
48時間以内に返信します。
ポイント: 脆弱性は公開Issueに書いてはいけない。攻撃者に悪用される前に、非公開で報告→修正→公開の流れが重要。GitHubのPrivate vulnerability reporting機能も活用しよう。

GitHub Advanced Security

🔍

Code Scanning

CodeQLエンジンがコードを解析し、SQLインジェクションやXSSなどの脆弱性を自動検出。

PRごとにスキャン実行可能

🔑

Secret Scanning

コード内のAPIキー、トークン、パスワードを自動検出。パートナープログラムで自動無効化も。

公開リポジトリは無料で有効

🛡

Dependency Review

PRで追加・変更される依存パッケージの脆弱性をマージ前にチェック。

危険な依存を事前にブロック

公開リポジトリ: Secret Scanning & Dependabot は無料
プライベートリポジトリ: GitHub Enterprise で Advanced Security ライセンスが必要
まずは無料機能から始めよう!

セキュリティチェックリスト

全ての開発者がやるべきこと

個人の設定

  • 2FAを有効化する
  • SSH鍵を使う(パスワード認証ではなく)
  • コミットに署名する
  • Personal Access Tokenに最小権限を設定
  • 不要なOAuth Appを削除

リポジトリの設定

  • .gitignoreで機密ファイルを除外
  • Branch Protectionを設定
  • Dependabotを有効化
  • Secret Scanningを有効化
  • SECURITY.mdを作成
  • シークレットはGitHub Secretsで管理

まとめ

防御

.gitignore
git-secrets

+

検出

Dependabot
Secret Scanning

+

証明

署名コミット
2FA

+

統制

Branch Protection
SECURITY.md

=

安全な開発

Secure SDLC

3つの心得

🔒

シークレットは
絶対にコミットしない

.gitignore + git-secrets

🔄

依存パッケージは
常に最新に

Dependabot + アラート

🔐

認証を強化し
本人を証明する

2FA + 署名コミット

セキュリティは「やるかやらないか」。今日から始めよう。

Appendix: コマンドリファレンス

コマンド 説明
── Secrets管理 ──
git add . 全ての変更をステージングエリアに追加
git commit -m "メッセージ" ステージングされた変更をコミット
git push origin main ローカルの変更をリモートにプッシュ
git push origin main --force リモートの履歴を強制的に上書き(履歴改変後に使用)
echo ".env" >> .gitignore .gitignoreに.envファイルの除外ルールを追加
git rm --cached .env 追跡対象から.envを削除(ファイル自体は残す)
git filter-branch --force --index-filter "..." HEAD Gitの全履歴からファイルを完全に削除
── git-secrets ──
brew install git-secrets Homebrewでgit-secretsをインストール
git secrets --install リポジトリにgit-secretsのフックを設定
git secrets --register-aws AWSキーの検出パターンを登録
git secrets --add --allowed ... 誤検知パターンをホワイトリストに追加
git secrets --list 登録済みの検出パターン一覧を表示
── 署名付きコミット ──
git config --global gpg.format ssh 署名形式をSSHに設定
git config --global user.signingkey ~/.ssh/id_ed25519.pub 署名に使うSSH公開鍵を指定
git config --global commit.gpgsign true 全てのコミットに自動署名を有効化
git config user.email コミットに使用するメールアドレスの設定・確認
git commit -m "feat: ..." 署名付きコミットを作成(gpgsign=trueの場合自動署名)
git log --show-signature -1 最新コミットの署名検証結果を表示
── Dependabot設定 (YAML) ──
.github/dependabot.yml Dependabotの設定ファイル(配置するだけで有効化)
version: 2 Dependabot設定ファイルのバージョン指定
package-ecosystem: パッケージマネージャの種類を指定(npm, pip等)
schedule: / interval: 更新チェックの頻度を指定(daily, weekly, monthly)
1 / 15