Skip to content

Commit 15296bb

Browse files
committed
security: Set min release age with pnpm (#2561)
1 parent 388587c commit 15296bb

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
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)は除外することで、ワークフロー遅延なくセキュリティを向上させられる。

pnpm-workspace.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,20 @@ onlyBuiltDependencies:
55
- lefthook
66
- prisma
77
- puppeteer
8+
9+
# Security configuration: supply chain attack mitigation
10+
# Delay the adoption of newly released packages to allow detection of malicious code
11+
12+
# Minimum release age (minutes): Only install versions that are 1 day (1440 minutes) old
13+
minimumReleaseAge: 1440
14+
15+
# Packages excluded from the above restrictions (always install the latest version)
16+
minimumReleaseAgeExclude:
17+
# Prisma: Schema synchronization is critical, so early adoption of latest versions is effective
18+
- prisma
19+
- '@prisma/client'
20+
# tsx: For development script execution. Required for frequent updates in validation environments
21+
- tsx
22+
23+
# Prevent transitive dependencies from Git/Tarball sources (enhanced security)
24+
blockExoticSubdeps: true

0 commit comments

Comments
 (0)