# セキュリティ設計書

## 概要

本ドキュメントは、SQL Server First Responder Kit のセキュリティ設計について記載します。First Responder Kit は SQL Server のヘルスチェック、パフォーマンス分析、トラブルシューティングを行うストアドプロシージャ群であり、診断ツールとしてセキュリティに関する様々なチェック機能を提供します。

## 認証設計

### 認証方式

First Responder Kit は SQL Server の認証機構に依存しており、独自の認証機構は持ちません。

| 項目 | 内容 |
| --- | --- |
| 認証方式 | SQL Server 認証 / Windows 認証（SQL Server の設定に依存） |
| 独自認証 | なし |
| 認証委譲 | SQL Server の認証基盤を使用 |

### セッション管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション有効期限 | SQL Server 依存 | SQL Server のセッション管理に従う |
| セッション固定化対策 | 該当なし | ストアドプロシージャはステートレス |

## 認可設計

### 権限体系

First Responder Kit の各ストアドプロシージャは、実行に必要な権限を明示的にチェックします。

| ロール | 権限 | 説明 |
| --- | --- | --- |
| sysadmin | 全機能アクセス | すべてのチェック項目を実行可能 |
| VIEW SERVER STATE | 基本診断機能 | サーバー状態の読み取りに必要な最小権限 |
| ALTER TRACE | トレース機能 | トレース関連のチェックに必要 |
| db_owner | データベース操作 | DBCC コマンド等の実行に必要 |

### アクセス制御

First Responder Kit は以下のアクセス制御メカニズムを実装しています：

1. **権限チェック機構** (`sp_Blitz.sql:260-435`)
   - 実行ユーザーが sysadmin でない場合、利用可能な権限を動的にチェック
   - `fn_my_permissions` を使用して権限を確認
   - 権限不足の場合は該当チェックをスキップ

2. **段階的機能制限**
   - VIEW SERVER STATE がない場合は実行を中断
   - ALTER TRACE がない場合はトレース関連チェックをスキップ
   - xp_cmdshell の EXECUTE 権限がない場合は該当チェックをスキップ

3. **データベースアクセス制御**
   - `@db_perms` テーブル変数で各データベースの SELECT 権限を確認
   - 権限のないデータベースはチェック対象から除外

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | 該当なし（データベース内ストアドプロシージャのため） |
| HSTS | 該当なし |
| 通信暗号化 | SQL Server の暗号化設定に依存 |

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | SQL Server の TLS/SSL 設定に依存 |
| 保存データ | SQL Server の TDE (Transparent Data Encryption) に依存 |
| バックアップ | Deprecated/sp_AllNightLog.sql で暗号化オプション対応（AES_128, AES_192, AES_256, TRIPLE_DES_3KEY） |

### 機密情報管理

1. **セキュリティ情報の出力制御**
   - `@OutputType = 'MARKDOWN'` の場合、セキュリティ関連の発見事項を除外 (`sp_Blitz.sql:10688`)
   - 公開出力時にセキュリティ情報が漏洩しないよう設計

2. **パスワード/認証情報**
   - ストアドプロシージャ内でパスワードを保持・処理しない
   - 認証情報は SQL Server の認証機構に委譲

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | 該当なし（T-SQL ストアドプロシージャのため Web インターフェースなし） |
| SQLインジェクション | QUOTENAME() 関数による識別子エスケープ、sp_executesql によるパラメータ化クエリ |
| CSRF | 該当なし（T-SQL ストアドプロシージャのため） |

### SQLインジェクション対策の実装例

1. **QUOTENAME による識別子サニタイズ** (`sp_Blitz.sql:1233-1237`)
   ```sql
   SELECT
       @OutputServerName = QUOTENAME(@OutputServerName),
       @OutputDatabaseName = QUOTENAME(@OutputDatabaseName),
       @OutputSchemaName = QUOTENAME(@OutputSchemaName),
       @OutputTableName = QUOTENAME(@OutputTableName);
   ```

