【Git・GitHub操作ガイド】第10章 GitHubセキュリティ入門:GitHubのセキュリティ機能で脆弱性からリポジトリを守ろう!

はじめに:GitHubのセキュリティ機能で脆弱性からリポジトリを守ろう!

「自分が書いたコードは大丈夫」…そう思っていませんか?もしかしたら、利用している便利なライブラリに、ある日突然「脆弱性」という名のセキュリティホールが見つかるかもしれません。そうなると、開発した大切なアプリケーションが、いとも簡単に乗っ取られてしまう危険性も。。。

でも、安心してください!

GitHubには、そんな脅威からあなたのリポジトリ(コードの保管場所)を自動で守ってくれる、”優秀な警備システム”の機能を提供しています。これらは、リポジトリを24時間監視して、問題が見つかれば警告を発してくれます。

この記事を読めば、その中でも特に重要な機能について解説し、安全なソフトウェア開発を実現する方法を皆さんに提供します!


対象読者

  • GitHub を使い始めたばかりの方
  • ご自身の書いたコードのセキュリティに不安を感じている開発者の方
  • チーム開発でコードの安全性を高めたいと考えている方
  • GitHub が提供する無料のセキュリティ機能について手軽に知りたい方

目次


GitHubのセキュリティ機能

GitHubを守る!4人の頼れるセキュリティヒーロー

GitHubを守る。4人の頼れるセキュリティヒーロー

GitHubのセキュリティ機能は、多層的な防御を提供します。

  • Dependabot: プロジェクトで使っている外部ライブラリ(依存パッケージ)に脆弱性が見つからないか、24時間体制で見守ってくれます。もし危険が見つかれば、修正案(Pull Request)まで自動で用意してくれます。
  • Code Scanning: ソースコードそのものを静的解析し、潜在的なバグや脆弱性を、コードが実行される前に発見してくれます。
  • Secret Scanning: リポジトリの履歴チェックし、誤ってコミットしてしまったパスワードやAPIキーなどの機密情報を見つけ出し、警告してくれます。
  • Branch Protection Rules: これら全てのセキュリティチェックを強制し、「安全が確認されるまでマージさせない」というセキュリティの砦を築きます。

これらの機能を利用することで、セキュリティ対策を開発の初期段階から自動的に組み込む「シフトレフト」というベストプラクティスを、自然に実践することができます!


💡ワンポイント:シフトレフトとは? 技術者のための深掘り解説

開発サイクルの終盤、リリース直前になってから重大な脆弱性が見つかり、冷や汗をかきながら修正対応に追われた…そんな経験は筆者にもあります。。。

「シフトレフト」とは、こうした「手戻り」という名の悪夢を避けるための、極めて実践的な考え方となります。ぜひ、理解しましょう!

開発工程を設計→実装→テスト→リリースの流れで捉えたとき、従来はテスト工程で行っていたセキュリティチェックや品質保証を、もっと早い段階、開発者のコーディング中やコミット時 にシフトさせることを指します。

これは、品質とセキュリティを、開発者自身が日々の開発業務のプロセスに組み込む開発スタイルです。

なんで、これがエンジニアにとって重要なの?

  • コスト削減: コーディング中にツールが指摘を修正するのは数分です。でも、リリース後に同じ問題が発覚すると、原因調査、影響範囲の特定、修正、テスト、再デプロイ…と、数日〜数週間の時間を奪われます。その間にも、本来やれるはずだった開発が止まってしまいます。。。シフトレフトは、この無駄な時間とストレス軽減することができます。
  • 本質的な開発への集中: レビューでセキュリティに関する機械的な指摘が減り、ロジックやアーキテクチャといった、より人間でないとできない本質的な開発に時間を使えるようになります。
  • 自身の市場価値向上: シフトレフトを実践し、安全なコードを当たり前に書けるエンジニアは、市場から高く評価されます。

このように、シフトレフトは、誰かに「やらされる」面倒な作業ではなく、未来の自分を助け、チーム全体の生産性を向上させるための賢い投資なのです。


セキュリティ機能比較サマリー(料金・対象リポジトリ)

まずは、GitHubのセキュリティ機能がどのリポジトリで、どのような料金体系で利用できるのかを整理しておきます。
今回紹介する4つの機能の概要と料金体系は、以下の通りです。

