# セキュリティ設計書

## 概要

本ドキュメントは、dplyr Rパッケージ（バージョン1.2.0.9000）のセキュリティ設計について記述する。dplyrはデータフレーム操作のためのライブラリパッケージであり、Webアプリケーションとは異なるセキュリティモデルを持つ。本書では、Rパッケージとしてのセキュリティ設計観点（入力検証、コード実行の安全性、メモリ安全性等）を中心に解説する。

## 認証設計

### 認証方式

dplyrはスタンドアロンのRパッケージであり、ユーザー認証機能は提供しない。パッケージの使用はRセッション内で行われ、認証はRの実行環境（RStudio、R Console等）やオペレーティングシステムレベルで管理される。

### セッション管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション有効期限 | N/A（Rセッションに依存） | Rセッションのライフサイクルに従う |
| セッション固定化対策 | N/A | パッケージレベルでのセッション管理なし |

## 認可設計

### 権限体系

| ロール | 権限 | 説明 |
| --- | --- | --- |
| Rユーザー | 全機能 | パッケージをロードしたユーザーは全機能にアクセス可能 |

dplyrはパッケージ内での権限制御を行わない。アクセス制御はオペレーティングシステムおよびR環境レベルで実施される。

### アクセス制御

dplyrは外部リソース（データベース等）への接続機能を提供するが、実際のアクセス制御は接続先のシステム（DBI/dbplyr経由）で行われる。パッケージ自体はユーザーから与えられたデータに対して操作を実行するのみである。

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | N/A（ローカル処理パッケージ） |
| HSTS | N/A（ローカル処理パッケージ） |

dplyrはネットワーク通信機能を直接持たない。データベース接続時のセキュリティはDBIパッケージおよび各データベースドライバーに委譲される。

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | N/A（外部パッケージに委譲） |
| 保存データ | N/A（メモリ内処理のみ） |

dplyrはデータの暗号化機能を提供しない。データはRセッションのメモリ内で処理され、永続化はユーザーの責任で行われる。

### 機密情報管理

dplyrは機密情報の特別な管理機能を持たない。処理対象のデータフレーム内に機密情報が含まれる場合、その管理はユーザーおよび呼び出し元アプリケーションの責任となる。

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | N/A（Web出力機能なし） |
| SQLインジェクション | dbplyrによるクエリパラメータ化（外部パッケージ） |
| CSRF | N/A（Webアプリケーション機能なし） |

### 入力検証（Input Validation）

dplyrは以下の入力検証メカニズムを実装している：

#### 1. 型チェック関数群

`R/import-standalone-types-check.R` において、rlangパッケージからインポートされた型チェック関数を使用：

| 関数名 | 検証内容 |
| --- | --- |
| `check_bool()` | 論理値（TRUE/FALSE）の検証 |
| `check_string()` | 単一文字列の検証 |
| `check_name()` | 変数名の検証（空文字列禁止） |
| `check_number_decimal()` | 数値の検証（範囲チェック含む） |
| `check_number_whole()` | 整数の検証 |
| `check_character()` | 文字列ベクトルの検証 |
| `check_logical()` | 論理値ベクトルの検証 |
| `check_function()` | 関数の検証 |
| `check_environment()` | 環境オブジェクトの検証 |

#### 2. データフレーム検証

`R/grouped-df.R` および `R/rowwise.R` において、グループ化データフレームの検証を実施：

| 関数名 | 検証内容 |
| --- | --- |
| `validate_grouped_df()` | grouped_dfクラスの属性検証、インデックス境界チェック |
| `validate_rowwise_df()` | rowwise_dfクラスの属性検証 |

#### 3. フィルター式の検証

`R/filter.R` の `check_filter()` 関数において：

- 名前付き引数の誤用検出（`=` と `==` の混同警告）
- 論理ベクトル以外の戻り値の検出とエラー報告

#### 4. サイズ・型互換性チェック

`src/filter.cpp` において、C++レベルでの厳密な検証：

