# GitHub Codespaces のセキュリティ

セキュリティを維持し、攻撃のリスクを最小限に抑えるのに役立つガイドラインを含む、 GitHub Codespaces セキュリティ アーキテクチャの概要。

## codespace のセキュリティの概要

```
          GitHub Codespaces は、セキュリティが既定で強化されるように設計されています。 その結果、ソフトウェア開発のプラクティスによって、codespace のセキュリティ体制が低下するリスクがないことを確認する必要があります。
```

このガイドでは、 GitHub Codespaces 開発環境をセキュリティで保護する方法について説明し、作業時にセキュリティを維持するのに役立つ適切なプラクティスをいくつか示します。 開発ツールと同様に、開いて作業するのは、自分が知っていて信頼できるリポジトリ内にのみする必要があることを覚えておいてください。

### 環境アイソレーション

```
          GitHub Codespaces は、独自の仮想マシンとネットワークを使用して、コードスペースを互いに分離するように設計されています。
```

#### 分離された仮想マシン

各 codespace は、独自の新しく構築された仮想マシン (VM) でホストされます。 2 つの codespace が同じ VM に併置されることはありません。

codespace は再起動するたびに、利用可能な最新のセキュリティ更新プログラムを使用して新しい VM に展開されます。

#### 分離されたネットワーク

各 codespace には、独自の分離された仮想ネットワークがあります。 ファイアウォールを使用して、インターネットからの着信接続をブロックし、内部ネットワーク上で codespace が相互に通信できないようにします。 Codespaces はインターネットへの送信接続を行うことが許可されます。

### 認証

Web ブラウザーを使用するか、 Visual Studio Codeからコード空間に接続できます。
VS Codeから接続する場合は、GitHubで認証するように求められます。

コードスペースが作成または再起動されるたびに、自動有効期限が設定された新しい GitHub トークンが割り当てられます。 この期間は、一般的な稼働日に再認証することなく codespace で作業できますが、codespace の使用を停止したときに接続が開いたままになる可能性は低くなります。

トークンのスコープは、codespace が作成されたリポジトリへのアクセス権によって異なります。

