# 画面設計書 143-Kerberosテスト

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるSQL ServerのKerberos認証診断機能の設計仕様を定義する。

### 本画面の処理概要

SQL ServerインスタンスのKerberos認証構成に関する包括的な診断チェックを実行する機能を提供する。SPN構成問題、DNS問題、時刻同期エラー、サービスアカウント構成、ネットワーク接続問題、セキュリティポリシー設定など、Kerberos認証失敗の最も一般的な原因に対処する。

**業務上の目的・背景**：Kerberos認証は、SQL Serverの統合Windows認証において推奨される認証プロトコルである。しかし、SPNの欠落、時刻同期のずれ、DNS設定の問題など、様々な要因でKerberos認証が失敗し、NTLMにフォールバックする。本機能を使用することで、Kerberos認証が正常に機能しているかを診断し、問題がある場合は具体的な修復手順を提示できる。

**画面へのアクセス方法**：PowerShellコンソールまたはスクリプトから以下のコマンドを実行する。
- `Test-DbaKerberos -SqlInstance <インスタンス名>` - SQL Serverインスタンスの診断
- `Test-DbaKerberos -ComputerName <コンピュータ名>` - コンピュータレベルの診断

**主要な操作・処理内容**：
9カテゴリ、約20+チェックを実行：
1. SPN（1-2+チェック）：SPN登録確認、AGリスナーSPN確認
2. 時刻同期（2チェック）：クライアント-サーバー間、サーバー-DC間
3. DNS（3チェック）：正引き、逆引き、CNAME検出
4. サービスアカウント（3チェック）：アカウントタイプ、ロック状態、委任設定
5. 認証（1チェック）：現在の認証方式
6. ネットワーク（3チェック）：TCP/88、TCP/389、TCP/464ポート接続
7. セキュリティポリシー（3チェック）：暗号化タイプ、セキュアチャネル、hostsファイル
8. SQL構成（2チェック）：サービスアカウント構成、ネットワークプロトコル
9. クライアント（1チェック）：Kerberosチケットキャッシュ

**画面遷移**：CLIベースのため画面遷移は存在しない。出力結果をWhere-Objectでフィルタリングし、失敗したチェックのみ表示するなどの操作が可能。

**権限による表示制御**：一部チェックはリモートWinRM接続やActive Directoryクエリに権限が必要。Credentialパラメータで代替資格情報を指定可能。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 343 | Test-DbaKerberos | 主機能 | Kerberos認証の包括的診断 |
| 345 | Test-DbaSpn | 補助機能 | SPN登録チェック |
| 344 | Test-DbaAgSpn | 補助機能 | AGリスナーSPNチェック |
| - | Test-DbaConnectionAuthScheme | 補助機能 | 認証方式チェック |
| - | Get-DbaAgListener | 補助機能 | AGリスナー取得 |
| - | Get-DbaNetworkConfiguration | 補助機能 | ネットワーク構成取得 |
| - | Resolve-DbaNetworkName | 補助機能 | ネットワーク名解決 |

## 画面種別

コマンドラインインターフェース（CLI）/ PowerShell関数

## URL/ルーティング

```powershell
# SQL Serverインスタンスのテスト
Test-DbaKerberos -SqlInstance <インスタンス名>

# 複数インスタンスのテスト
Test-DbaKerberos -SqlInstance sql2016, sql2019

# コンピュータレベルのテスト
Test-DbaKerberos -ComputerName <コンピュータ名>

# 資格情報を指定してテスト
Test-DbaKerberos -SqlInstance sql2016 -SqlCredential (Get-Credential) -Credential (Get-Credential)

# 失敗したチェックのみ表示
Test-DbaKerberos -SqlInstance sql2016 | Where-Object Status -eq "Fail"

# SPNカテゴリのみ表示
Test-DbaKerberos -SqlInstance sql2016 | Where-Object Category -eq "SPN"
```

## 入出力項目

### Test-DbaKerberos パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | Yes* | テスト対象SQL Serverインスタンス（パイプライン入力可） |
| ComputerName | DbaInstanceParameter[] | Yes* | テスト対象コンピュータ名（SQL Server固有チェックはスキップ） |
| SqlCredential | PSCredential | No | SQL Server接続用資格情報 |
| Credential | PSCredential | No | リモートWinRMおよびADクエリ用資格情報 |
| EnableException | switch | No | 例外処理モードの有効化 |

