Amazon Web Services ブログ

Amazon CodeArtifact パッケージグループ設定を使用してソフトウェアサプライチェーンのセキュリティを強化

3月21日より、パッケージリポジトリの管理者は、新しい AWS CodeArtifact パッケージグループ設定機能を使用して、複数のパッケージの設定を 1 か所で管理できるようになりました。パッケージグループを使用すると、内部のデベロッパーによって、またはアップストリームリポジトリから、パッケージが更新される方法を定義できます。内部のデベロッパーによるパッケージの公開を許可またはブロックしたり、パッケージのグループについてのアップストリームの更新を許可またはブロックしたりできるようになりました。

CodeArtifact は、組織がアプリケーション開発に使用されるソフトウェアパッケージを安全に保存および共有することを容易にする、フルマネージドパッケージリポジトリサービスです。CodeArtifact は、NuGetMavenGradlenpmyarnpiptwine、および Swift Package Manager などの人気のビルドツールやパッケージマネージャーで使用できます。

CodeArtifact は、npmjs.commaven.orgpypi.org などのパブリックリポジトリからのパッケージのオンデマンドインポートをサポートしています。これにより、組織のデベロッパーは、唯一の信頼できるソースである CodeArtifact リポジトリからすべてのパッケージを取得できるようになります。

シンプルなアプリケーションには通常、数十のパッケージが含まれています。大規模なエンタープライズアプリケーションには、何百もの依存関係が存在する場合があります。これらのパッケージは、ネットワークアクセス、暗号化機能、データ形式の操作などの一般的なプログラミングの課題を解決するコードを提供することで、デベロッパーが開発とテストのプロセスをスピードアップするのに役立ちます。これらのパッケージは、組織内の他のチームによって作成されたり、サードパーティーによって保守されたりする場合があります (例: オープンソースプロジェクト)。

サプライチェーン攻撃のリスクを最小限に抑えるために、一部の組織では、内部リポジトリで使用可能なパッケージと、これらのパッケージの更新を承認されたデベロッパーを手動で精査します。リポジトリ内のパッケージを更新するには 3 つの方法があります。組織内の選択されたデベロッパーがパッケージの更新をプッシュする場合があります。これは通常、組織の内部パッケージを使用する場合に当てはまります。パッケージはアップストリームリポジトリからインポートされる場合もあります。アップストリームリポジトリは、承認されたパッケージの全社的なソースや、人気のオープンソースパッケージを提供する外部パブリックリポジトリなど、別の CodeArtifact リポジトリである場合があります。

デベロッパーにパッケージを公開するさまざまな方法を示す図を以下に示します。

CodeArtifact マルチリポジトリ

リポジトリを管理する場合、パッケージをダウンロードおよび更新する方法を定義することが重要です。例えば、外部のアップストリームリポジトリからのパッケージのインストールや更新を許可すると、組織はタイポスクワッティング攻撃や依存関係の混乱攻撃にさらされます。有名なパッケージの悪意のあるバージョンを、わずかに異なる名前で公開しようとしている不正行為者を想像してみてください。悪意のあるパッケージは、coffee-script ではなく、「f」が 1 つだけ含まれた cofee-script であるとします。 アップストリーム外部リポジトリからの取得を許可するようにリポジトリが設定されている場合、深夜まで働いている、集中力を欠いたデベロッパーが、npm install coffee-script ではなく、npm install cofee-script と入力してしまえばおしまいです。

CodeArtifact は、パッケージを更新する 3 つの可能な方法として 3 つの許可を定義します。管理者は、内部の publish コマンド、内部のアップストリームリポジトリ、または外部のアップストリームリポジトリからのインストールと更新を allow または block できます。

これまで、リポジトリ管理者はこれらの重要なセキュリティ設定をパッケージごとに管理する必要がありました。本日の更新により、リポジトリ管理者はパッケージのグループのために、これらの 3 つのセキュリティパラメータを一度に定義できるようになりました。パッケージは、そのタイプ、名前空間、および名前によって識別されます。この新しい機能は、リポジトリレベルではなくドメインレベルで動作します。これにより、管理者はドメイン内のすべてのリポジトリでパッケージグループのルールを適用できます。すべてのリポジトリでパッケージオリジンコントロールの設定を保守する必要はありません。

仕組みの詳細
私が CodeArtifact を利用して内部パッケージリポジトリを管理しており、私の組織によって精査済みの AWS SDK for Python (boto3 とも呼ばれます) のバージョンのみを配布したいと考えているとします。

AWS マネジメントコンソールで CodeArtifact のページに移動し、精査済みのパッケージを内部のデベロッパーに提供する python-aws リポジトリを作成します。

CodeArtifact - リポジトリを作成する

