# セキュリティ設計書

## 概要

本ドキュメントは、Doom Emacs（Emacsの設定フレームワーク）のセキュリティ設計について記載する。Doom EmacsはEmacs Lispで構築されたデスクトップアプリケーションフレームワークであり、主にローカル環境で動作する。外部サービスとの通信セキュリティ、ファイルシステムのアクセス制御、サンドボックス機能、環境変数管理におけるセキュリティ対策を中心に設計されている。

## 認証設計

### 認証方式

Doom EmacsはWebアプリケーションではないため、ユーザー認証機能は持たない。ただし、以下の認証関連機能を提供している：

1. **auth-source統合**
   - `tools/pass`モジュールで`auth-source-pass`を有効化可能
   - password-storeとの連携による認証情報管理
   - GPG暗号化されたパスワードストアの利用

2. **Git認証**
   - Magit/Forge経由でのGit認証
   - SSH鍵またはHTTPS認証の利用
   - 認証情報は`.netrc`または`auth-source`経由で管理

### セッション管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション有効期限 | Emacsプロセスのライフタイム | デスクトップアプリのため、プロセス終了で終了 |
| セッション固定化対策 | 該当なし | Webセッションは使用しない |
| セッション保存 | `sessions.el`による状態保存 | ファイルパーミッション700で保護 |

## 認可設計

### 権限体系

| ロール | 権限 | 説明 |
| --- | --- | --- |
| システムユーザー | フルアクセス | Emacsを実行するOSユーザーの権限を継承 |
| サンドボックスモード | 制限付き | テスト用に隔離された環境での実行 |
| root (sudo) | 特権アクセス | `doom/sudo-find-file`経由でのroot権限でのファイル操作 |

### アクセス制御

Doom Emacsは以下のアクセス制御方式を採用している：

1. **ファイルシステム権限**
   - ディレクトリ作成時のパーミッション: `#o700`（所有者のみ読み書き実行可）
   - 環境変数ファイルのエンコーディング: `utf-8-unix`

2. **サンドボックス機能**
   - `doom-sandbox-dir`: 一時ディレクトリ配下にサンドボックス環境を構築
   - ユーザー設定を隔離した状態でのEmacs起動が可能
   - 4つのサンドボックスモード: vanilla Emacs、vanilla Doom、Doom + modules、full Doom

3. **sudo操作**
   - TRAMP経由でのroot権限ファイル操作
   - `doom/sudo-find-file`: 特定ファイルをroot権限で開く
   - `doom/sudo-save-buffer`: 現在のバッファをroot権限で保存

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | MELPA/ORGELPAへの接続は`gnutls-verify-error`が非対話時にtrue |
| HSTS | 対応していない（パッケージアーカイブはHTTPS接続を前提） |
| TLSバージョン | TLS 1.2以上を必須（TLS 1.3対応） |
| 証明書検証 | `gnutls-verify-error`および`tls-checktrust`で設定 |

### TLS/SSL設定詳細

```elisp
;; doom.el より抜粋
(setq gnutls-verify-error noninteractive
      gnutls-algorithm-priority
      (concat "SECURE128:+SECURE192:-VERS-ALL"
              ":+VERS-TLS1.3"  ; TLS 1.3 (libgnutls >= 3.6.5)
              ":+VERS-TLS1.2")
      gnutls-min-prime-bits 3072
      tls-checktrust gnutls-verify-error
      tls-program '("openssl s_client -connect %h:%p -CAfile %t -nbio -no_ssl3 -no_tls1 -no_tls1_1 -ign_eof"
                    "gnutls-cli -p %p --dh-bits=3072 --ocsp --x509cafile=%t \
--strict-tofu --priority='SECURE192:+SECURE128:-VERS-ALL:+VERS-TLS1.2:+VERS-TLS1.3' %h"
                    "gnutls-cli -p %p %h"))
```

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | TLS 1.2/1.3（GnuTLS使用） |
| 保存データ | password-store（GPG暗号化） |
| 認証情報 | auth-source + GPG |

### 機密情報管理

1. **環境変数フィルタリング**
   - `doom-env-deny`: 機密性の高い環境変数を除外するリスト
   - 除外対象: SSH_AUTH_SOCK、GPG_TTY、XAUTHORITY、DBUS_SESSION_BUS_ADDRESS等
   - `doom-env-allow`: 明示的に許可する環境変数

2. **パスワード管理**
   - `password-store-password-length`: デフォルト12文字
   - GPG暗号化によるパスワードストア

3. **ディレクトリパーミッション**
   ```elisp
   (with-file-modes #o700
     (mapc (doom-rpartial #'make-directory 'parents)
           (list doom-local-dir
                 doom-data-dir
                 doom-cache-dir
                 doom-state-dir)))
   ```

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | 該当なし（Webアプリではない） |
| SQLインジェクション | 該当なし（SQLを直接使用しない） |
| CSRF | 該当なし（Webアプリではない） |
| コマンドインジェクション | `shell-quote-argument`によるエスケープ |
| パストラバーサル | `expand-file-name`による正規化 |

### コード実行のセキュリティ

1. **Emacs Lispコード実行**
   - `sandbox.el`: 隔離環境でのコード実行
   - `eval`使用時のコンテキスト管理

2. **外部プロセス実行**
   - `doom-call-process`: 引数のサニタイズ
   - `shell-quote-argument`: シェル引数のエスケープ
   - 環境変数の制御された継承

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| 起動ログ | 起動時間、読み込みモジュール数、パッケージ数 | セッション中 |
| デバッグログ | `doom-log`によるデバッグ情報 | `init-file-debug`有効時のみ |
| エラーログ | フック実行エラー、パッケージエラー | セッション中（*Messages*バッファ） |

### ログレベル設定

```elisp
(defvar doom-log-level
  (if init-file-debug
      (if-let* ((level (getenv-internal "DEBUG"))
                (level (if (string-empty-p level) 1 (string-to-number level)))
                ((not (zerop level))))
          level
        2)
    0)
  "How verbosely to log from `doom-log' calls.

0 -- No logging at all.
1 -- Only warnings.
2 -- Warnings and notices.
3 -- Debug info, warnings, and notices.")
```

## 備考

### セキュリティ上の考慮事項

1. **Emacsの本質的な特性**
   - Emacsはローカルで動作するデスクトップアプリケーション
   - OSユーザーの権限をそのまま継承
   - 外部パッケージの信頼性は利用者が判断する必要がある

2. **パッケージセキュリティ**
   - MELPAからのパッケージはHTTPS経由で取得
   - package-gnupghome-dir: GPG検証用ディレクトリ
   - パッケージの署名検証は`package-check-signature`で制御

3. **推奨されるセキュリティプラクティス**
   - `doom env`による環境変数の明示的な管理
   - password-storeとGPGの併用
   - 定期的な`doom upgrade`によるセキュリティ更新

### 既知の制限事項

1. **サードパーティパッケージ**
   - Doom Emacsの外部パッケージはDoom自体のセキュリティ対策の対象外
   - 各パッケージのセキュリティは個別に評価が必要

2. **ローカルファイルアクセス**
   - Emacsは任意のファイルにアクセス可能
   - サンドボックスモードでも完全な隔離は保証されない
