# オンプレミスレジストリプロキシ

## 概要

Aikido オンプレミス Registry Proxy は、 **透過的なパッケージファイアウォール**これにより、開発者や CI システムにパッケージマネージャーの設定変更を求めることなく、組織はパッケージのセキュリティポリシーを強制できます。

クライアントにプライベートなレジストリ URL や特別なプロキシパスを使うよう設定する代わりに、組織は社内 DNS を使用して、対応する公開パッケージレジストリを Aikido Registry Proxy にリダイレクトします。開発者はデフォルトのパッケージマネージャー設定を使い続け、プロキシは公開レジストリからコンテンツを取得する前にリクエストを透過的に評価します。

## アーキテクチャ

<figure><img src="https://help.aikido.dev/_assets/ad876eb22a45/image-375.png" alt=""><figcaption></figcaption></figure>

## プロキシの実行

```bash
docker run -p 8080:8080 -e DEPLOYMENT_MODE=onprem public.ecr.aws/aikido-security/aikido-registry-proxy:latest
```

プロキシはポート `8080` また、TLS が ingress 層で終端されることを想定しています。ingress は元の `ホスト` ヘッダー（または `X-Forwarded-Host`を設定して、プロキシがエコシステムを識別できるようにします。

ヘルスエンドポイントは次の場所で利用できます `GET /health` （認証不要）で、Kubernetes の liveness/readiness プローブに適しています。

## 設定

<table data-search="false"><thead><tr><th>変数</th><th>デフォルト</th><th>説明</th></tr></thead><tbody><tr><td><code>DEPLOYMENT_MODE</code></td><td>デフォルトを上書きして次に設定するために必要です <code>onprem</code></td><td>DNS プロキシを設定するために必要です</td></tr><tr><td><code>UPSTREAM_DNS</code></td><td><code>1.1.1.1</code></td><td>プロキシ自身の外向き通信に使用する公開 DNS リゾルバーです。社内のインターセプト用 DNS ではなく、実際の公開リゾルバーを指している必要があります。複数のリゾルバーはカンマ区切りで指定できます。</td></tr><tr><td><code>MINIMUM_PACKAGE_AGE_HOURS</code></td><td><code>48</code></td><td>このしきい値より新しく公開されたパッケージをブロックします。</td></tr><tr><td><code>NPM_UPSTREAM_URL</code></td><td><code>https://registry.npmjs.org</code></td><td>内部 npm ミラーを指すように上書きします。</td></tr><tr><td><code>PYPI_UPSTREAM_URL</code></td><td><code>https://pypi.org</code></td><td>内部 PyPI ミラーを指すように上書きします。</td></tr><tr><td><code>PYPI_FILES_UPSTREAM_URL</code></td><td><code>https://files.pythonhosted.org</code></td><td>内部 PyPI ファイルミラーを指すように上書きします。</td></tr><tr><td><code>MAVEN_UPSTREAM_URL</code></td><td><code>https://repo1.maven.org/maven2</code></td><td>内部 Maven ミラーを指すように上書きします。</td></tr></tbody></table>

## サポートされるホストのマッピング

Registry Proxy は、受信する HTTP Host ヘッダーに基づいて、要求を適切なエコシステムにルーティングします。

| 公開ホスト名                 | エコシステム        |
| ---------------------- | ------------- |
| registry.npmjs.org     | npm           |
| pypi.org               | PyPI          |
| files.pythonhosted.org | PyPI          |
| repo1.maven.org        | Maven Central |

## レジストリ互換性

メタデータ応答では URL をプロキシパスに書き換えません。クライアントは元の公開レジストリ形式の URL を受け取り、インターセプトされていないホストへリダイレクトされることはありません。

### npm

* Packument 応答は引き続き互換性があります `registry.npmjs.org`.
* Tarball のダウンロードは標準の npm ワークフローを使用します。

### PyPI

* メタデータ要求は次から提供されます `pypi.org`.
* パッケージのダウンロードは次から提供されます `files.pythonhosted.org`.

### Maven

* Maven Central へのリクエストは標準の `/maven2/...` パスを使用します。

## 送信元 IP とレート制限

すべてのプロキシ経由トラフィックは単一の IP（レプリカが 2 つある場合は 2 つの IP）から送信されるため、Maven Central やその他の公開レジストリは、その IP から発生するリクエストをレート制限またはブロックする場合があります。これは透過プロキシモデルの既知の制約です。

これを軽減するには、複数の IP を持つ NAT ゲートウェイ経由で送信トラフィックをルーティングするか、公開レジストリのレート制限を受けない内部ミラーを指すように upstream URL の上書きを設定してください。

## 上流ルーティングループの防止

プロキシは、自身のすべての外向き通信を次を使用して解決します `UPSTREAM_DNS` リゾルバー（デフォルト `1.1.1.1`）を使用し、コンテナのシステム DNS を完全にバイパスします。つまり、Pod がインターセプトする社内 DNS を継承していても、プロキシの上流取得は常に実際の公開レジストリに到達し、ループバックしません。

プロキシホスト自体に split-horizon DNS の設定は不要です。さらに保護を強化するため、Kubernetes の `dnsConfig`.

## リクエストの流れ

1. 開発者または CI システムが標準のパッケージマネージャーを使ってパッケージをインストールします。
2. 社内 DNS が公開レジストリのホスト名を内部 Registry Proxy に解決します。
3. Registry Proxy は元の HTTP Host ヘッダーを使ってリクエストを受け取ります。
4. プロキシは要求されたホスト名に基づいて対象のエコシステムを判定します。
5. マルウェア検出と最小パッケージ年齢ポリシーが評価されます。
6. リクエストが許可されると、プロキシは対応する公開レジストリからパッケージまたはメタデータを取得します。
7. 応答は透過的にクライアントへ返されます。
