GitHub Copilotへリポジトリを渡す範囲で迷う時

プロジェクトの途中でGitHub Copilotの導入を決めたとき、最初に止まってしまうのが「このリポジトリ、Copilotにどこまで見せて大丈夫か」という問いです。まだ有効化ボタンを押す前の段階で、コード補完の精度やチャットの応答に期待する気持ちと、社内仕様や顧客データを含むコードを外部に渡すことへの不安がせめぎ合います。

実際にCopilotを有効にして数日が経過すると、想定していなかったファイルまで補完の文脈に含まれているように感じたり、チャット機能で過去のコミット内容が参照されているように見えたりして、慌てて設定を見直すケースは少なくありません。問題が起きてから後悔する前に、Copilotがコードをどのように扱い、何が送信され、どの範囲を遮断できるのかを時系列で整理しておくことが、安全な運用の第一歩です。

有効化前:Copilotが参照する情報の範囲を把握する

GitHub CopilotをIDEにインストールし、リポジトリを開いて最初の提案が表示されるまでの間に、ユーザーが意識しておくべきデータの流れが存在します。公式ドキュメントによれば、Copilotはエディターで開いているファイルの内容と、関連するタブで開かれているファイルの一部を入力として利用します。加えて、GitHub Copilot Chatを使う場合には、チャットの入力内容や選択したコードスニペットが処理の対象になります。

ここでよくある誤解が、「リポジトリ全体が自動的にGitHubのサーバーへ送信されているのではないか」というものです。実際には、Copilotは開いているファイルと、エディターが「関連がある」と判断した周辺ファイルの一部を文脈として送信しますが、リポジトリ全体を無差別にアップロードする設計にはなっていません。この仕組みは、公式ドキュメントで「GitHub Copilot transmits contextual information from your IDE to the GitHub Copilot service」と説明されている範囲に限られます。

しかし、Copilot Chatで明示的にファイルやリポジトリ全体を質問の文脈に含めた場合は話が変わります。有効化直後からこのような使い方を始める前に、どのファイルをCopilotの文脈に含めるべきか、組織としての基準を決めておくことが重要です。

コード補完が生成される仕組みと注意点

Copilotのコード補完は、コメントや関数名、周辺のコードをもとに、次に書くべきコードをリアルタイムで提案します。このとき、エディター上でアクティブなファイルと、同じウィンドウで開いている他のファイルの一部が、提案生成のためのコンテキストとしてGitHub Copilotサービスに送信されます。送信されるデータには、ファイルの内容だけでなく、ファイルのパスや拡張子、カーソル位置などのメタデータも含まれる可能性があります。

ここで気をつけたいのは、`.env` ファイルや設定ファイルにハードコードされたAPIキー、データベース接続文字列などが、意図せずコンテキストに混入するリスクです。Copilotはファイルの種類を自動的に判断して送信を制限する機能を備えていますが、すべてのケースで完全にブロックされる保証はありません。そのため、機密性の高いファイルは最初からCopilotのスキャン対象から外す設定を検討する必要があります。

使用中:補完に社内固有のロジックが現れたときの対処

Copilotを使い始めてしばらく経ち、開発スピードが上がってきたと感じる頃に、ふと違和感を覚える瞬間が訪れます。それは、Copilotが提案するコードに、明らかに社内の別プロジェクトでしか使われていないはずの関数名や、内部APIのエンドポイントが含まれているのを見つけたときです。このような場面では、「Copilotがリポジトリを超えて学習しているのでは」という疑念が生まれます。