機能名概要パブリックリポジトリプライベートリポジトリ主なコスト要素
Dependabot依存ライブラリの脆弱性を検知し、修正PRを自動作成します。無料無料基本的に無料です。
Code Scanningソースコード自体の脆弱性を静的解析(SAST)で発見します。無料⚠️ GHASが必要GitHub Advanced Security (GHAS) のライセンス費用が発生します。
Secret Scanningリポジトリ内のパスワードやAPIキーなどの機密情報を検知します。無料⚠️ GHASが必要GitHub Advanced Security (GHAS) のライセンス費用が発生します。
Branch Protection Rules特定ブランチへのマージに関して、品質やセキュリティのルールを強制します。無料⚠️ Proプラン以上一部の高度な機能(例:必須レビュー)は有料プランが必要です。

凡例:

  • 無料: 追加費用なしで利用できます。
  • ⚠️ GHASが必要: 有料の GitHub Advanced Security ライセンスが必要です。
  • ⚠️ Proプラン以上: 無料プランでは利用できず、有料プラン(Pro, Team, Enterprise)へのアップグレードが必要です。

最新の料金体系や各プランの無料枠については、必ず以下の公式ページで確認してください。

  • GitHub のプランと料金
  • https://github.com/pricing – Free、Team、Enterpriseの各プランの詳細な機能、無料枠、料金を確認できます。
  • GitHub Advanced Security について
  • # GitHub Advanced Security について – 機能概要です。パブリックリポジトリでは無料。プライベートリポジトリでは、Enterpriseプランに含まれるか、Teamプランのアドオンとして利用できます。

GitHub Advanced Security (GHAS) とは?
Code ScanningやSecret Scanning(プライベートリポジトリ向け)などの高度なセキュリティ機能を含む、有料のセキュリティ製品群です。主に企業向けのEnterpriseプランに含まれていますが、アドオンとしても購入できます。


各機能の目的と利用手順

1. Dependabot:依存関係の自動メンテナンス

目的:

プロジェクトが利用するライブラリ(依存関係)を常に安全で最新の状態に保つための機能です。以下の2つの主要な役割を担います。

  • 脆弱性スキャン (Dependabot alerts): 利用しているライブラリに既知の脆弱性が発見された場合に即座に通知します。さらに、その脆弱性を修正するバージョンへの更新PRを自動で作成してくれます。
  • バージョンアップ (Dependabot version updates): 脆弱性の有無にかかわらず、ライブラリの新しいバージョンがリリースされた際に、更新PRを自動で作成します。これにより、技術的負債の蓄積を防ぎます。

具体的な使い方(個人リポジトリ):

  1. 基本的な有効化:
    • リポジトリの 「Settings」 > 「Advanced Security」 を開きます。
    • [Dependabot alerts] を有効にすると、脆弱性のスキャンと通知が始まります。
    • [Dependabot security updates] を有効にすると、脆弱性修正PRが自動で作成されます。
Dependabotの設定
  1. 高度なカスタマイズ (.github/dependabot.yml):
    バージョンアップの挙動を細かく制御したい場合は、.github/dependabot.yml ファイルを作成します。これにより、PRの氾濫を防ぎ、運用に合わせた自動化が実現できます。
# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "npm" # npmパッケージを対象
    directory: "/" # package.jsonがあるディレクトリ
    schedule:
      interval: "weekly" # 週に一度チェック
    # 特定のライブラリの更新を無視する
    ignore:
      - dependency-name: "react"
        versions: ["18.x"] # Reactのv18系は無視
    # PRに自動でレビュアーを設定
    reviewers:
      - "my-org/my-reviewer-team"
    # 複数の更新を1つのPRにまとめる
    groups:
      production-dependencies:
        dependency-type: "production"

ここがすごい!:

Dependabotが作成するPRには、ライブラリのリリースノートや互換性スコアが含まれており、安全な更新作業を強力にサポートします。.github/dependabot.yml を使えば、「特定のライブラリは更新しない」「PRの数を制限する」といった、プロジェクトごとの細かい要望にも応えられます。


🔗公式ドキュメント


2. Code Scanning:コードの静的解析(SAST)


💡ワンポイント:静的解析(SAST)とは?
SASTは “Static Application Security Testing” の略です。プログラムを実行せずにソースコードそのものを分析し、潜在的なバグや脆弱性のパターンを見つけ出す手法を指します。「静的」という言葉通り、コードが動いていない状態で検査するのが特徴です。


目的:

開発者が書いたコードを分析し、SQLインジェクションやクロスサイトスクリプティング(XSS)といった、代表的なセキュリティ上の欠陥やバグのパターンをコードがマージされる前に検出します。問題のあるコードがメインブランチに混入するのを防ぐ、品質ゲートキーパーの役割を果たします。

具体的な使い方:

  1. 基本的な有効化:
  • リポジトリの 「Security」 > 「Advanced Security」> 「Code scanning」 から 「Set up」 をクリックします。
  • 「CodeQL Analysis」 の 「Default」 を選択すると、GitHubがリポジトリ内の言語を自動検出し、設定してくれます。通常はこれを設定するだけで完了です。