*SqlInstanceとComputerNameはパラメータセットで排他的。どちらか一方が必須。

## 表示項目

### Test-DbaKerberos 出力

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | テスト対象コンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名（ComputerName使用時はnull） |
| Check | string | 診断チェック名 |
| Category | string | カテゴリ（SPN/Time Sync/DNS/Service Account/Authentication/Network/Security Policy/SQL Configuration/Client） |
| Status | string | 結果ステータス（Pass/Fail/Warning） |
| Details | string | チェック結果の詳細 |
| Remediation | string | 修復推奨アクション（Passの場合は"None"） |

## イベント仕様

### 1-SPN登録チェック（Check: SPN Registration）

**処理フロー**
1. Test-DbaSpnを内部で呼び出しSPN登録状況を取得
2. IsSet=falseのSPNがあればFail、なければPass
3. 欠落SPNがある場合、修復手順としてSet-DbaSpnまたはsetspn.exeを提示

### 2-AGリスナーSPNチェック（Check: AG Listener SPN - {リスナー名}）

**処理フロー**
1. Get-DbaAgListenerでAGリスナーを取得
2. 各リスナーに対してTest-DbaAgSpnを実行
3. AGリスナーごとに個別の結果オブジェクトを出力

### 3-時刻同期チェック（クライアント-サーバー）

**処理フロー**
1. クライアントの現在時刻を取得
2. SQLインスタンス使用時はGETDATE()でサーバー時刻を取得
3. ComputerName使用時はInvoke-CommandでGet-Dateを実行
4. 時刻差が5分以上でFail、2-5分でWarning、2分未満でPass

### 4-時刻同期チェック（サーバー-DC）

**処理フロー**
1. ドメインコントローラを取得
2. w32tmコマンドまたはInvoke-CommandでDCとの時刻差を取得
3. 5分以上でFail、5分未満でPass

### 5-DNS正引きチェック

**処理フロー**
1. System.Net.Dns.GetHostEntry()でFQDNを解決
2. System.Net.Dns.GetHostAddresses()でIPアドレスを取得
3. 両方成功でPass、失敗でFail

### 6-DNS逆引きチェック

**処理フロー**
1. IPアドレスを取得
2. System.Net.Dns.GetHostEntry()でホスト名を逆引き
3. 成功でPass、失敗でWarning

### 7-CNAME検出チェック

**処理フロー**
1. nslookupコマンドで名前解決
2. "canonical name"が含まれていればCNAMEレコードと判定しFail
3. CNAMEはKerberos認証を破壊するため

### 8-サービスアカウントタイプチェック

**処理フロー**
1. $server.ServiceAccountでサービスアカウントを取得
2. gMSA/コンピュータアカウント/ドメインアカウント/仮想アカウント/LocalSystem/NetworkServiceの場合Pass
3. ローカルアカウントの場合Fail

### 9-アカウントロック状態チェック

**処理フロー**
1. DirectorySearcherでADアカウントを検索
2. lockoutTimeとuserAccountControlを確認
3. ロック中またはDisabledの場合Fail

### 10-委任設定チェック

**処理フロー**
1. DirectorySearcherでADアカウントを検索
2. userAccountControlのビット1048576（NOT_DELEGATED）を確認
3. 設定されている場合Fail（委任が禁止されている）

### 11-認証方式チェック

**処理フロー**
1. Test-DbaConnectionAuthSchemeを呼び出し
2. KERBEROSならPass、NTLMならFail

### 12-ネットワークポートチェック（TCP/88, TCP/389, TCP/464）

**処理フロー**
1. ドメインコントローラを取得
2. Test-NetConnectionで各ポートへの接続テスト
3. 成功でPass、失敗でFail（464はWarning）

### 13-Kerberos暗号化タイプチェック

**処理フロー**
1. レジストリKerberos\Parameters\SupportedEncryptionTypesを確認
2. RC4_HMAC_MD5が有効または未設定でPass

### 14-コンピュータセキュアチャネルチェック

**処理フロー**
1. Test-ComputerSecureChannelを実行
2. TrueでPass、FalseでFail

### 15-hostsファイルチェック

**処理フロー**
1. C:\Windows\System32\drivers\etc\hostsを読み取り
2. コメント以外のエントリがあればWarning

