<div align="center">

# 🛡️ MinSec

**軽量・ゼロ知識エンドツーエンド暗号化（E2EE）シークレット＆環境変数マネージャー**  
*メモリ内直接注入（ディスク非保存） • AIコーディングアシスタントへの機密情報流出防止 • Cloudflare D1 & SQLite デュアルモード*

[![License: Non-Commercial](https://img.shields.io/badge/License-Non--Commercial_Open_Source-blue.svg)](LICENSE)
[![Runtime](https://img.shields.io/badge/Node.js-%3E%3D18.0.0-green.svg)](https://nodejs.org/)
[![Cloudflare](https://img.shields.io/badge/Deploy-Cloudflare_Workers_%2B_D1-orange.svg)](https://workers.cloudflare.com/)

[English](https://www.npmjs.com/package/minsec) | [简体中文](https://cdn.jsdelivr.net/npm/minsec/README_CN.md) | [日本語](https://cdn.jsdelivr.net/npm/minsec/README_JA.md)

</div>

---

## 📖 目次

- [なぜ MinSec なのか？（開発目的と解決する課題）](#-なぜ-minsec-なのか開発目的と解決する課題)
  - [1. AI IDE / 大規模言語モデル（LLM）への情報流出を防ぐ](#1-ai-ide--大規模言語モデルllmへの情報流出を防ぐ)
  - [2. チーム開発の効率化と退職時の権限即時無効化](#2-チーム開発の効率化と退職時の権限即時無効化)
  - [3. 社内イントラネット構築とデータ主権の維持](#3-社内イントラネット構築とデータ主権の維持)
- [グローバルインストール（npm / pnpm / yarn）](#-グローバルインストールnpm--pnpm--yarn)
- [暗号化アーキテクチャ（エンベロープ暗号化）](#-暗号化アーキテクチャエンベロープ暗号化)
- [2つの運用・デプロイ形態](#-2つの運用デプロイ形態)
  - [形態 A：ローカル / 社内イントラネット運用（軽量 SQLite）](#形態-aローカル--社内イントラネット運用軽量-sqlite)
  - [形態 B：サーバーレス運用（Cloudflare Workers + D1）](#形態-bサーバーレス運用cloudflare-workers--d1)
- [CLI コマンドリファレンス](#-cli-コマンドリファレンス)
- [Web 管理ダッシュボードの機能](#-web-管理ダッシュボードの機能)
- [⚠️ 最重要バックアップ警告：Root Key（ルート鍵）](#️-最重要バックアップ警告root-keyルート鍵)
- [プロジェクト設定ファイル仕様（.minsec）](#-プロジェクト設定ファイル仕様minsec)
- [ライセンスおよび商用利用について](#-ライセンスおよび商用利用について)

---

## 💡 なぜ MinSec なのか？（開発目的と解決する課題）

### 1. AI IDE / 大規模言語モデル（LLM）への情報流出を防ぐ

**Claude Code、Cursor、GitHub Copilot、Codex、Gemini Code Assist** など、昨今の AI コーディング支援ツールはワークスペース内の全ファイルを自動的にインデックス・解析してプロンプトやコンテキストに含めます。

* **従来の危険性**：多くの現場では、本番 DB のパスワードや Stripe、AWS などの API 秘密鍵が平文の `.env` ファイルに保存されています。AI を利用した際に、意図せず機密情報がサードパーティの LLM クラウドやログへ送信されてしまう深刻なセキュリティリスクが存在します。
* **MinSec の解決策**：**「ディスク非保存・メモリ直接注入（Zero-Disk In-Memory Injection）」**。
  ```bash
  minsec run -- npm run dev
  ```
  プロセス起動の瞬間にのみ、安全なネットワーク経由でシークレットを取得・復号し、**子プロセスの RAM メモリ上（`process.env`）に直接展開**します。**ローカルディスク上には一切シークレットファイルが生成されません**。ワークスペースには安全な `.minsec` 連携ファイルのみが配置されます。

### 2. チーム開発の効率化と退職時の権限即時無効化

* **平文ファイルの受け渡し撲滅**：Slack、メール、チャットツール等で `.env` をやり取りする必要はもうありません。
* **ワンクリックでアクセス権剥奪**：メンバーや業務委託がチームを離れる際、Web 画面から該当の API キーを削除するだけで、その端末からのシークレット復号権限を即座に遮断できます。
* **一箇所変更で全員即時同期**：DB のパスワード更新時も、MinSec の管理画面で 1 回更新するだけで、チーム全員および CI/CD が次回実行時から自動的に最新のシークレットを使用します。各メンバーが手作業で `.env` を書き換える手間は一切不要です。

### 3. 社内イントラネット構築とデータ主权の維持

社内プライベート LAN 上で完全にオフライン稼働させることも、Cloudflare のエッジインフラへ 1 コマンドでデプロイすることも可能です。機密データをどこに保持するかを完全に自社で統制できます。

---

## 📦 グローバルインストール（npm / pnpm / yarn）

お好みのパッケージマネージャーを使用して `minsec` をグローバルインストールすると、システムの任意のディレクトリから `minsec` コマンドを実行できるようになります：

```bash
# npm を使用する場合
npm install -g minsec

# pnpm を使用する場合
pnpm add -g minsec

# yarn を使用する場合
yarn global add minsec
```

インストール完了後、ターミナル上の任意の場所から直接実行できます：
```bash
# バージョンとコマンドヘルプの確認
minsec --help

# ローカルデーモンと Web 管理画面の起動
minsec server
```

---

## 🔒 暗号化アーキテクチャ（エンベロープ暗号化）

MinSec は厳格な**ゼロ知識エンベロープ暗号化（Envelope Encryption）**を採用しています：

```
                               ┌──────────────────────────────────────────────┐
                               │     Master Root Key（最高権限ルート鍵 256bit） │
                               │ (ホスト環境 ~/.minsec/server.key または CF Secret)│
                               └──────────────────────┬───────────────────────┘
                                                      │ 暗号化 / 復号
                                                      ▼
┌──────────────────────┐       ┌──────────────────────────────────────────────┐
│  環境変数 / シークレット  │ ───►  │     Project Key（プロジェクト固有 256bit 鍵）   │
└──────────────────────┘       └──────────────────────┬───────────────────────┘
                                                      │ AES-256-GCM 暗号化
                                                      ▼
                               ┌──────────────────────────────────────────────┐
                               │ Cloudflare D1 / SQLite データベース（暗号文保存）│
                               └──────────────────────────────────────────────┘
```

1. **Root Key**：最上位の暗号鍵。サーバー環境（`~/.minsec/server.key` または Cloudflare Secret）にのみ厳重に保管されます。
2. **Project Key**：プロジェクトごとに固有の AES-256 鍵が自動生成され、Root Key により保護されます。
3. **完全暗号文保存**：データベースに保存されるシークレットはすべてソルト付き AES-256-GCM 暗号文となり、データベース単体が漏洩しても平文が暴かれることはありません。

---

## 🚀 2つの運用・デプロイ形態

### 形態 A：ローカル / 社内イントラネット運用（軽量 SQLite）

Node.js + Hono + SQLite による超軽量設計。追加の重いインフラなしで即時起動します：

```bash
# 方法 1：グローバルインストール済みの場合
minsec server --port 9876

# 方法 2：クローンしたソースコードから起動する場合
npm install
node bin/minsec-server
```

ブラウザで **`http://localhost:9876/`** を開き、初回管理者アカウントを登録してください。

### 形態 B：サーバーレス運用（Cloudflare Workers + D1）

1 コマンドで世界中の Cloudflare エッジネットワークへ完全自動デプロイできます：

```bash
minsec deploy cloudflare
```

自動化スクリプトが以下の処理を一貫して行います：
1. Wrangler CLI の認証状態チェック
2. Cloudflare D1 データベース（`minsec-db`）の自動プロビジョニング
3. リモート D1 へのテーブル定義スキーマの自動マイグレーション
4. `MINSEC_ROOT_KEY` および `JWT_SECRET` の安全な Secret 登録
5. Cloudflare Worker のデプロイ（REST API と SPA Web 管理画面の両方を配信）
   ```
   🌐 MinSec Endpoint: https://minsec-api.<your-subdomain>.workers.dev
   ```

---

## 💻 CLI コマンドリファレンス

### グローバルサーバー設定
```bash
# ローカル CLI をリモートサーバーまたは内線サーバーに接続
minsec config set --global --endpoint https://minsec-api.your-domain.workers.dev --key ms_tok_...

# 現在有効な設定状態を確認
minsec config
```

### プロジェクトの初期設定（.minsec 生成）
プロジェクトのルートディレクトリで実行します：
```bash
minsec init
```
* サーバーエンドポイント、API キー、プロジェクト名、環境（dev/staging/prod）、パスを指定可能。
* モノレポ構成（`apps/*`, `packages/*`）を自動検知し、サブプロジェクトの連携ファイルも自動生成。

### メモリ直接注入実行（核心機能・ディスク非保存）

`minsec run` は OS プロセスレベルで子プロセスの環境変数領域（Environment Block）にシークレットを展開します。そのため、**Node.js だけでなく、Go、Rust、Java、Python、Docker などあらゆるプログラミング言語・ランタイムで全く同じ仕組み・設定不要で利用可能です**。

```bash
# Node.js
minsec run -- npm run dev
minsec run --env prod --path /apps/web -- npm start

# Go（開発実行またはビルド済みバイナリ）
minsec run -- go run main.go
minsec run -- ./bin/server

# Rust（Cargo 実行または Release バイナリ）
minsec run -- cargo run
minsec run -- ./target/release/my-app

# Java（Spring Boot、Gradle、実行可能 JAR）
minsec run -- ./mvnw spring-boot:run
minsec run -- ./gradlew bootRun
minsec run -- java -jar target/app.jar

# Python / シェルスクリプト / 任意の CLI
minsec run -- python main.py
minsec run -- docker compose up
```

#### 各プログラミング言語での取得方法

| 言語 | コード取得例 | 備考・注意点 |
| :--- | :--- | :--- |
| **Node.js** | `process.env.DATABASE_URL` | 標準ライブラリ |
| **Go** | `os.Getenv("DATABASE_URL")` | 標準ライブラリ |
| **Rust** | `std::env::var("DATABASE_URL")` | 標準ライブラリ |
| **Java** | `System.getenv("DATABASE_URL")` | ⚠️ **注意点**：MinSec は OS レベルの環境変数を注入するため、Java では **`System.getenv(...)` を使用する必要があります**。`-D` オプション用の `System.getProperty(...)` では取得できません。Spring Boot などのモダンフレームワークでは、OS 環境変数が自動解決され、`application.yml` や `@Value("${database.url}")` に自動バインドされます。 |
| **Python** | `os.getenv("DATABASE_URL")` | 標準ライブラリ |

### CLI からのシークレット・変数設定
```bash
# 通常の環境変数を設定
minsec set PORT=3000

# E2EE 暗号化シークレットを設定
minsec set STRIPE_KEY=sk_live_1234567890 --secret

# 現在のプロジェクト・環境・パスの一覧を表示
minsec list
```

### 暗号化バックアップのインポート / エクスポート
```bash
# 選択したプロジェクトをパスワード付き vault 形式でエクスポート
minsec export --projects my-project,auth-service --output backup.minsec.vault

# バックアップをインポート（同名プロジェクトの自動衝突回避機能あり）
minsec import backup.minsec.vault
```

### 管理者パスワード緊急リセット（ローカル環境）
```bash
minsec reset-password --username admin
```

---

## 🖥️ Web 管理ダッシュボードの機能

ローカルサーバーおよび Cloudflare Worker のルート URL（`/`）には、フル機能の SPA ダッシュボードが直接組み込まれています：

* **マルチプロジェクト対応**：サイドバーから複数のプロジェクトを瞬時に切り替え。
* **モノレポ階層パス対応**：マイクロサービスやパッケージごとにパス（`/`, `/apps/web`, `/apps/api` 等）を設定可能。子パスはルート `/` の設定を透過的に継承。
* **複数環境（Environment）管理**：`dev`、`staging`、`prod` の標準環境に加え、任意の環境を追加可能。
* **環境間シークレット同期（🔄 同步变量）**：別環境から変数定義（キーのみ、または値も含めて）を 1 クリックで一括複製。
* **プロジェクト限定 API キー管理**：特定プロジェクトのみにスコープを限定した有効期限付きトークンを発行可能。
* **選択的エクスポート＆インポート**：必要なプロジェクトのみを選択して暗号化バンドルを作成。
* **安全なプロジェクト削除防止機能**：項目が 1 件でも残っているプロジェクトは誤削除を防止（空のプロジェクトのみ削除可能）。
* **ワンクリック Project ID / 設定テンプレートコピー**：
  - `ID: <projectId> 📋`：正確なプロジェクト ID を 1 クリックでクリップボードにコピー。
  - `📋 Copy .minsec`：そのまま貼り付け可能な `.minsec` 設定 JSON を即座に生成。

---

## ⚠️ 最重要バックアップ警告：Root Key（ルート鍵）

> [!CAUTION]
> **デプロイ後は直ちに Root Key のオフラインバックアップを行ってください！**
> MinSec はゼロ知識暗号化で保護されています。Root Key を紛失した場合、**データベース内のすべてのシークレットデータは数学的に永久に復元できなくなります。**

1. **ローカル / 社内サーバー運用の場合**：
   * バックアップ対象ファイル：`~/.minsec/server.key`
   * 安全なオフラインストレージやチームのパスワード管理ツール（1Password, KeePass 等）に保管してください。
2. **Cloudflare 運用の件**：
   * デプロイ時に生成された `MINSEC_ROOT_KEY` の値を安全な場所に保存してください。
   * Cloudflare ダッシュボードからも確認・更新が可能です：  
     `Workers & Pages` ➔ `minsec-api` ➔ `Settings` ➔ `Variables and Secrets` ➔ `MINSEC_ROOT_KEY`。

---

## 📋 プロジェクト設定ファイル仕様（.minsec）

各プロジェクトに生成される `.minsec` ファイルの例：

```json
{
  "endpoint": "",
  "apiKey": "",
  "projectId": "myproject",
  "projectName": "myproject",
  "defaultEnv": "dev",
  "defaultPath": "/"
}
```

* **設定の自動継承**：`endpoint` や `apiKey` を空文字（`""`）にしておくと、ユーザーグローバル設定（`~/.minsec/.minsec`）から自動的に継承されます。
* **柔軟性**：`projectId` にはシステム内部 ID（`prj_...`）またはユーザー指定のプロジェクト名（`myproject`）のいずれも直接記述可能です。

---

## 📄 ライセンスおよび商用利用について

本プロジェクトは **MinSec 非商用オープンソースライセンス（Version 1.0）** のもとで公開されています。

* **非商用利用は無償**：個人の学習・実験、研究、非営利団体による利用・改変・セルフホストは完全に無料です。
* **商用利用には許諾が必要**：企業・営利団体における業務利用、商用プロダクトへの組み込み、SaaS サービスとしての提供など、**一切の商用利用には作者からの公式な商用ライセンス許諾が必要です**。

商用ライセンスの取得や技術サポートに関するご相談は、プロジェクト作者までお問い合わせください。