Code scanningの設定
  1. アラートの管理:
  • 脆弱性が検知されると、PR上と 「Security」タブの 「Code scanning」 にアラートが表示されます。
  • アラート詳細では、脆弱性の解説や修正方法のヒント、さらにデータがどのように流れて脆弱性を引き起こすかを確認できます。

🔗公式ドキュメント


3. Secret Scanning:機密情報の漏洩防止

目的:

リポジトリのGit履歴全体をスキャンし、誤ってコミットされたGitHubトークンやクラウドサービスのAPIキーなどの機密情報を検知します。
さらに、Push Protection(プッシュ保護) を有効にすることで、そもそも機密情報がリモートリポジトリにプッシュされるのを未然にブロックし、情報漏洩を根本から防ぎます。

具体的な使い方:

  1. 有効化とプッシュ保護:
  • リポジトリの 「Settings」 > 「Advanced Security」 を開きます。
  • 「Secret scanning」 を有効にします(パブリックリポジトリではデフォルトで有効)。
  • 「Push protection」 を有効にします(パブリックリポジトリではデフォルトで有効)。
Secret Protectionの設定
  • これにより、シークレットを含む git push がサーバー側で拒否されるようになります。
  1. カスタムパターンの追加 (Organization向け):
  • Organization設定から、正規表現を使ってプロジェクト固有のキー形式などをカスタムパターンとして登録できます。これにより、標準では検知できない独自の機密情報もスキャン対象にできます。
  1. 検知後の対応フロー:
  • プッシュがブロックされた場合: ターミナルに表示された指示に従い、ローカルのコミットから機密情報を削除し、履歴を修正してから再度プッシュします。
  • アラートが通知された場合:
    1. 即時無効化: まず、漏洩したキーやトークンをサービス提供元の管理画面で直ちに無効化(Revoke)します。
    2. 履歴からの完全削除: git filter-repo などのツールを使い、Gitのコミット履歴から機密情報を完全に削除します。単に修正コミットを追加するだけでは、過去の履歴に情報が残り続けるため不十分です。

filter-repo等Gitの履歴操作については、以下の記事で詳細に解説していますので、是非ご覧ください。


🔗公式ドキュメント


4. Branch Protection + Required Checks:セキュリティルールの強制

目的:

ブランチ保護ルール」を、セキュリティの観点からさらに強化します。mainブランチなどに、「Dependabotの警告がないこと」「Code Scanningが成功すること」などをマージの必須条件として設定できます。

利用手順(例):

  1. 「Settings」>「Rulesets」で、ブランチの保護ルールを編集します。
  2. 「Require status checks to pass」を有効にします。追加したいチェック(例:Dependabotのチェック)を「Add checks」ボタンで追加します。
Require status checks to passの設定
  1. 「Require code scanning results」を有効にします。必須としたいチェック項目を検索して選択します。(デフォルトでCodeQLが設定されています)
Require code scanning resultsの設定

効果:

これにより、セキュリティチェックをパスしないコードが、プロジェクトのmainブランチに混入することを防ぎ、開発プロセス全体の安全性が向上します。


🔗公式ドキュメント


参考資料


まとめ:今日から始めるセキュリティ対策

GitHubのセキュリティ機能は、あなたのコードを守るための強力な味方です。しかも、その多くが無料で、数クリックで有効にできます。

この記事を読み終えた今が、行動を起こす絶好のチャンスです。さっそく、ご自身のGitHubリポジトリを開き、「Settings」タブから「Advanced Security」を覗いてみましょう。まずは一番手軽な「Dependabot alerts」を有効にすることから始めてみませんか?

たった数分の設定が、未来の大きなセキュリティ事故を防ぎます。安全なコードを書くことは、信頼される開発者になるための第一歩。ぜひ今日から、セキュアな開発環境の構築を始めてください!

今回学んだこと

  • GitHubのセキュリティ機能の重要性:便利なライブラリにも脆弱性が潜んでいること。
  • Dependabot:依存関係の脆弱性を自動で検知・修正してくれる”執事”。
  • Code Scanning:ソースコード自体の問題を早期に発見してくれる”探偵”。
  • Secret Scanning:コミットに紛れたパスワードなどを見つけ出す”見張り番”。
  • Branch Protection:セキュリティチェックを強制し、安全を担保する”鉄壁の門”。

皆さんは、この記事を読んでどのセキュリティ機能を有効にしてみましたか?あるいは、他にどんな対策をしていますか?ぜひコメントで教えてください!

さあ、あなたのMacを快適な開発環境にしましょう!!

SNSでもご購読できます。

コメントを残す

*