

Amazon CodeCatalyst は新規のお客様には提供されなくなりました。既存のお客様は、通常どおりサービスを引き続き使用できます。詳細については、「[CodeCatalyst から移行する方法](migration.md)」を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# パッケージオリジンコントロールの編集
<a name="package-origin-controls"></a>

Amazon CodeCatalyst では、パッケージバージョンを直接公開したり、アップストリームリポジトリからプルダウンしたり、ゲートウェイを介して外部のパブリックリポジトリから取り込んだりすることで、パッケージバージョンをパッケージリポジトリに追加できます。直接公開とパブリックリポジトリからの取り込みの両方の方法でパッケージバージョンの追加を許可すると、依存関係置換攻撃に対して脆弱になります。詳細については、「[依存関係置換攻撃](#dependency-substitution-attacks)」を参照してください。依存関係置換攻撃から保護するには、リポジトリ内のパッケージにパッケージオリジンコントロールを設定して、パッケージバージョンをリポジトリに追加する方法を制限します。

さまざまなパッケージの新しいバージョンを、直接公開などの内部ソースとパブリックリポジトリなどの外部ソースの両方から入手できるようにしたいと考えている場合は、パッケージオリジンコントロールの設定を検討する必要があります。デフォルトでは、パッケージオリジンコントロールは、パッケージの最初のバージョンがリポジトリに追加された方法に基づいて設定されます。

## パッケージオリジンコントロール設定
<a name="package-origin-control-settings"></a>

パッケージオリジンコントロールでは、パッケージバージョンをリポジトリに追加する方法を設定できます。以下のリストには、使用可能なパッケージオリジンコントロールの設定と値が含まれています。

**公開**

この設定は、パッケージマネージャーや類似のツールを使用してパッケージのバージョンをリポジトリに直接公開できるかどうかを設定します。
+ **許可**: パッケージバージョンを直接公開できます。
+ **ブロック**: パッケージバージョンは直接公開できません。

**アップストリーム**

この設定は、パッケージマネージャーからのリクエストに応じて、パッケージバージョンを外部のパブリックリポジトリから取り込むことができるか、アップストリームリポジトリから保持できるかを設定します。
+ **許可**: すべてのパッケージバージョンは、アップストリームリポジトリとして設定された他の CodeCatalyst リポジトリから保持することも、外部接続を使用してパブリックソースから取り込むこともできます。
+ **ブロック**: パッケージバージョンは、アップストリームリポジトリとして設定された他の CodeCatalyst リポジトリから取得することも、外部接続を使用してパブリックソースから取り込むこともできません。

### パッケージオリジンコントロールのデフォルト設定
<a name="default-package-origin-control-settings"></a>

パッケージオリジンコントロールのデフォルト設定は、パッケージの最初のバージョンがパッケージリポジトリに追加された方法に基づいて設定されます。
+ 最初のパッケージバージョンがパッケージマネージャーによって直接公開された場合、設定は **[公開: 許可]** と **[アップストリーム: ブロック]** になります。
+ 最初のパッケージバージョンがパブリックソースから取り込まれた場合、設定は **[公開: ブロック]** と **[アップストリーム: 許可]** になります。

## 一般的なパッケージアクセスコントロールシナリオ
<a name="package-origin-control-scenarios"></a>

このセクションでは、パッケージバージョンが CodeCatalyst パッケージリポジトリに追加される際のいくつかの一般的なシナリオについて説明します。パッケージオリジンコントロール設定は、最初のパッケージバージョンが追加された方法に基づいて、新しいパッケージに設定されます。

以下のシナリオの*内部パッケージ*は、パッケージマネージャーからリポジトリに直接公開されるパッケージ (ユーザー管理するパッケージなど) を指します。*外部パッケージ*は、パブリックリポジトリに存在するパッケージで、ゲートウェイリポジトリアップストリームを通じてリポジトリに取り込むことができます。

**外部パッケージバージョンが既存の内部パッケージに公開される**

このシナリオでは、内部パッケージ「*packageA*」について考えてみます。チームは *packageA* の最初のパッケージバージョンを CodeCatalyst パッケージリポジトリに公開します。これはパッケージの最初のパッケージバージョンであるため、パッケージオリジンコントロール設定は自動的に **[公開: 許可]** および **[アップストリーム: ブロック]** に設定されます。パッケージがリポジトリに保存されると、同じ名前のパッケージが CodeCatalyst パッケージリポジトリに接続されているパブリックリポジトリに公開されます。これは、内部パッケージに対して試みられた依存関係置換攻撃である場合も、単なる偶然である場合もあり得ます。いずれの場合でも、パッケージオリジンコントロールは、潜在的な攻撃からパッケージバージョンを保護するために、新しい外部バージョンの取り込みをブロックするように設定されています。

次の画像では、*repoA* は `npm-public-registry-gateway` リポジトリへのアップストリーム接続を持つ CodeCatalyst パッケージリポジトリを表します。リポジトリには *packageA* のバージョン 1.1 と 2.1 が含まれていますが、バージョン 3.0 はパブリックリポジトリに公開されています。通常、*repoA* はパッケージマネージャーからパッケージがリクエストされた後にバージョン 3.0 を取り込みます。パッケージの取り込みが **[ブロック]** に設定されているため、バージョン 3.0 は CodeCatalyst パッケージリポジトリに取り込まれず、接続しているパッケージマネージャーからは使用できません。

![\[パブリックリポジトリからブロックされている新しい外部パッケージバージョンを示すシンプルな図。\]](http://docs.aws.amazon.com/ja_jp/codecatalyst/latest/userguide/images/packages/package-origin-controls-one.png)


**内部パッケージバージョンが既存の外部パッケージに公開される**

このシナリオでは、*packageB* という名前のパッケージは、リポジトリに接続したパブリックリポジトリの外部に存在します。リポジトリに接続しているパッケージマネージャーが *packageB* をリクエストすると、パッケージバージョンはパブリックリポジトリからリポジトリに取り込まれます。これは *packageB* の最初のパッケージバージョンであるため、パッケージオリジンコントロール設定は自動的に **[公開: ブロック]** および **[アップストリーム: 許可]** に設定されます。その後、ユーザーは同じパッケージ名のバージョンをリポジトリに公開しようとします。ここでは、ユーザーが公開パッケージの存在を知らず、関連のないパッケージを同じ名前で公開しようとしているか、パッチが適用されたバージョンを公開しようとしているか、外部に既に存在するパッケージバージョンとまったく同じものを直接公開しようとしている場合が考えられます。CodeCatalyst は、公開しようとしているバージョンを拒否しますが、拒否を明示的に上書きして、必要に応じてバージョンを公開することができます。

次の画像では、*repoA* は `npm-public-registry-gateway` リポジトリへのアップストリーム接続を持つ CodeCatalyst パッケージリポジトリを表します。パッケージリポジトリには、パブリックリポジトリから取り込んだバージョン 3.0 が含まれています。ユーザーは、バージョン 1.1 をパッケージリポジトリに公開したいと考えています。通常、バージョン 1.2 を *repoA* に公開できますが、公開が **[ブロック]** に設定されているため、バージョン 1.2 は公開できません。

![\[パッケージの公開がブロックされていることを示すシンプルなグラフィック。\]](http://docs.aws.amazon.com/ja_jp/codecatalyst/latest/userguide/images/packages/package-origin-controls-two.png)


**既存の外部パッケージにパッチを適用したパッケージバージョンを公開する**

このシナリオでは、*packageB* という名前のパッケージは、パッケージリポジトリに接続したパブリックリポジトリの外部に存在します。リポジトリに接続しているパッケージマネージャーが *packageB* をリクエストすると、パッケージバージョンはパブリックリポジトリからリポジトリに取り込まれます。これは *packageB* の最初のパッケージバージョンであるため、パッケージオリジンコントロール設定は自動的に **[公開: ブロック]** および **[アップストリーム: 許可]** に設定されます。チームは、このパッケージのパッチが適用されたパッケージバージョンをリポジトリに公開することを決めました。パッケージバージョンを直接公開するために、チームはパッケージのオリジンコントロール設定を **[公開: 許可]** および **アップストリーム: ブロック]** に変更します。これで、このパッケージのバージョンをリポジトリに直接公開し、パブリックリポジトリから取り込むことができます。チームがパッチを適用したパッケージバージョンを公開した後、チームはパッケージオリジンの設定を **[公開: ブロック]** および **[アップストリーム: 許可]** に戻します。

## パッケージオリジンコントロールの編集
<a name="edit-package-origin-controls"></a>

パッケージオリジンコントロールは、パッケージの最初のパッケージバージョンがパッケージリポジトリに追加された方法に基づいて自動的に設定されます。詳細については、「[パッケージオリジンコントロールのデフォルト設定](#default-package-origin-control-settings)」を参照してください。CodeCatalyst パッケージリポジトリ内のパッケージのパッケージオリジンコントロールを追加または編集する手順は次のとおりです。

**パッケージオリジンコントロールを追加または編集するには**

1. ナビゲーションペインで、[**Packages (パッケージ)**] を選択します。

1. 編集するパッケージを含むパッケージリポジトリを選択します。

1. **[パッケージ]** の表で、編集するパッケージを検索して選択します。

1. パッケージの要約ページの **[オリジンコントロール]** を選択します。

1. **[オリジンコントロール]** で、パッケージに設定するパッケージオリジンコントロールを選択します。**[公開]** と **[アップストリーム]** の両方のパッケージオリジンコントロール設定を同時に設定する必要があります。
   + パッケージバージョンを直接公開できるようにするには、**[公開]** で **[許可]** を選択します。パッケージバージョンの公開を禁止するには、**[ブロック]** を選択します。
   + 外部リポジトリからのパッケージの取り込みとアップストリームリポジトリからのパッケージの取得を許可するには、**[アップストリームソース]** で **[許可]** を選択します。外部リポジトリおよびアップストリームリポジトリからのパッケージバージョンの取り込みとプルをすべてブロックするには、**[ブロック]** を選択します。

1. **[保存]** を選択します。

## 公開リポジトリとアップストリームリポジトリ
<a name="package-publishing-upstreams"></a>

CodeCatalyst では、到達可能なアップストリームリポジトリまたはパブリックリポジトリに存在するパッケージバージョンを公開することはできません。例えば、npm パッケージ `lodash@1.0` をリポジトリ `myrepo` に公開するとし、`myrepo` が npmjs.com への外部接続を持つアップストリームリポジトリを持つとします。次のシナリオを考えてみます。

1. `lodash` 上のパッケージオリジンコントロール設定は、**[公開: 許可]** と **[アップストリーム: 許可]** です。もし `lodash@1.0` がアップストリームリポジトリまたは npmjs.com に存在する場合、CodeCatalyst は `myrepo` への公開の試みを、409 競合エラーを発行することですべて拒否します。`lodash@1.1` などの別のバージョンを公開することもできます。

1. `lodash` 上のパッケージオリジンコントロール設定は、**[公開: 許可]** と **[アップストリーム: ブロック]** です。ユーザーはパッケージバージョンにはアクセスできないため、まだ存在していないすべてのバージョンの `lodash` をリポジトリに公開できます。

1. `lodash` 上のパッケージオリジンコントロール設定は、**[公開: ブロック]** と **[アップストリーム: 許可]** です。この場合、どのパッケージバージョンもリポジトリに直接公開することはできません。

## 依存関係置換攻撃
<a name="dependency-substitution-attacks"></a>

パッケージマネージャーは、再利用可能なコードをパッケージ化して共有するプロセスを簡素化します。これらのパッケージは、ある組織がアプリケーションで使用するために開発したプライベートパッケージの場合もあれば、組織外で開発され、パブリックパッケージリポジトリによって配布されるパブリックパッケージ (通常はオープンソースパッケージ) の場合もあります。パッケージをリクエストする際、開発者はパッケージマネージャーを使用して依存関係の新しいバージョンを取得します。依存関係置換攻撃 (依存関係かく乱攻撃とも呼ばれる) は、通常、パッケージマネージャーでパッケージの正規バージョンと悪意のあるバージョンを区別できない点を悪用するものです。

依存関係置換攻撃は、ソフトウェアサプライチェーン攻撃と呼ばれる攻撃のサブセットに属します。ソフトウェアサプライチェーン攻撃は、ソフトウェアサプライチェーンのあらゆる場所にある脆弱性を利用する攻撃です。

依存関係置換攻撃は、内部で開発されたパッケージとパブリックリポジトリから取得したパッケージの両方を使用するすべてのユーザーを標的にする可能性があります。攻撃者は内部パッケージ名を特定し、同じ名前の悪意のあるコードを公開パッケージリポジトリに戦略的に配置します。通常、悪意のあるコードはバージョン番号の高いパッケージで公開されます。パッケージマネージャーは、悪意のあるパッケージをパッケージの最新バージョンとみなすため、これらの公開フィードから悪意のあるコードを取得します。これにより、目的のパッケージと悪意のあるパッケージが「かく乱」または「置換」され、コードが危険にさらされることになります。

依存関係置換攻撃を防ぐために、CodeCatalyst にはパッケージオリジンコントロールが用意されています。パッケージオリジンコントロールは、パッケージをリポジトリに追加する方法を制御する設定です。このコントロールは、新しいパッケージの最初のパッケージバージョンが CodeCatalyst リポジトリに追加される際に自動的に設定されます。このコントロールにより、パッケージバージョンをリポジトリに直接公開したり、公開ソースから取り込んだりすることができないため、依存関係置換攻撃から保護されます。パッケージオリジンコントロールとその変更方法については、「[パッケージオリジンコントロールの編集](#package-origin-controls)」を参照してください。