### 16-SQLサービスアカウント構成チェック

**処理フロー**
1. サービスアカウントタイプを詳細確認
2. gMSA/ドメインアカウントでPass、ローカルアカウントでFail

### 17-ネットワークプロトコル構成チェック

**処理フロー**
1. Get-DbaNetworkConfigurationでTCP/IP有効状態を確認
2. 有効でPass、無効でWarning

### 18-Kerberosチケットキャッシュチェック

**処理フロー**
1. klistコマンドを実行
2. MSSQLSvcチケットがあればPass、なければWarning

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 全チェック | なし | N/A | 診断のみ、データベース更新なし |

本機能は診断専用であり、SQL Serverデータベースへの更新は行わない。

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|---------------|---------|
| MSG001 | Pass | "All required SPNs are registered correctly" | SPN登録が正常 |
| MSG002 | Fail | "Missing SPNs: {SPN一覧}" | SPNが欠落 |
| MSG003 | Fail | "Time difference of X minutes exceeds 5 minute Kerberos threshold" | 時刻差5分超 |
| MSG004 | Pass | "Time difference of X minutes is within acceptable range" | 時刻差2分未満 |
| MSG005 | Fail | "Forward lookup failed for {コンピュータ名}" | DNS正引き失敗 |
| MSG006 | Fail | "CNAME record detected. CNAMEs break Kerberos authentication." | CNAMEレコード検出 |
| MSG007 | Fail | "Service account is locked out in Active Directory" | アカウントロック |
| MSG008 | Fail | "Account is marked as sensitive and cannot be delegated" | 委任禁止設定 |
| MSG009 | Fail | "Currently using NTLM authentication instead of Kerberos" | NTLM使用中 |
| MSG010 | Pass | "Currently using Kerberos authentication" | Kerberos使用中 |
| MSG011 | Fail | "Computer secure channel to domain is broken" | セキュアチャネル破損 |

## 例外処理

| 例外条件 | 対応処理 |
|---------|---------|
| SQL Server接続失敗 | Stop-Functionでエラー記録、Continueで次ターゲットへ |
| AD接続失敗 | Warningステータスで結果出力、チェック継続 |
| リモートWinRM接続失敗 | Warningステータスで結果出力、チェック継続 |
| ドメインコントローラ取得失敗 | 関連チェックをWarningで出力 |
| AGリスナー取得失敗 | 例外をキャッチし、AGチェックをスキップ |

## 備考

- ComputerNameパラメータ使用時は、SQL Server固有のチェック（サービスアカウント、認証方式、ネットワークプロトコル）がスキップされる
- AGリスナーが存在する場合、リスナーごとにSPNチェックが追加される
- 時刻同期は5分がKerberosのデフォルト閾値
- CNAMEレコードはKerberos認証を破壊するため、必ずAレコードを使用する必要がある
- 出力はリアルタイムで各チェック完了時に即座に返される

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

各チェックが返すPSCustomObjectの構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 91-107行目: .OUTPUTSセクション - 出力オブジェクト構造 |
| 1-2 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 207-215行目: 最初のPSCustomObject出力例（SPNチェック） |

**読解のコツ**: 全チェックが同一構造のPSCustomObjectを返す。ComputerName, InstanceName, Check, Category, Status, Details, Remediationの7プロパティ。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 145-154行目: パラメータ定義 |
| 2-2 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 155-158行目: ターゲット決定ロジック |
| 2-3 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 161-173行目: SQL接続またはComputerName処理 |

**主要処理フロー**:
- **156行目**: パラメータセットに基づきターゲットを決定
- **163行目**: Connect-DbaInstanceでSQL Server接続
- **177行目以降**: Tier 1チェック開始

#### Step 3: Tier 1チェック（必須チェック）を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 179-270行目: SPNチェック |
| 3-2 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 272-451行目: 時刻同期チェック |
| 3-3 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 453-588行目: DNSチェック |
| 3-4 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 590-787行目: サービスアカウントチェック |
| 3-5 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 789-835行目: 認証方式チェック |

**主要処理フロー（SPNチェック）**:
- **183-188行目**: Test-DbaSpn呼び出しのsplat構築
- **196行目**: IsSet=falseのSPNをフィルタリング
- **207-215行目**: 結果オブジェクト出力