- `stop_filter_incompatible_size()`: 結果サイズの不一致検出
- `stop_filter_incompatible_type()`: 非論理型結果の検出
- `filter_is_valid_lgl()`: 論理ベクトル/行列の妥当性検証

### コード評価の安全性（Tidy Evaluation）

dplyrは「tidy evaluation」（準引用）システムを使用してユーザー式を評価する。これはユーザーがデータマスク内で任意のR式を実行できることを意味する。

#### データマスク（DataMask）の設計

`R/data-mask.R` の `DataMask` R6クラスにおいて：

| セキュリティ考慮 | 実装内容 |
| --- | --- |
| グループ間隔離 | 各グループは独立したデータマスクで評価され、副作用の伝播を防止 |
| マスクの無効化 | `forget()` メソッドにより、verb終了後のマスク使用を防止 |
| 名前の検証 | NULL名、欠損名、重複名のデータフレームを拒否 |

#### C++レベルでのマスク制御

`src/dplyr.h` において、マクロによる安全なマスク操作：

- `DPLYR_MASK_INIT()`: マスクの初期化と必要な保護
- `DPLYR_MASK_ITERATION_INIT()`: イテレーションごとの新規マスク作成
- `DPLYR_MASK_FINALISE()`: マスクのクリーンアップ

## メモリ安全性

### C/C++コードの安全性

`src/` ディレクトリ内のC++コードでは、Rの保護機構を適切に使用：

| 機構 | 用途 |
| --- | --- |
| `PROTECT()` / `UNPROTECT()` | ガベージコレクションからの保護 |
| `PROTECT_WITH_INDEX()` | インデックス付き保護（再割り当て対応） |
| `Rf_shallow_duplicate()` | 安全な浅いコピー作成 |

### エラーハンドリング

`R/conditions.R` において、構造化されたエラーハンドリングを実装：

| 機能 | 説明 |
| --- | --- |
| `dplyr_error_handler()` | 統一されたエラー処理とメッセージ生成 |
| `dplyr_warning_handler()` | 警告の蓄積と遅延表示 |
| `skip_internal_condition()` | 内部エラーの適切なアンラップ |

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| 警告ログ | dplyr verb実行中の警告 | セッション内（`last_dplyr_warnings()`で取得可能） |
| エラーログ | N/A（Rの標準エラー出力に依存） | N/A |

dplyrは永続的な監査ログ機能を提供しない。警告は `last_dplyr_warnings()` 関数で直近のコマンドの警告を確認できるが、これはセッション内の一時的な保持のみである。

## 依存パッケージのセキュリティ

dplyrは以下のパッケージに依存しており、これらのセキュリティも考慮が必要：

| パッケージ | バージョン要件 | セキュリティ関連 |
| --- | --- | --- |
| rlang | >= 1.1.7 | tidy evaluationの基盤、エラーハンドリング |
| vctrs | >= 0.7.1 | ベクトル操作の型安全性 |
| tidyselect | >= 1.2.0 | 列選択の安全な評価 |
| tibble | >= 3.2.0 | データフレームの安全な構築 |
| cli | >= 3.6.2 | ユーザーメッセージの安全な出力 |

## 備考

### Rパッケージ特有のセキュリティ考慮事項

1. **コード実行**: dplyrはtidy evaluationを通じてユーザー提供のR式を評価する。これは設計上の機能であり、ユーザーは任意のRコードを実行可能である。悪意のあるコードの実行防止は、R環境レベルまたはアプリケーションレベルで対処する必要がある。

2. **データアクセス**: dplyrはユーザーが提供したデータに対して操作を行う。データソースの認証・認可は、データ取得時点（DBI接続等）で行われる。

3. **メモリ使用**: 大規模データの処理時にメモリ不足が発生する可能性がある。これはRの制限であり、dplyr固有の問題ではない。

### 推奨されるセキュリティプラクティス

- dplyrを使用するアプリケーションでは、ユーザー入力のサニタイズをアプリケーションレベルで実施すること
- 機密データを含むデータフレームの処理後は、適切にメモリをクリアすること
- データベース接続時は、接続ドライバーのセキュリティ設定を適切に構成すること
