# セキュリティ設計書

## 概要

本ドキュメントは、Nimプログラミング言語の標準ライブラリ（特にランタイムライブラリ）におけるセキュリティ関連機能の設計を記述する。Nimは汎用プログラミング言語のコンパイラおよび標準ライブラリを提供しており、SSL/TLS通信、暗号化、ハッシュ計算、入出力のエスケープ処理など、セキュリティに関わる多数の機能を含んでいる。

## 認証設計

### 認証方式

本プロジェクトはプログラミング言語の標準ライブラリであり、アプリケーション固有の認証機能は実装していない。ただし、SSL/TLS通信における証明書ベースの認証機能を提供している。

| 認証種別 | 提供モジュール | 説明 |
| --- | --- | --- |
| サーバー証明書検証 | `lib/wrappers/openssl.nim`, `lib/pure/net.nim` | SSL/TLS接続時にサーバー証明書を検証する機能 |
| クライアント証明書 | `lib/wrappers/openssl.nim` | クライアント証明書による双方向認証をサポート |
| PSK認証 | `lib/wrappers/openssl.nim` | Pre-Shared Key認証のコールバック機能 |

### セッション管理

SSL/TLSセッション管理機能を提供している。

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッションID管理 | `SSL_CTX_set_session_id_context` | SSL Contextでセッションコンテキストを設定可能 |
| セッションキャッシュ | `SSL_CTRL_SET_SESS_CACHE_SIZE/MODE` | セッションキャッシュサイズとモードを設定可能 |
| セッション再利用 | `SSL_CTRL_GET_SESSION_REUSED` | セッション再利用状態の取得が可能 |

## 認可設計

### 権限体系

本プロジェクトは標準ライブラリであり、アプリケーションレベルの権限体系は実装していない。SSL/TLS接続における検証モードを提供している。

| モード | 定数 | 説明 |
| --- | --- | --- |
| 検証なし | `SSL_VERIFY_NONE` (0x00000000) | ピア証明書を検証しない |
| ピア検証 | `SSL_VERIFY_PEER` (0x00000001) | ピア証明書を検証する |

### アクセス制御

`lib/pure/net.nim`の`SslCVerifyMode`列挙型で、SSL検証モードを制御する。

| 検証モード | 説明 |
| --- | --- |
| `CVerifyNone` | 証明書検証を行わない |
| `CVerifyPeer` | ピア証明書を検証する |
| `CVerifyPeerUseEnvVars` | 環境変数を使用してピア証明書を検証する |

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS/SSL | OpenSSLラッパー（`lib/wrappers/openssl.nim`）を通じてSSL/TLS通信をサポート |
| TLSバージョン | TLS 1.0, 1.1, 1.2, 1.3（OpenSSLバージョンに依存）をサポート |
| 暗号スイート設定 | Mozilla推奨の暗号スイートを`lib/pure/ssl_config.nim`で提供 |
| SNI (Server Name Indication) | `SSL_set_tlsext_host_name`による SNI サポート |
| ALPN | Application Layer Protocol Negotiation拡張をサポート |

### SSL/TLS暗号スイート設定

`lib/pure/ssl_config.nim`で Mozilla OpSec の推奨に基づく暗号スイートを提供している。

| 互換性レベル | 暗号スイート | 対応クライアント |
| --- | --- | --- |
| Modern | TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 | Firefox 63+, Chrome 70+, Android 10.0+, OpenSSL 1.1.1+ |
| Intermediate | 上記 + ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-RSA-AES128-GCM-SHA256等 | Firefox 27+, Chrome 31+, Android 4.4.2+, OpenSSL 1.0.1+ |
| Old | 上記 + レガシー暗号スイート（DES-CBC3-SHA含む） | Firefox 1+, Chrome 1+, IE8+, OpenSSL 0.9.8+ |

### SSLプロトコルバージョン制御

| プロトコル | オプションフラグ | 推奨 |
| --- | --- | --- |
| SSLv2 | `SSL_OP_NO_SSLv2` (0x01000000) | 無効化推奨 |
| SSLv3 | `SSL_OP_NO_SSLv3` (0x02000000) | 無効化推奨 |
| TLSv1.0 | `SSL_OP_NO_TLSv1` (0x04000000) | 無効化推奨 |
| TLSv1.1 | `SSL_OP_NO_TLSv1_1` (0x08000000) | 無効化推奨 |

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | SSL/TLS（OpenSSLを通じて TLS 1.2/1.3、AES-GCM、ChaCha20-Poly1305等をサポート） |
| RSA暗号化 | PKCS#1パディング（OAEP含む）をサポート |
| DES暗号化 | DES/3DESをサポート（非推奨） |

#### RSAパディングモード

| パディング種別 | 定数値 | 説明 |
| --- | --- | --- |
| PKCS#1 v1.5 | `RSA_PKCS1_PADDING` (1) | 標準的なパディング |
| SSLv23 | `RSA_SSLV23_PADDING` (2) | SSL互換パディング |
| なし | `RSA_NO_PADDING` (3) | パディングなし（非推奨） |
| OAEP | `RSA_PKCS1_OAEP_PADDING` (4) | 推奨されるパディング方式 |
| X9.31 | `RSA_X931_PADDING` (5) | X9.31パディング |
| PSS | `RSA_PKCS1_PSS_PADDING` (6) | 署名用パディング |

### ハッシュ関数

`lib/wrappers/openssl.nim`および標準ライブラリで以下のハッシュ関数を提供している。