* **リポジトリへの書き込みアクセス権がある場合**: トークンのスコープはリポジトリへの読み取りおよび書き込みアクセス権になります。
* **リポジトリへの読み取りアクセス権しかない場合**: トークンは、ソース リポジトリからのコードの複製のみを許可します。 コードスペースでコミットを行うか、新しいブランチをプッシュ GitHub Codespaces 、リポジトリのフォークを自動的に作成するか、アップストリーム リポジトリ用のフォークが既にある場合はコードスペースを既存のフォークにリンクします。 トークンが更新され、フォークへの読み取りと書き込みのアクセス権が与えられます。 詳しくは、「[Codespace でソースコントロールを使用する](/ja/codespaces/developing-in-a-codespace/using-source-control-in-your-codespace#about-automatic-forking)」をご覧ください。
* **codespace に他のリポジトリへのアクセスを許可した場合**: トークンには、ソース リポジトリとアクセスを承認した他のリポジトリへの読み取りまたは読み取り/書き込みアクセス権のスコープが設定されます。 詳しくは、「[codespace 内の他のリポジトリへのアクセスの管理](/ja/codespaces/managing-your-codespaces/managing-repository-access-for-your-codespaces#authorizing-requested-permissions)」をご覧ください。

### Codespace 接続

```
          GitHub Codespaces サービスによって提供される TLS 暗号化トンネルを使用して、コードスペースに接続できます。 codespace の作成者のみが codespace に接続できます。 接続は GitHubで認証されます。
```

codespace で実行されているサービスへの外部アクセスを許可する必要がある場合は、プライベートまたはパブリック アクセスのポート フォワーディングを有効にすることができます。

### ポート転送設定

codespace 内で実行されているサービス (開発用 Web サーバーなど) に接続する必要がある場合は、インターネット上でサービスを利用できるようにポート フォワーディングを構成できます。

Organization の所有者は、転送ポートを公開し Organization 内で使用できるようにする機能を制限できます。 詳しくは、「[転送されるポートの可視性の制限](/ja/codespaces/managing-codespaces-for-your-organization/restricting-the-visibility-of-forwarded-ports)」をご覧ください。

```
          **プライベートに転送されるポート:** インターネット上でアクセスできますが、 GitHubに対する認証後にアクセスできるのは codespace 作成者だけです。

          **組織内でパブリックに転送されるポート:** インターネット上でアクセスできますが、 GitHubに対する認証後、コードスペースと同じ組織のメンバーのみがアクセスできます。

          **パブリック転送ポート**: インターネット上でアクセスでき、インターネット上のだれでもアクセスできます。 パブリック転送ポートにアクセスするための認証は必要ありません。
```

既定では、転送されたすべてのポートがプライベートです。つまり、ポートにアクセスする前に認証する必要があります。 codespace のプライベート転送ポートへのアクセスは、3 時間の有効期限を持つ認証 Cookie によって制御されます。 Cookie の有効期限が切れた場合は、再認証する必要があります。

ポートを削除して再追加したとき、または codespace を再起動する場合、パブリック転送ポートは自動的にプライベートに戻ります。

\[ポート] パネルを使用して、パブリックまたはプライベート アクセス用のポートを構成し、不要になったポート フォワーディングを停止できます。 詳しくは、「[codespace でのポートの転送](/ja/codespaces/developing-in-a-codespace/forwarding-ports-in-your-codespace)」をご覧ください。

## codespace に適したセキュリティ プラクティス

Codespaces は、既定でセキュリティ強化されるように設計されています。 この体制を維持するために、開発手順の間は適切なセキュリティ プラクティスに従うことをお勧めします。

* 開発ツールと同様に、開いて作業するのは、自分が知っていて信頼できるリポジトリ内にのみする必要があることを覚えておいてください。
* codespace に新しい依存関係を追加する前に、それらが適切に管理されているかどうか、そしてコードに見つかったセキュリティの脆弱性を修正する更新プログラムがリリースされているかどうかを確認します。

### 開発環境シークレットを使用した機密情報へのアクセス

codespace で機密情報 (アクセス トークンなど) を使用する場合は、常に開発環境シークレットを使用してください。 ターミナルからを含め、codespace 内の環境変数としてシークレットにアクセスできます。 たとえば、codespace 内でターミナルを起動し、`echo $SECRET_NAME` を使用して開発環境シークレットの値を表示できます。

シークレット値は、codespace が再開または作成されるたびに環境変数にコピーされます。また、変更されたとき、同期されます。

codespace のリポジトリに書き込む権限がない場合、開発環境シークレットは環境にコピーされません。

シークレットの詳細については、次を参照してください。

* [GitHub Codespaces のアカウント固有のシークレットの管理](/ja/codespaces/managing-your-codespaces/managing-your-account-specific-secrets-for-github-codespaces)
* [リポジトリまたは Organization の開発環境シークレットの管理](/ja/codespaces/managing-codespaces-for-your-organization/managing-development-environment-secrets-for-your-repository-or-organization)

### 他のユーザーのコントリビューションとリポジトリの操作

フォークの PR ブランチから codespace を作成する場合、codespace 内のトークンは、リポジトリがパブリックであるかプライベートであるかによって次のように異なります。

* プライベート リポジトリの場合、codespace にはフォークと親の両方へのアクセスが許可されます。
* パブリック リポジトリの場合、codespace は親のフォークとオープンの PR にのみアクセスできます。

また、これらのシナリオでは、codespace シークレットを環境に挿入しないことで、さらに保護します。 詳しくは、「[GitHub Codespaces のアカウント固有のシークレットの管理](/ja/codespaces/managing-your-codespaces/managing-your-account-specific-secrets-for-github-codespaces)」をご覧ください。

> \[!NOTE]
> codespace 内のトークンのスコープは、ユーザーが読み取りアクセス権しか持たないフォークから codespace を作成し、その codespace でコミットしたか、新しいブランチをプッシュした場合、変更される可能性があります。 このような状況では、他のリポジトリと同様に、 GitHub Codespaces 自動的に新しいフォークを作成するか、コードスペースをアカウントが所有する既存のフォークにリンクし、トークンを更新して、新しくリンクされたフォークへの読み取りと書き込みのアクセス権を持つようになりました。 詳しくは、「[Codespace でソースコントロールを使用する](/ja/codespaces/developing-in-a-codespace/using-source-control-in-your-codespace#about-automatic-forking)」をご覧ください。

```
          GitHub Codespacesコードスペースを既存のフォークにリンクする場合、この既存のフォークは、コードスペースを作成したフォークのフォーク、または共有されているアップストリームリポジトリの自分のフォークのいずれかになります。
```

### その他の優れたプラクティス

```
          GitHub Codespacesを使用する場合に注意する必要がある追加の適切なプラクティスとリスクがいくつかあります。
```

#### リポジトリの devcontainer.json ファイルについて

codespace を作成するときに、リポジトリ用に `devcontainer.json` ファイルが見つかった場合、そのファイルは解析され、codespace の構成に使用されます。
`devcontainer.json` ファイルには、サードパーティの拡張機能をインストールしたり、`postCreateCommand` で指定された任意のコードを実行したりするような、強力な機能が含まれています。

詳しくは、「[開発コンテナーの概要](/ja/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers)」をご覧ください。

#### 機能を通じたアクセス許可

特定の開発環境では、環境へのリスクが増加する可能性があります。 たとえば、コミットの署名、環境変数に挿入されたシークレット、認証済みレジストリ アクセス、パッケージ アクセスなどはすべて、セキュリティ上の問題が発生する可能性があります。 必要なユーザーにのみアクセスを許可し、可能な限り制限されたポリシーを採用することをお勧めします。

#### 拡張機能の使用

追加の VS Code 拡張機能をインストールすると、リスクが高くなる可能性があります。 このリスクを軽減するには、信頼できる拡張機能のみをインストールし、常に最新の状態に保つようにします。

#### Settings Sync を使う

```
          VS Code's Settings Sync では、悪意のある可能性のあるコンテンツがデバイス間で転送される可能性があります。 既定では、ブラウザーで開かれた codespace の Settings Sync は無効になっています。 信頼できないコンテンツを持つリポジトリの codespace を作成する場合は、ブラウザーで codespace を開き、[Settings Sync] をオフのままにする必要があります。
```

ユーザー設定で \[設定の同期] を有効にしていて、設定の変更をコードスペースから VS Codeの他のインスタンスに同期できるようにする場合は、すべてのリポジトリを信頼するのではなく、選択した信頼できるリポジトリの一覧を追加することをお勧めします。 信頼されたリポジトリから codespace を作成すると、codespaces の設定に加えた変更は、クラウドにキャッシュされた設定と同期され、そこからデバイスに転送できます。 設定の同期の管理について詳しくは、「[アカウントGitHub Codespaces のカスタマイズ](/ja/codespaces/setting-your-user-preferences/personalizing-github-codespaces-for-your-account#settings-sync)」をご覧ください。