実際のところ、GitHub Copilotはパブリックリポジトリのコードをもとに学習されたモデルを利用しています。そのため、提案されるコードにはオープンソースプロジェクトでよく見られるパターンが反映されることがあります。しかし、社内のプライベートリポジトリのコードが他のユーザーの提案に使われることは、EnterpriseプランやBusinessプランにおいてはポリシー上禁止されています。この点は、GitHubの[プランおよび価格に関するページ](https://github.com/features/copilot/plans?locale=ja)でも、データ保護に関する記述として確認できます。

とはいえ、Copilotが提案するコードに、自社のプライベートリポジトリの一部と酷似したコードが現れた場合、原因として考えられるのは次の二つです。一つは、同じ開発者が複数のプロジェクトでCopilotを使っており、その開発者のコーディングスタイルやよく使うパターンをCopilotが学習し、提案に反映しているケース。もう一つは、Copilot Chatで過去に質問した内容や、IDE上で開いていたファイルの情報が、短期的なコンテキストとして保持され、後の提案に影響を与えているケースです。

この現象自体は、必ずしも情報漏えいを意味するものではありませんが、組織のセキュリティポリシーによっては「意図しない共有」と見なされる可能性があります。したがって、Copilotの使用を開始する前に、社内のセキュリティチームと「どのような情報がCopilotに渡るのか」「提案されたコードに社内情報が含まれていた場合の対処手順」を共有しておくことが、後々のトラブルを防ぐ鍵になります。

シークレット漏洩の兆候を見逃さない

Copilotが生成したコードの中に、AWSのアクセスキーやGitHubのパーソナルアクセストークンのようなパターンが現れたら、それは単なる偶然の一致ではなく、学習データに含まれていたシークレットが提案された可能性があります。GitHubはCopilotにシークレット検出機能を組み込んでおり、提案の段階で既知のシークレットパターンにマッチする文字列をフィルタリングしますが、完全ではありません。

より深刻なのは、ユーザー自身がシークレットをコードに埋め込んだ状態でCopilotを使い続け、そのコードがコンテキストとして送信され続けるケースです。この状態が続くと、Copilotがそのシークレットを「よく使われる文字列」として学習し、別の場所で誤って提案するリスクが高まります。実際、2025年にはGitHub Copilot Chatに関する脆弱性(CVE-2025-53773やCVE-2025-59145)が報告されており、適切な設定なしに使用するとプライベートリポジトリのデータが流出する可能性が指摘されました。これらの脆弱性はすでにパッチが適用されていますが、根本的な対策として、シークレットをコードから排除する運用が欠かせません。

再現テスト:どのファイルがCopilotに読まれているかを確認する

疑わしい提案が一度発生したら、次に取るべき行動は「再現テスト」です。実際にどのファイルがCopilotの文脈に含まれているのかを、開発者自身が確認する手順を確立しておくと、漠然とした不安を具体的な設定変更につなげられます。

まず、テスト用のリポジトリを用意し、機密情報を模したダミーデータを含むファイルを作成します。このとき、ファイル名や拡張子は実際のプロジェクトで使っているものに近づけてください。次に、そのリポジトリをCopilotが有効なエディターで開き、ダミーデータとは無関係なコードを記述します。この状態でCopilotがダミーデータの内容を提案してくるかどうかを観察します。もし提案された場合、そのファイルがCopilotのコンテキストに含まれている可能性が高いと判断できます。

このテストは、`.gitignore` や `.copilotignore` ファイルの設定が正しく機能しているかを検証するのにも有効です。GitHub Copilotは、`.gitignore` に記載されたファイルを自動的にコンテキストから除外するわけではありません。そのため、Copilot専用の除外設定ファイルである `.copilotignore` をプロジェクトのルートに配置し、明示的に除外したいファイルやディレクトリを指定する必要があります。テストの結果、除外設定が効いていないようであれば、`.copilotignore` の記述ミスや配置場所を再確認します。

チャット機能での文脈の広がりをテストする

Copilot Chatを使った場合、意図せず広範囲のコードが文脈として渡されることがあります。チャットで「このプロジェクトの認証フローを説明して」と質問すると、Copilotは関連するファイルを自動的に検索し、その内容をコンテキストに含めようとします。この機能は便利ですが、機密性の高いファイルまで検索対象になるリスクを伴います。

テストでは、機密情報を含むファイルをチャットの参照対象から外す設定が有効かどうかを確認します。具体的には、Copilot Chatの設定で「Use linked code references」や「Search repositories」といったオプションのオン・オフを切り替え、意図した範囲だけが参照されるかを検証します。

サポート判断:EnterpriseプランとBusinessプランで何が変わるのか

再現テストの結果、Copilotに渡したくないファイルがどうしてもコンテキストに含まれてしまう場合や、より強固なデータ保護が必要な場合は、利用プランの見直しが次の判断ポイントになります。GitHub Copilotには、Free、Pro、Business、Enterpriseの各プランが存在し、データの取り扱いに関するポリシーが大きく異なります。

FreeプランやProプランでは、コードスニペットの収集をオプトアウトできる設定が提供されていますが、組織全体での一元管理はできません。一方、Businessプランでは、組織のオーナーがメンバー全員のコードスニペット収集を無効化したり、特定のリポジトリへのCopilotのアクセスを制限したりするポリシーを設定できます。Enterpriseプランではさらに、IPアドレス制限や監査ログの取得、厳格なデータ保持ポリシーの適用が可能です。

特に、Enterpriseプランでは「Copilotが学習のためにユーザーのコードを使用しない」ことが明示されており、[公式ドキュメント](https://docs.github.com/ja/copilot/reference/copilot-billing/models-and-pricing)でもプランごとのデータ保護の違いが説明されています。社内のセキュリティ要件が厳しい場合や、顧客データを扱うプロジェクトでは、Enterpriseプランの導入を前提に検討を進めるのが安全です。

組織のポリシー設定で確認すべき項目

管理者がGitHubの組織設定で確認すべき項目は以下の通りです。

  • コードスニペットの収集: 組織全体で無効化できるか
  • Copilotの利用制限: 特定のリポジトリやチームに対してCopilotを無効化できるか
  • IP許可リスト: Enterpriseプランで利用可能な、接続元IPアドレスによるアクセス制限
  • 監査ログ: Copilotの使用状況や設定変更の履歴を追跡できるか
  • データ保持期間: Copilotに送信されたデータがどのくらいの期間保持されるか

これらの設定を事前に確認し、必要に応じて有効化しておくことで、Copilot導入後の「想定外のデータ共有」を防ぐことができます。

安全に使い続けるための運用ルールと日常のチェックポイント

Copilotの利用が日常化すると、当初は慎重だった開発者も、徐々に便利さに流されて機密情報の扱いがルーズになりがちです。そこで、チームとして定期的に確認すべき運用ルールをあらかじめ決めておくことが重要です。

まず、リポジトリにシークレットが含まれていないかを自動チェックする仕組みを導入します。GitHubのシークレットスキャニング機能や、pre-commitフックを使って、コミット前にAPIキーやトークンが含まれていないかを検出するように設定します。これにより、Copilotがシークレットを学習するリスクを低減できます。

次に、Copilot Chatの利用ガイドラインを策定します。また、チャットで生成されたコードを本番環境に直接適用する前に、必ずコードレビューを実施するプロセスを徹底します。

さらに、Copilotの提案を鵜呑みにしない文化を醸成することも、セキュリティ対策の一環です。Copilotが提案するコードには、古いバージョンのライブラリを使用していたり、既知の脆弱性を含むパターンが含まれていたりする可能性があります。提案を受け入れる前に、そのコードが本当に安全かどうかを確認する習慣をチーム全体に根付かせることが、長期的な安全性につながります。

ファイル除外の設定手順

具体的な設定手順として、以下の方法でCopilotの参照範囲を制限できます。

1. リポジトリのルートに `.copilotignore` ファイルを作成する

2. このファイルに、除外したいファイルやディレクトリのパスを `.gitignore` と同様の形式で記述する

3. IDEを再起動するか、Copilotの設定をリロードする

4. 必要に応じて、エディターの設定(例: VS Codeの `settings.json`)で `"github.copilot.advanced": { "localHistory": false }` のように、ローカル履歴の保持を無効化する

これらの設定は、プロジェクトごとに適用できるため、特に機密性の高いリポジトリでは必須の対策と言えます。

次に再発した時に記録する項目

Copilotに関するインシデントが発生した場合、原因の特定と再発防止のために、最低限「どのファイルがコンテキストに含まれていたか」「そのファイルを除外する設定は有効だったか」「使用していたCopilotのプランとバージョン」「問題が発生した日時と操作内容」を記録に残すことを習慣づけてください。

コメント

タイトルとURLをコピーしました