# セキュリティ設計書

## 概要

本ドキュメントは、Prettierプロジェクトのセキュリティアーキテクチャおよびセキュリティ対策について記載する。Prettierはコードフォーマッターとして動作するCLIツール/Node.jsライブラリであり、従来のWebアプリケーションとは異なるセキュリティ特性を持つ。本設計書では、開発プロセス、依存関係管理、コード品質、およびWebサイト（ドキュメント・Playground）のセキュリティ対策について定義する。

## 認証設計

### 認証方式

本プロジェクトはCLIツール/ライブラリであり、エンドユーザー認証機能は実装していない。

- **CLIツール**: ローカル環境で実行されるため、OSレベルのファイルシステム権限に依存
- **ライブラリ**: 呼び出し元アプリケーションの認証機構に委任
- **Webサイト (prettier.io)**: 静的サイト生成（Docusaurus）であり、ユーザー認証なし
- **Playground**: クライアントサイドのみで動作し、サーバーサイド処理なし

### セッション管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション有効期限 | 該当なし | ユーザーセッションを管理しない |
| セッション固定化対策 | 該当なし | サーバーサイドセッションなし |

## 認可設計

### 権限体系

| ロール | 権限 | 説明 |
| --- | --- | --- |
| ユーザー (CLI) | ローカルファイル読み書き | 実行ユーザーのOS権限に従う |
| ライブラリ利用者 | API呼び出し | `format()`, `check()` 等のAPI利用 |
| コントリビューター | PR作成 | GitHubリポジトリへの貢献 |
| メンテナー | マージ・リリース | リポジトリ管理・npm公開権限 |

### アクセス制御

- **ファイルシステムアクセス**: CLIは実行ユーザーの権限でファイルを読み書きする。`--write` オプション使用時のみファイルを変更
- **設定ファイル読み込み**: `.prettierrc`, `.prettierignore` 等を信頼されたソースとして扱う
- **プラグインシステム**: 外部プラグインは `require()` / `import()` で読み込まれ、Node.jsのモジュールシステムの制約内で動作
- **GitHub Actions権限**: `permissions` ブロックで必要最小限の権限を明示的に指定 (`actions: read`, `contents: read`, `security-events: write`)

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | Webサイト (prettier.io) はNetlifyでホスティングされ、HTTPSを強制 |
| HSTS | Netlifyプラットフォームにより自動適用 |
| 外部リソース | CDN (unpkg, cdnjs) からの読み込みはHTTPSを使用 |

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | TLS 1.2+ (Netlifyホスティング) |
| 保存データ | 該当なし（ローカルファイルのみ、暗号化は実施しない） |
| キャッシュ | ファイルベースキャッシュ（`--cache`オプション）は平文保存 |

### 機密情報管理

- **シークレット管理**: npmパブリッシュトークン、GitHub Actionsシークレットは GitHub Secrets で管理
- **ローカル設定**: `.env` ファイルは `.gitignore` に含まれ、リポジトリにコミットされない
- **API キー**: Algolia検索APIキーは公開可能なサーチオンリーキーを使用 (`ecfff8a35d82ecff7e911d57d7be8510`)
- **Google Analytics**: 匿名化IP (`anonymizeIP: true`) を使用

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | Playgroundはユーザー入力をコードとしてフォーマットするのみで、HTMLとしてレンダリングしない。Docusaurusの標準的なエスケープ処理を適用 |
| SQLインジェクション | データベースを使用しないため該当なし |
| CSRF | サーバーサイド処理がないため該当なし |
| パストラバーサル | CLI は `fast-glob` を使用してファイルパターンを展開。`--ignore-path` で除外設定可能 |
| コードインジェクション | パーサー（Babel, TypeScript等）による構文解析のみ。`eval()` や `Function()` を直接使用しない設計 |
| ReDoS | ESLintルール `regexp/no-super-linear-backtracking` を使用（ただし off に設定されている箇所あり） |

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| GitHub Actions ログ | CI/CD実行履歴、テスト結果 | GitHubの標準保持期間 |
| CodeQL解析結果 | セキュリティスキャン結果 | GitHubの標準保持期間 |
| Google Analytics | ユーザーアクセス統計（匿名化） | Google Analyticsの標準設定 |

## 依存関係セキュリティ

### 自動セキュリティスキャン

| ツール | 対象 | 実行タイミング |
| --- | --- | --- |
| GitHub CodeQL | JavaScriptコード | push / pull_request |
| Renovate | 依存パッケージ更新 | 定期的な自動PR作成 |

### 依存関係管理

- **パッケージマネージャー**: Yarn 4.12.0 (Plug'n'Play)
- **resolutions**: `trim: 1.0.1` を明示的に指定（既知の脆弱性対策）
- **Node.jsバージョン**: `>=20` を要求し、サポート終了バージョンを除外

## コード品質セキュリティ

### 静的解析

| ツール | 目的 |
| --- | --- |
| ESLint | コード品質・セキュリティパターン検出 |
| TypeScript | 型チェックによるバグ予防 |
| Knip | 未使用コード検出 |
| cspell | スペルチェック |

### カスタムESLintルール

プロジェクト固有のESLintルール (`eslint-plugin-prettier-internal-rules`) により、以下を検証:
- AST操作の正確性
- 内部API使用パターンの一貫性
- テストコードの品質

## Webサイト・Playgroundセキュリティ

### Service Worker

- sw-toolbox を使用したキャッシュ戦略
- `networkFirst` をデフォルト戦略として使用
- 静的アセットには `fastest` 戦略を適用

### 外部リソース

| リソース | URL | 用途 |
| --- | --- | --- |
| sw-toolbox | cdnjs.cloudflare.com | Service Worker |
| Prettier Logo | unpkg.com | アニメーションロゴ |
| GitHub Stars Badge | img.shields.io | バッジ表示 |
| Netlify Badge | www.netlify.com | ホスティングバッジ |

### Google Analytics設定

- トラッキングID: `G-T57CP1SG02`
- IP匿名化: 有効 (`anonymizeIP: true`)

## 備考

### プロジェクト特性

PrettierはCLIツール/ライブラリであり、以下の点で従来のWebアプリケーションとセキュリティ観点が異なる:

1. **ローカル実行**: ユーザーのマシン上で実行されるため、ネットワーク経由の攻撃面が限定的
2. **信頼境界**: 入力ファイルは開発者自身のコードであり、悪意のある入力は想定外
3. **サンドボックスなし**: Node.jsプロセスとして完全なファイルシステムアクセスを持つ
4. **プラグイン信頼**: プラグインは任意のコードを実行可能（プラグイン利用者の責任）

### 推奨事項

1. **定期的な依存関係更新**: Renovateによる自動更新PRを継続的にマージ
2. **CodeQL解析結果のレビュー**: セキュリティアラートを定期的に確認
3. **プラグインセキュリティ**: サードパーティプラグイン使用時は信頼性を確認
4. **キャッシュ機能使用時**: `--cache` オプション使用時はキャッシュファイルの権限を適切に設定