2. **sp_executesql によるパラメータ化** (`sp_BlitzFirst.sql:234-236`)
   ```sql
   EXECUTE sp_executesql @StringToExecute,
       N'@SrvName NVARCHAR(128), @LogMessageCheckID INT, ...',
       @LocalServerName, @LogMessageCheckID, ...
   ```

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| 実行ログ | 該当なし（ストアドプロシージャ自体はログ出力機能なし） |
| 結果出力 | BlitzFirst, BlitzCache 等の出力テーブルに保存可能 | @OutputTableRetentionDays パラメータで制御（デフォルト7日） |
| SQL Server 監査 | sp_Blitz CheckID 8 で Server Audits の実行状況をチェック | SQL Server 設定に依存 |

## セキュリティチェック機能

First Responder Kit は以下のセキュリティ関連チェックを実行します：

### Priority 1（最高優先度）セキュリティチェック

| CheckID | 内容 | 説明 |
| --- | --- | --- |
| 258 | Dangerous Service Account | SQL Server サービスが LocalSystem/NT AUTHORITY\SYSTEM で実行されている |
| 259 | Dangerous Service Account | SQL Server Agent が LocalSystem/NT AUTHORITY\SYSTEM で実行されている |
| 260 | Dangerous Service Account | SQL Server サービスアカウントが Administrators グループのメンバー |
| 261 | Dangerous Service Account | SQL Server Agent サービスアカウントが Administrators グループのメンバー |

### Priority 230 セキュリティチェック

| CheckID | 内容 | 説明 |
| --- | --- | --- |
| 4 | Sysadmins | sysadmin ロールのメンバーを検出 |
| 5 | Security Admins | securityadmin ロールのメンバーを検出 |
| 6 | Jobs Owned By Users | SA 以外のユーザーが所有するジョブを検出 |
| 7 | Stored Procedure Runs at Startup | スタートアップ時に実行されるストアドプロシージャを検出 |
| 8 | Server Audits Running | サーバー監査の実行状況を確認 |
| 55 | Database Owner <> SA | データベース所有者が SA でないものを検出 |
| 57 | SQL Agent Job Runs at Startup | スタートアップ時に実行される Agent ジョブを検出 |
| 86 | Elevated Permissions on a Database | データベースへの昇格された権限を検出 |
| 104 | Control Server Permissions | CONTROL SERVER 権限を持つユーザーを検出 |
| 137 | Trustworthy Enabled | TRUSTWORTHY が有効なデータベースを検出 |
| 187 | Endpoints Owned by Users | ユーザーが所有するエンドポイントを検出 |
| 213 | Database Owner is Unknown | 所有者が不明なデータベースを検出 |
| 2301 | Invalid Active Directory Accounts | 無効な AD アカウントを検出 |

### 設定関連セキュリティチェック

| 設定項目 | デフォルト値 | CheckID | 説明 |
| --- | --- | --- | --- |
| xp_cmdshell | 0 (無効) | 1065 | コマンドシェル実行の有効/無効 |
| clr enabled | 0 (無効) | 1011 | CLR 統合の有効/無効 |
| clr strict security | 1 (有効) | 269 | CLR の厳格なセキュリティ |
| cross db ownership chaining | 0 (無効) | 1013 | クロスデータベース所有権チェーン |
| contained database authentication | 0 (無効) | 1068 | 包含データベース認証 |

## 備考

1. **最小権限の原則**
   - First Responder Kit は VIEW SERVER STATE 権限で基本機能が動作するよう設計
   - sysadmin 権限がなくても多くの診断機能を利用可能

2. **xp_cmdshell 使用時の注意**
   - CheckID 260, 261 の実行には xp_cmdshell が必要
   - xp_cmdshell が無効な場合、これらのチェックは自動的にスキップ

3. **EXECUTE AS CALLER の使用**
   - sp_BlitzFirst は `WITH EXECUTE AS CALLER` で定義
   - 実行ユーザーの権限コンテキストで動作

4. **Linked Server セキュリティ警告**
   - sp_Blitz は Linked Server の設定について警告を出力 (`sp_Blitz.sql:3325`)
   - SA などの管理者権限での接続に注意喚起
