codespace のセキュリティの概要
GitHub Codespaces は、既定でセキュリティ強化されるように設計されています。 その結果、ソフトウェア開発のプラクティスによって、codespace のセキュリティ体制が低下するリスクがないことを確認する必要があります。
このガイドでは、GitHub Codespaces を使って開発環境をセキュリティで保護された状態に保つ方法について説明し、作業中のセキュリティの維持に役立つ優れたプラクティスを紹介します。 開発ツールと同様に、開いて作業するのは、自分が知っていて信頼できるリポジトリ内にのみする必要があることを覚えておいてください。
環境の分離
GitHub Codespaces は、独自の仮想マシンとネットワークを使用して、codespace を互いに分離するように設計されています。
分離された仮想マシン
各 codespace は、独自の新しく構築された仮想マシン (VM) でホストされます。 2 つの codespace が同じ VM に併置されることはありません。
codespace は再起動するたびに、利用可能な最新のセキュリティ更新プログラムを使用して新しい VM に展開されます。
分離されたネットワーク
各 codespace には、独自の分離された仮想ネットワークがあります。 ファイアウォールを使用して、インターネットからの着信接続をブロックし、内部ネットワーク上で codespace が相互に通信できないようにします。 Codespaces はインターネットへの送信接続を行うことが許可されます。
認証
Web ブラウザーを使用するか、Visual Studio Code から codespace に接続できます。 VS Code から接続する場合は、GitHub で認証するように求められます。
codespace が作成または再起動されるたびに、自動有効期限が設定された新しい GitHub トークンが割り当てられます。 この期間は、一般的な稼働日に再認証することなく codespace で作業できますが、codespace の使用を停止したときに接続が開いたままになる可能性は低くなります。
トークンのスコープは、codespace が作成されたリポジトリへのアクセス権によって異なります。
- リポジトリへの書き込みアクセス権がある場合: トークンのスコープはリポジトリへの読み取りおよび書き込みアクセス権になります。
- リポジトリへの読み取りアクセス権しかない場合: トークンは、ソース リポジトリからのコードの複製のみを許可します。 codespace でコミットすると、GitHub Codespaces によってリポジトリのフォークが自動的に作成されるか、アップストリーム リポジトリ用のフォークが既にある場合は codespace が既存のフォークにリンクされます。 トークンが更新され、フォークへの読み取りと書き込みのアクセス権が与えられます。 詳しくは、「Codespace でソースコントロールを使用する」を参照してください。
- codespace に他のリポジトリへのアクセスを許可した場合: トークンには、ソース リポジトリとアクセスを承認した他のリポジトリへの読み取りまたは読み取り/書き込みアクセス権のスコープが設定されます。 詳しくは、「codespace 内の他のリポジトリへのアクセスの管理」を参照してください。
codespace の接続
GitHub Codespaces サービスによって提供される TLS 暗号化トンネルを使用して、codespace に接続できます。 codespace の作成者のみが codespace に接続できます。 接続は、GitHub で認証されます。
codespace で実行されているサービスへの外部アクセスを許可する必要がある場合は、プライベートまたはパブリック アクセスのポート フォワーディングを有効にすることができます。
ポート フォワーディング
codespace 内で実行されているサービス (開発用 Web サーバーなど) に接続する必要がある場合は、インターネット上でサービスを利用できるようにポート フォワーディングを構成できます。
組織の所有者は、転送ポートを公開し組織内で使用できるようにする機能を制限できます。 詳しくは、「転送されるポートの可視性の制限」を参照してください。
プライベート転送ポート: インターネット上でアクセスできますが、GitHub での認証後は、codespace の作成者のみがアクセスできます。
Organization 内のパブリック転送ポート: インターネット上でアクセスできますが、GitHub での認証後は、codespace と同じ Organization のメンバーのみがアクセスできます。
パブリック転送ポート: インターネット上でアクセスでき、インターネット上のだれでもアクセスできます。 パブリック転送ポートにアクセスするための認証は必要ありません。
既定では、転送されたすべてのポートがプライベートです。つまり、ポートにアクセスする前に認証する必要があります。 codespace のプライベート転送ポートへのアクセスは、3 時間の有効期限を持つ認証 Cookie によって制御されます。 Cookie の有効期限が切れた場合は、再認証する必要があります。
ポートを削除して再追加したとき、または codespace を再起動する場合、パブリック転送ポートは自動的にプライベートに戻ります。
[ポート] パネルを使用して、パブリックまたはプライベート アクセス用のポートを構成し、不要になったポート フォワーディングを停止できます。 詳しくは、「codespace でのポートの転送」を参照してください。
codespace に適したセキュリティ プラクティス
Codespaces は、既定でセキュリティ強化されるように設計されています。 この体制を維持するために、開発手順の間は適切なセキュリティ プラクティスに従うことをお勧めします。
- 開発ツールと同様に、開いて作業するのは、自分が知っていて信頼できるリポジトリ内にのみする必要があることを覚えておいてください。
- codespace に新しい依存関係を追加する前に、それらが適切に管理されているかどうか、そしてコードに見つかったセキュリティの脆弱性を修正する更新プログラムがリリースされているかどうかを確認します。
開発環境シークレットを使用した機密情報へのアクセス
codespace で機密情報 (アクセス トークンなど) を使用する場合は、常に開発環境シークレットを使用してください。 ターミナルからを含め、codespace 内の環境変数としてシークレットにアクセスできます。 たとえば、codespace 内でターミナルを起動し、echo $SECRET_NAME
を使用して開発環境シークレットの値を表示できます。
シークレット値は、codespace が再開または作成されるたびに環境変数にコピーされます。また、変更されたとき、同期されます。
codespace のリポジトリに書き込む権限がない場合、開発環境シークレットは環境にコピーされません。
シークレットの詳細については、次を参照してください。
他のユーザーのコントリビューションとリポジトリの操作
フォークの PR ブランチから codespace を作成する場合、codespace 内のトークンは、リポジトリがパブリックであるかプライベートであるかによって次のように異なります。
- プライベート リポジトリの場合、codespace にはフォークと親の両方へのアクセスが許可されます。
- パブリック リポジトリの場合、codespace は親のフォークとオープンの PR にのみアクセスできます。
また、これらのシナリオでは、codespace シークレットを環境に挿入しないことで、さらに保護します。 詳しくは、「GitHub Codespaces のアカウント固有のシークレットの管理」を参照してください。
注記: codespace 内のトークンのスコープは、ユーザーが読み取りアクセス権しか持たないフォークから codespace を作成し、その codespace でコミットしたか、新しいブランチをプッシュした場合、変更される可能性があります。 この状況では、他のリポジトリと同様に、GitHub Codespaces は、新しいフォークを自動的に作成するか、ユーザーのアカウントによって所有されている既存のフォークに codespace をリンクし、新しくリンクされたフォークへの読み取りと書き込みのアクセス権を持つようにトークンを更新します。 詳しくは、「Codespace でソースコントロールを使用する」を参照してください。
GitHub Codespaces が codespace を既存のフォークにリンクするとき、この既存のフォークとしては、codespace の作成元になったフォークのフォーク、または共有アップストリーム リポジトリの独自のフォークを使用できます。
その他の優れたプラクティス
優れたプラクティスや、GitHub Codespaces を使う場合に注意が必要なリスクは他にもあります。
リポジトリの devcontainer.json ファイルについて
codespace を作成するときに、リポジトリ用に devcontainer.json
ファイルが見つかった場合、そのファイルは解析され、codespace の構成に使用されます。 devcontainer.json
ファイルには、サードパーティの拡張機能をインストールしたり、postCreateCommand
で指定された任意のコードを実行したりするような、強力な機能が含まれています。
詳しくは、「開発コンテナーの概要」を参照してください。
機能を使用したアクセスの許可
特定の開発環境では、環境へのリスクが増加する可能性があります。 たとえば、コミットの署名、環境変数に挿入されたシークレット、認証済みレジストリ アクセス、パッケージ アクセスなどはすべて、セキュリティ上の問題が発生する可能性があります。 必要なユーザーにのみアクセスを許可し、可能な限り制限されたポリシーを採用することをお勧めします。
拡張機能の使用
追加の VS Code 拡張機能をインストールすると、より多くのリスクが発生する可能性があります。 このリスクを軽減するには、信頼できる拡張機能のみをインストールし、常に最新の状態に保つようにします。
Settings Sync を使う
VS Code の Settings Sync を使うと、潜在的に悪意のあるコンテンツがデバイス間で転送されます。 既定では、ブラウザーで開かれた codespace の Settings Sync は無効になっています。 信頼できないコンテンツを持つリポジトリの codespace を作成する場合は、ブラウザーで codespace を開き、[Settings Sync] をオフのままにする必要があります。
ユーザー設定で [Settings Sync] を有効にしていて、設定を変更して codespaces から VS Code の他のインスタンスに同期できるようにする場合は、すべてのリポジトリを信頼するのではなく、信頼されたリポジトリの選択リストを追加することをお勧めします。 信頼されたリポジトリから codespace を作成すると、codespaces の設定に加えた変更は、クラウドにキャッシュされた設定と同期され、そこからデバイスに転送できます。 Settings Sync の管理について詳しくは、「アカウントの GitHub Codespaces をパーソナライズする」を参照してください。