# ビルド システムをセキュリティで保護するためのベスト プラクティス

サプライ チェーンの終端を保護する方法 (成果物の構築と配布に使用するシステム) に関するガイダンス。

## このガイドについて

このガイドでは、ビルド システムのセキュリティを向上させるために加えられる最も影響が大きい変更について説明します。 各セクションで、セキュリティを向上させるためにプロセスに対して行うことができる変更の概要を示します。 変更は影響が大きい順に示されます。

## リスクとは

ソフトウェア サプライ チェーンに対する攻撃の一部は、ビルド システムを直接対象とします。 攻撃者がビルド プロセスを変更できる場合は、個人アカウントやコードを侵害することなく、システムを悪用するおそれがあります。 ビルド システムだけでなく、個人のアカウントやコードも忘れずに保護することが重要です。

## ビルド システムのセキュリティによる保護

ビルド システムに必要なセキュリティ機能がいくつかあります。

1. ビルドの手順は明確で繰り返すことができる必要があります。

2. ビルド プロセス中に何が実行されていたかを正確に把握する必要があります。

3. 各ビルドは新しい環境で開始する必要があるため、侵害されたビルドは今後のビルドに影響を与えることはありません。

   ```
          GitHub Actions は、これらの機能を満たすのに役立ちます。 ビルド手順は、コードと共にリポジトリに格納されます。 ご自分でホストする Windows、Mac、Linux、ランナーなど、ビルドを実行する環境を選びます。 各ビルドは新しいランナー イメージから始まり、ビルド環境に攻撃が持続することは困難になります。
   ```

セキュリティ上の利点に加えて、 GitHub Actions では、頻繁かつ高速なビルドのために、手動、定期的、またはリポジトリ内の git イベントでビルドをトリガーできます。

```
          GitHub Actionsは大きなトピックですが、[AUTOTITLE](/actions/learn-github-actions/understanding-github-actions)、[AUTOTITLE](/actions/using-workflows/workflow-syntax-for-github-actions#choosing-github-hosted-runners)、および[AUTOTITLE](/actions/using-workflows/triggering-a-workflow)が入門に適しています。
```

## ビルドのアーティファクト構成証明を生成する

構成証明を使用することで、ビルドするソフトウェアに対して検証不可能な証明と整合性の保証を作成できます。 さらに、ソフトウェアを使用するユーザーは、ソフトウェアがビルドされた場所と方法の確認ができます。

ソフトウェアで成果物の構成証明を生成する場合は、ビルドの実績を確立し、次の情報など暗号署名付き要求を作成します。

* 成果物に関連付けられているワークフローへのリンク
* 成果物のリポジトリ、organization、環境、コミット SHA、トリガー イベント
* 証明の確立に使用する OIDC トークンからのその他の情報。 詳しくは、「[OpenID Connect](/ja/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)」をご覧ください。

関連するソフトウェア部品表 (SBOM) を含む構成証明を生成することもできます。 ビルドを、その中で使用されるオープンソースの依存関係の一覧に関連付けることで、透明性は提供され、コンシューマーがデータ保護標準に準拠できるようになります。

アーティファクト構成署名には、ビルド アーティファクトへの署名、ソース コードへのリンク、ビルド手順が含まれます。 アーティファクト構成証明を使用してビルドに署名する場合、独自の署名キー マテリアルを管理する必要はありません。
GitHub は、Microsoft が運用する署名機関でこれを処理します。

詳しくは、「[アーティファクトの構成証明を使用してビルドの出所を確立する](/ja/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds)」をご覧ください。

## ビルドに署名する

ビルド プロセスがセキュリティで保護されたら、誰かがビルド プロセスの最終的な結果を改ざんできないようにする必要があります。 これを行う優れた方法は、ビルドに署名することです。 ソフトウェアをパブリックに配布する場合、多くの場合、公開/秘密の暗号化キー ペアで行われます。 秘密キーを使用してビルドに署名し、公開キーを公開して、ソフトウェアのユーザーがビルドの署名を使用する前に確認できるようにします。 ビルドのバイトが変更された場合、署名は検証されません。

ビルドに正確に署名する方法は、記述しているコードの種類とユーザーによって異なります。 多くの場合、秘密キーを安全に格納する方法を知ることは困難です。 ここでの基本的なオプションの 1 つは、暗号化されたシークレット GitHub Actions 使用することですが、それらの GitHub Actions ワークフローにアクセスできるユーザーを制限するように注意する必要があります。
公開インターネット (Microsoft Azure、HashiCorp Vault など) 経由でアクセスできる別のシステムに秘密キーが格納されている場合、より高度なオプションは OpenID Connect で認証するため、システム間でシークレットを共有する必要はありません。 秘密キーにプライベート ネットワークからのみアクセスできる場合は、 GitHub Actionsにセルフホステッド ランナーを使用することもできます。

詳細については、「 [GitHub Actions でのシークレットの使用](/ja/actions/security-guides/encrypted-secrets)、 [OpenID Connect](/ja/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)、 、 [セルフホステッド ランナー](/ja/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners)」を参照してください。

## 変更不可リリースを使用する

ビルド システムで他のプロジェクトのリリース アセットを使用する場合、または独自の作業用のリリースを作成する場合は、それらのリリースを変更不可にして、つまり発行後に変更できないようにして、セキュリティ リスクを軽減する必要があります。 変更不可リリースは、サプライ チェーン攻撃や偶発的な破壊的変更を防ぐのに役立ちます。 詳しくは、「[変更不可リリース](/ja/code-security/supply-chain-security/understanding-your-software-supply-chain/immutable-releases)」をご覧ください。

## セキュリティを強化する GitHub Actions

```
          GitHub Actionsをさらにセキュリティで保護するには、さらに多くの手順を実行できます。 特に、サードパーティのワークフローを評価する場合は注意が必要です。また、ワークフローに変更を加えることができるユーザーを制限するために `CODEOWNERS` を使用することを検討してください。
```

詳細については、「[セキュリティで保護された使用に関するリファレンス](/ja/actions/security-guides/security-hardening-for-github-actions)」および「[セキュリティで保護された使用に関するリファレンス](/ja/actions/security-guides/using-githubs-security-features-to-secure-your-use-of-github-actions)」を参照してください。

## 次のステップ

* ```
          [AUTOTITLE](/code-security/supply-chain-security/end-to-end-supply-chain/end-to-end-supply-chain-overview)
  ```

* ```
          [AUTOTITLE](/code-security/supply-chain-security/end-to-end-supply-chain/securing-accounts)
  ```

* ```
          [AUTOTITLE](/code-security/supply-chain-security/end-to-end-supply-chain/securing-code)
  ```