#### Step 4: Tier 2チェック（追加診断）を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 841-955行目: ネットワークポートチェック |
| 4-2 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 956-1106行目: セキュリティポリシーチェック |
| 4-3 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 1108-1208行目: SQL構成チェック |
| 4-4 | Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | 1210-1254行目: クライアントチェック |

#### Step 5: 補助機能との連携を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | Test-DbaSpn.ps1 | `public/Test-DbaSpn.ps1` | SPN登録確認の詳細ロジック |
| 5-2 | Test-DbaAgSpn.ps1 | `public/Test-DbaAgSpn.ps1` | AGリスナーSPN確認ロジック |
| 5-3 | Test-DbaConnectionAuthScheme.ps1 | `public/Test-DbaConnectionAuthScheme.ps1` | 認証方式取得ロジック |

### プログラム呼び出し階層図

```
Test-DbaKerberos
    │
    ├─ Connect-DbaInstance (SQL接続)
    │
    ├─ [SPN Checks]
    │      ├─ Test-DbaSpn (SPN登録確認)
    │      │      └─ Get-DbaADObject
    │      │
    │      └─ Get-DbaAgListener → Test-DbaAgSpn
    │             └─ Get-DbaADObject
    │
    ├─ [Time Sync Checks]
    │      ├─ $server.Query("SELECT GETDATE()") or Invoke-Command
    │      └─ w32tm /stripchart or Invoke-Command (DC時刻)
    │
    ├─ [DNS Checks]
    │      ├─ System.Net.Dns.GetHostEntry()
    │      ├─ System.Net.Dns.GetHostAddresses()
    │      └─ Invoke-Command { nslookup }
    │
    ├─ [Service Account Checks]
    │      ├─ $server.ServiceAccount
    │      └─ DirectorySearcher (AD検索)
    │
    ├─ [Authentication Check]
    │      └─ Test-DbaConnectionAuthScheme
    │
    ├─ [Network Checks]
    │      └─ Test-NetConnection (ports 88, 389, 464)
    │
    ├─ [Security Policy Checks]
    │      ├─ Invoke-Command { Get-ItemProperty HKLM:\...\Kerberos }
    │      ├─ Invoke-Command { Test-ComputerSecureChannel }
    │      └─ Invoke-Command { Get-Content hosts }
    │
    ├─ [SQL Configuration Checks]
    │      └─ Get-DbaNetworkConfiguration
    │
    └─ [Client Checks]
           └─ klist command
```

### データフロー図

```
[入力]                         [処理]                              [出力]

SqlInstance/ComputerName ───▶ ターゲット判定
                                    │
                                    ▼
                              Connect-DbaInstance (Optional)
                                    │
                                    ▼
                              ┌───────────────────┐
                              │   Tier 1 Checks   │
                              ├───────────────────┤
                              │ SPN Check         │───▶ PSCustomObject
                              │ Time Sync Checks  │───▶ PSCustomObject
                              │ DNS Checks        │───▶ PSCustomObject
                              │ Service Account   │───▶ PSCustomObject
                              │ Authentication    │───▶ PSCustomObject
                              └───────────────────┘
                                    │
                                    ▼
                              ┌───────────────────┐
                              │   Tier 2 Checks   │
                              ├───────────────────┤
                              │ Network Ports     │───▶ PSCustomObject
                              │ Security Policy   │───▶ PSCustomObject
                              │ SQL Config        │───▶ PSCustomObject
                              │ Client            │───▶ PSCustomObject
                              └───────────────────┘
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Test-DbaKerberos.ps1 | `public/Test-DbaKerberos.ps1` | ソース | Kerberos診断メイン関数 |
| Test-DbaSpn.ps1 | `public/Test-DbaSpn.ps1` | ソース | SPN登録確認 |
| Test-DbaAgSpn.ps1 | `public/Test-DbaAgSpn.ps1` | ソース | AGリスナーSPN確認 |
| Test-DbaConnectionAuthScheme.ps1 | `public/Test-DbaConnectionAuthScheme.ps1` | ソース | 認証方式確認 |
| Get-DbaAgListener.ps1 | `public/Get-DbaAgListener.ps1` | ソース | AGリスナー取得 |
| Get-DbaNetworkConfiguration.ps1 | `public/Get-DbaNetworkConfiguration.ps1` | ソース | ネットワーク構成取得 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