| ハッシュ関数 | 提供モジュール | 状態 |
| --- | --- | --- |
| MD5 | `lib/pure/md5.nim`, `lib/wrappers/openssl.nim` | 非推奨（checksums パッケージへ移行） |
| SHA-1 | `lib/std/sha1.nim` | 非推奨（checksums パッケージへ移行） |
| SHA-224 | `lib/wrappers/openssl.nim` (EVP_sha224) | OpenSSL経由で利用可能 |
| SHA-256 | `lib/wrappers/openssl.nim` (EVP_sha256) | OpenSSL経由で利用可能 |
| SHA-384 | `lib/wrappers/openssl.nim` (EVP_sha384) | OpenSSL経由で利用可能 |
| SHA-512 | `lib/wrappers/openssl.nim` (EVP_sha512) | OpenSSL経由で利用可能 |
| HMAC | `lib/wrappers/openssl.nim` | OpenSSL経由で利用可能 |

### 機密情報管理

#### 乱数生成

| 種別 | モジュール | 用途 |
| --- | --- | --- |
| 暗号学的乱数 | `lib/std/sysrand.nim` | 暗号目的（OSのセキュアRNGを使用） |
| 擬似乱数 | `lib/pure/random.nim` | 非暗号目的（xoroshiro128+ベース） |

##### 暗号学的乱数生成（sysrand）のOS別実装

| OS | 実装 |
| --- | --- |
| Windows | BCryptGenRandom |
| Linux | getrandom システムコール |
| macOS/iOS | SecRandomCopyBytes |
| OpenBSD | getentropy |
| FreeBSD | getrandom |
| Web Browser (JS) | crypto.getRandomValues |
| Node.js | crypto.randomFillSync |
| その他Unix | /dev/urandom |

#### SSL証明書管理

`lib/pure/ssl_certs.nim`でOS別のCA証明書パスを自動検出する機能を提供。

| OS | 証明書パス |
| --- | --- |
| macOS | `/etc/ssl/cert.pem`, `/System/Library/OpenSSL/certs/cert.pem` |
| Linux | `/etc/ssl/certs/ca-certificates.crt`, `/etc/pki/tls/certs/ca-bundle.crt`等 |
| BSD | `/etc/ssl/cert.pem`, `/usr/local/share/certs/ca-root-nss.crt`等 |
| Windows | アプリケーションディレクトリの`cacert.pem` |

環境変数`SSL_CERT_FILE`および`SSL_CERT_DIR`でカスタム証明書パスの指定が可能。

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | `lib/pure/xmltree.nim`の`escape`/`addEscaped`関数でHTML/XMLエスケープを提供 |
| XMLインジェクション | `lib/pure/cgi.nim`の`xmlEncode`関数でXMLエンコードを提供 |
| URLエンコード | `lib/pure/uri.nim`の`encodeUrl`/`decodeUrl`を`lib/pure/cgi.nim`からエクスポート |
| CGI入力検証 | `lib/pure/cgi.nim`の`validateData`関数で許可されたキーの検証 |

### エスケープ処理詳細

#### XML/HTMLエスケープ（xmltree.nim）

| 文字 | エスケープ後 |
| --- | --- |
| `<` | `&lt;` |
| `>` | `&gt;` |
| `&` | `&amp;` |
| `"` | `&quot;` |
| `'` | `&apos;` |

#### CGI XMLエンコード（cgi.nim）

| 文字 | エスケープ後 |
| --- | --- |
| `<` | `&lt;` |
| `>` | `&gt;` |
| `&` | `&amp;` |
| `"` | `&quot;` |

### 入力検証

`lib/pure/cgi.nim`の`validateData`プロシージャにより、CGIデータの変数名を許可リストに基づいて検証可能。

```nim
proc validateData*(data: StringTableRef, validKeys: varargs[string])
```

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| アプリケーションログ | `lib/pure/logging.nim`を通じてカスタムログ出力 | アプリケーション依存 |

### ログレベル

`lib/pure/logging.nim`で以下のログレベルを提供。

| レベル | 説明 |
| --- | --- |
| debug | デバッグ情報 |
| info | 通常の情報 |
| notice | 注目すべき情報 |
| warn | 警告 |
| error | エラー（バッファ即時フラッシュ） |
| fatal | 致命的エラー（バッファ即時フラッシュ） |

## セキュリティ脆弱性報告

プロジェクトのセキュリティポリシー（`security.md`）に基づき、脆弱性は以下の方法で報告する。

- メールアドレス: security@nim-lang.org
- GitHub Issuesでの報告は禁止（非公開で報告すること）
- セキュリティアドバイザリ: https://github.com/nim-lang/security/security/advisories

## 備考

### 非推奨機能

- `lib/pure/md5.nim`および`lib/std/sha1.nim`は非推奨であり、`nimble install checksums`で`checksums/md5`および`checksums/sha1`パッケージを使用することが推奨される。
- `lib/pure/random.nim`は暗号目的には使用不可。暗号目的には`lib/std/sysrand.nim`を使用すること。

### セキュリティ監査状況

`lib/std/sysrand.nim`のドキュメントに記載されているとおり、暗号学的乱数生成機能はセキュリティ専門家による監査を受けておらず、実運用環境では外部監査を推奨する。

### HTTPクライアントの警告

`lib/pure/httpclient.nim`のドキュメントに記載されているとおり、URIパーサーおよびゲッターは悪意のあるURIを検出しないため、信頼できない入力を検証する必要がある。