これにより、作成したリポジトリに加えてステージングリポジトリが作成されます。pypi からの外部パッケージは、まず pypi-store 内部リポジトリにステージングされます。ここで私は、python-aws リポジトリに提供する前にこれらのパッケージを検証します。ここは、デベロッパーがこれらのパッケージをダウンロードするために接続する場所です。

CodeArtifact - リポジトリを作成する - パッケージフローデフォルトでは、デベロッパーが CodeArtifact に対して認証し、pip install boto3 と入力すると、CodeArtifact はパブリック pypi リポジトリからパッケージをダウンロードし、それらを pypi-store にステージングして、python-aws にコピーします。

CodeArtifact - pip installCodeArtifact - pip install 後のパッケージのリスト

ここで、CodeArtifact がアップストリームの外部 pypi リポジトリからパッケージの更新を取得するのをブロックしたいと考えているとします。python-aws には、pypi-store 内部リポジトリから私が承認したパッケージのみを提供してもらいたいと考えています。

本日リリースした新機能により、この設定をパッケージのグループに適用できるようになりました。自分のドメインに移動し、[パッケージグループ] タブを選択します。その後、[パッケージグループを作成] ボタンを選択します。

[パッケージグループの定義] を入力します。この式は、このグループにどのパッケージが含まれるのかを定義します。パッケージは、パッケージ形式、オプションの名前空間、名前という 3 つのコンポーネントの組み合わせを使用して識別されます。

許可された各組み合わせで使用できるパターンの例をいくつか次に示します:

  • すべてのパッケージ形式: /*
  • 特定のパッケージ形式: /npm/*
  • パッケージ形式と名前空間のプレフィックス: /maven/com.amazon~
  • パッケージ形式と名前空間: /npm/aws-amplify/*
  • パッケージ形式、名前空間、名前のプレフィックス: /npm/aws-amplify/ui~
  • パッケージの形式、名前空間、名前: /maven/org.apache.logging.log4j/log4j-core$

あらゆる可能性を知るために、ドキュメントをぜひお読みください。

この例では、Python パッケージには名前空間の概念がありません。また、グループには pypi からの boto3 で始まる名前を持つすべてのパッケージが含まれるようにしたいと考えています。そのため、/pypi//boto3~ と記述します。

CodeArtifact - パッケージグループの定義

その後、パッケージグループのセキュリティパラメータを定義します。この例では、組織のデベロッパーが更新を公開することを望んでいません。また、CodeArtifact が外部アップストリームリポジトリから新しいバージョンを取得することも望んでいません。内部ステージングディレクトリからのパッケージ更新のみを承認したいと考えています。

[親グループから継承] のすべてのチェックボックスをオフにします。[公開][外部アップストリーム][ブロック] を選択します。[内部アップストリーム][許可] をそのままにします。その後、[パッケージグループを作成] を選択します。

CodeArtifact - パッケージグループのセキュリティ設定

一度定義すると、デベロッパーは、python-aws リポジトリで承認されているものとは異なるパッケージバージョンをインストールできなくなります。デベロッパーとして別のバージョンの boto3 パッケージをインストールしようとすると、エラーメッセージが表示されます。これは、boto3 パッケージの新しいバージョンがアップストリームステージングリポジトリでは使用できず、外部アップストリームリポジトリからパッケージやパッケージの更新を取得できないようにする block ルールがあるためであり、想定内のことです。

CodeArtifact - リポジトリに存在しないパッケージバージョンを使用するとインストールが拒否されます

同様に、管理者が依存関係置換攻撃から組織を保護したいと考えているとします。すべての内部 Python パッケージの名前は会社名 (mycompany) で始まります。管理者は、mycompany で始まる pypi.org パッケージからデベロッパーが誤ってダウンロードするのをブロックしたいと考えています。

管理者は、/pypi//mycompany~ のパターンで、publish=allowexternal upstream=blockinternal upstream=block を使用してルールを作成します。この設定では、内部のデベロッパーまたは CI/CD パイプラインはこれらのパッケージを公開できますが、CodeArtifact は、mycompany.foomycompany.bar など、mycompany で始まるパッケージを pypi.org からインポートしません。これにより、これらのパッケージに対する依存関係置換攻撃が防止されます。

パッケージグループは、CodeArtifact が利用可能なすべての AWS リージョンで追加料金なしでご利用いただけます。これは、パッケージとパッケージの更新を内部リポジトリに配置する方法をより適切に制御するのに役立ちます。また、タイポスクワッティング依存関係の混乱など、さまざまなサプライチェーン攻撃を防ぐのにも役立ちます。これは、CodeArtifact リポジトリを作成および管理するために、Infrastructure as Code (IaC) ツールに今すぐ追加できる追加設定の 1 つです。

今すぐ最初のパッケージグループを設定しましょう

— seb

原文はこちらです。