# セキュリティ設計書

## 概要

本ドキュメントは、Nushell（v0.111.1）のセキュリティ設計について記載する。Nushellはシェル環境およびプログラミング言語として設計されており、Webアプリケーションとは異なるセキュリティモデルを持つ。本設計書では、シェルとしての特性を考慮したセキュリティ対策について説明する。

## 認証設計

### 認証方式

Nushellはシェルプログラムであり、独自の認証システムは持たない。OSレベルの認証に依存する。

| 認証タイプ | 方式 | 実装場所 |
| --- | --- | --- |
| OS認証 | OSユーザー認証に依存 | OS標準機能 |
| 管理者権限確認 | `is-admin`コマンド | `crates/nu-command/src/experimental/is_admin.rs` |
| プラグイン通信 | JSON-RPCプロトコル | `crates/nu-plugin-protocol/` |

### セッション管理

Nushellはステートレスなシェルセッションを提供する。

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション管理 | OSプロセス単位 | シェルプロセスのライフサイクルに依存 |
| 環境変数管理 | スタックベース | `nu-protocol/src/engine/stack.rs`で管理 |
| ヒストリー管理 | SQLite/ファイル | `reedline`クレートによる永続化 |

## 認可設計

### 権限体系

| ロール | 権限 | 説明 |
| --- | --- | --- |
| 一般ユーザー | OS権限に依存 | ユーザー権限での操作 |
| 管理者/root | OS権限に依存 | 特権操作が可能 |

### アクセス制御

Nushellは、OSのアクセス制御機構を利用する。独自のサンドボックス機構は現時点では実装されていない。

- **ファイルシステムアクセス**: OSのファイルパーミッションに依存
- **プロセス実行**: OSのプロセス権限に依存
- **ネットワークアクセス**: OSのネットワーク権限に依存

管理者権限の確認機能:
- Unix: `nix::unistd::Uid::current().is_root()` を使用
- Windows: `TOKEN_ELEVATION`を使用してUACの昇格状態を確認

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | rustls/native-tls による TLS 1.2/1.3 サポート |
| 証明書検証 | プラットフォーム証明書ストアを使用（`rustls-platform-verifier`または`rustls-native-certs`） |
| TLSバックエンド | `rustls-tls`（デフォルト）または`native-tls`を選択可能 |
| 暗号化プロバイダー | `rustls::crypto::ring`を使用 |
| 証明書検証無効化 | `--insecure`オプションで一時的に無効化可能（非推奨） |

### TLS設定の実装

- 実装場所: `crates/nu-command/src/network/tls/`
- `CRYPTO_PROVIDER`静的変数でグローバルな暗号化プロバイダーを管理
- プラットフォームネイティブの証明書ストアを優先使用

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信（HTTP） | TLS 1.2/1.3（rustls/native-tls） |
| 保存データ | SQLite標準（ヒストリー）、ユーザー責任（その他） |

### ハッシュ機能

Nushellは以下のハッシュアルゴリズムをコマンドとして提供:

| コマンド | アルゴリズム | 実装場所 |
| --- | --- | --- |
| `hash md5` | MD5 | `crates/nu-command/src/hash/md5.rs` |
| `hash sha256` | SHA-256 | `crates/nu-command/src/hash/sha256.rs` |

### 機密情報管理

- 環境変数による管理: 機密情報は環境変数として管理可能
- 設定ファイル: `config.nu`、`env.nu`でのカスタマイズ
- シェル変数のスコープ管理: スタックベースのスコープで変数の可視性を制御

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| コマンドインジェクション | 外部コマンド実行時の適切な引数エスケープ |
| パストラバーサル | `nu-path`クレートによるパス正規化、チルダ展開の安全な処理 |
| グロブインジェクション | `nu-glob`クレートによる安全なグロブパターン処理 |
| エンコーディング | `encoding_rs`による文字エンコーディングの適切な処理 |

### 外部コマンド実行のセキュリティ

実装場所: `crates/nu-command/src/system/run_external.rs`

- チルダ展開とndots展開の安全な処理
- PATH環境変数に基づく実行ファイルの検索
- Windows固有のスクリプト関連付けの安全な処理

### ファイル操作のセキュリティ

- **削除操作（rm）**:
  - `--trash`オプションでごみ箱への移動をサポート
  - `--interactive`オプションで確認プロンプトを提供
  - `--force`オプションでエラー抑制が可能
  - 実装場所: `crates/nu-command/src/filesystem/rm.rs`

## プラグインセキュリティ

### プラグイン通信

| 項目 | 設計 |
| --- | --- |
| 通信プロトコル | JSON-RPC over stdin/stdout |
| プロセス分離 | 別プロセスとして実行 |
| 権限分離 | OS権限に依存（サンドボックスなし） |

### プラグイン実行コンテキスト

実装場所: `crates/nu-plugin-engine/src/context.rs`

- プラグインは制限されたコンテキストで実行
- 環境変数へのアクセスは`PluginExecutionContext`トレイト経由
- 宣言の呼び出しは`find_decl`、`call_decl`メソッド経由で制御

## コードセキュリティ

### unsafe使用

Nushellコードベースでは、以下の場所でunsafeコードが使用されている:

| 場所 | 用途 |
| --- | --- |
| システムAPI呼び出し | Windows API呼び出し（`is_admin.rs`など） |
| FFI | プラットフォーム固有の低レベル操作 |
| パフォーマンス最適化 | 一部のデータ構造操作 |

### メモリ安全性

- Rustの所有権システムによるメモリ安全性の保証
- `Arc`、`Mutex`、`RwLock`による安全な並行処理
- `Cow`（Copy-on-Write）による効率的なデータ共有

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| コマンドヒストリー | 実行コマンド、タイムスタンプ | ユーザー設定に依存 |
| エラーログ | シェルエラー、警告 | セッション中のみ |

- ヒストリーは`reedline`クレートにより管理
- SQLiteベースの永続ヒストリーをオプションでサポート

## セキュリティに関する制限事項

1. **サンドボックス機能なし**: Nushellは現時点でサンドボックス機能を持たない。外部コマンドおよびプラグインはOSの権限で実行される。

2. **プラグイン検証なし**: プラグインの署名検証や整合性チェックは現時点では実装されていない。

3. **機密情報の保護**: パスワードやAPIキーなどの機密情報は、環境変数やファイルとして管理される。追加の暗号化レイヤーは提供されていない。

## 備考

- Nushellはクロスプラットフォーム対応（Windows、macOS、Linux）
- セキュリティ機能の多くはOSレベルの機構に依存
- MITライセンスでオープンソースとして公開
- 詳細なセキュリティ診断については、別途「セキュリティ診断レポート」を参照
