|
| 1 | +# pnpm minimumReleaseAge 設定ドラフト |
| 2 | + |
| 3 | +## 概要 |
| 4 | + |
| 5 | +サプライチェーン攻撃対策として、pnpm の `minimumReleaseAge` および `blockExoticSubdeps` をプロジェクトに導入する。 |
| 6 | + |
| 7 | +## 設定方針 |
| 8 | + |
| 9 | +- **セキュリティ重視**: 本番リリース週1~3回のため、慎重な依存関係管理が有効 |
| 10 | +- **開発生産性確保**: 検証環境での高速更新に対応するため、特定パッケージは除外 |
| 11 | +- **シンプルな構成**: `trustPolicy` は一旦無効化し、段階的に強化 |
| 12 | + |
| 13 | +## 設定内容 |
| 14 | + |
| 15 | +### pnpm-workspace.yaml に追加 |
| 16 | + |
| 17 | +```yaml |
| 18 | +onlyBuiltDependencies: |
| 19 | + - '@prisma/client' |
| 20 | + - '@prisma/engines' |
| 21 | + - esbuild |
| 22 | + - lefthook |
| 23 | + - prisma |
| 24 | + - puppeteer |
| 25 | + |
| 26 | +# セキュリティ設定:供給チェーン攻撃対策 |
| 27 | +# 新しくリリースされたパッケージの導入を遅延させ、悪意のあるコードが検出される時間を確保 |
| 28 | + |
| 29 | +# 最小リリース経過時間(分): パッケージ公開後1日経過したバージョンのみインストール可能 |
| 30 | +minimumReleaseAge: 1440 |
| 31 | + |
| 32 | +# 上記の制限から除外するパッケージ(常に最新版をインストール可能にする) |
| 33 | +minimumReleaseAgeExclude: |
| 34 | + # Prisma: スキーマ同期が重要なため、最新版の早期導入が有効 |
| 35 | + - prisma |
| 36 | + - '@prisma/client' |
| 37 | + # tsx: 開発スクリプト実行用。検証環境での頻繁な更新に対応 |
| 38 | + - tsx |
| 39 | + |
| 40 | +# Git/Tarball ソースからの推移的依存関係を防止(セキュリティ強化) |
| 41 | +blockExoticSubdeps: true |
| 42 | +``` |
| 43 | +
|
| 44 | +## 設定の詳細 |
| 45 | +
|
| 46 | +### minimumReleaseAge: 1440 |
| 47 | +
|
| 48 | +- **値の意味**: パッケージ公開後**1日(1440分)経過**したバージョンのみをインストール可能 |
| 49 | +- **効果**: 悪意のあるコードが含まれたパッケージは通常1時間以内に検出・削除されるため、セキュリティリスクを軽減 |
| 50 | +- **対象**: 直接依存関係と推移的依存関係の両方に適用 |
| 51 | +
|
| 52 | +### minimumReleaseAgeExclude |
| 53 | +
|
| 54 | +**除外対象パッケージ(常に最新版をインストール)**: |
| 55 | +
|
| 56 | +1. **prisma** / **@prisma/client** |
| 57 | + - Prisma スキーマの同期が重要 |
| 58 | + - 最新版バグ修正への迅速な対応が有効 |
| 59 | +
|
| 60 | +2. **tsx** |
| 61 | + - 開発スクリプト実行用 |
| 62 | + - 検証環境での頻繁な更新に必要 |
| 63 | +
|
| 64 | +### blockExoticSubdeps: true |
| 65 | +
|
| 66 | +- **効果**: Git や Tarball など、パッケージレジストリ外のソースからの推移的依存関係を防止 |
| 67 | +- **セキュリティ**: 不正なパッケージ置換を検出・ブロック |
| 68 | +
|
| 69 | +## 参考 |
| 70 | +
|
| 71 | +- pnpm v10.16.0 以降で利用可能 |
| 72 | +- [pnpm 公式ドキュメント](https://pnpm.io) |
| 73 | +
|
| 74 | +## 実装完了 ✅ |
| 75 | +
|
| 76 | +実装日時: 2026-02-03 |
| 77 | +
|
| 78 | +### 実施内容 |
| 79 | +
|
| 80 | +- `pnpm-workspace.yaml` にセキュリティ設定を追加完了 |
| 81 | +- `minimumReleaseAge: 1440` でパッケージの最小リリース経過時間を1日に設定 |
| 82 | +- `minimumReleaseAgeExclude` で Prisma と tsx を除外 |
| 83 | +- `blockExoticSubdeps: true` で不正なパッケージ置換をブロック |
| 84 | +- `pnpm install` で動作確認済み |
| 85 | + |
| 86 | +### 教訓 |
| 87 | + |
| 88 | +セキュリティと開発効率のバランスが重要。全パッケージに同じ制約をかけるのではなく、ビジネスロジックに直結するパッケージ(Prisma)と開発ツール(tsx)は除外することで、ワークフロー遅延なくセキュリティを向上させられる。 |
0 commit comments