# 画面設計書：30-データベース暗号化

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 30 |
| 画面名 | データベース暗号化 |
| カテゴリ | データベース |
| 対応コマンド | Get-DbaDbEncryption |
| 関連機能No | 114 |

## 2. 概要・目的

データベースの暗号化インベントリ（TDE状態、証明書、非対称キー、対称キー）を取得する機能です。コンプライアンスレポートやセキュリティ監査、証明書ライフサイクル管理に使用します。

各データベース内の暗号化オブジェクトを検出し、キーアルゴリズム、キー長、所有者、バックアップ日、有効期限などの詳細情報を提供します。

## 3. 機能説明

### 3.1 検出対象

| 暗号化タイプ | 説明 |
|-------------|------|
| EncryptionEnabled (TDE) | Transparent Data Encryption |
| Certificate | 証明書 |
| Asymmetric key | 非対称キー |
| Symmetric key | 対称キー |

### 3.2 TDE情報

TDEが有効な場合、masterデータベースからサーバー証明書情報を取得:
- 証明書名
- バックアップ日
- 有効期限
- 暗号化アルゴリズム

## 4. パラメータ仕様

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|-------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | - | 対象SQLインスタンス |
| SqlCredential | PSCredential | No | - | 認証資格情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外データベース |
| IncludeSystemDBs | switch | No | $false | システムDBを含める |
| EnableException | switch | No | $false | 例外を有効化 |

## 5. 出力仕様

**型**: PSCustomObject

### 5.1 共通プロパティ

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全修飾インスタンス名 |
| Database | string | データベース名 |
| Encryption | string | 暗号化タイプ |
| Name | string | オブジェクト名 |
| Owner | string | 所有者 |
| Object | object | SMOオブジェクト |

### 5.2 タイプ別追加プロパティ

| プロパティ | TDE | Certificate | Asymmetric | Symmetric |
|-----------|-----|-------------|------------|-----------|
| LastBackup | Yes | Yes | - | - |
| PrivateKeyEncryptionType | Yes | Yes | Yes | Yes |
| EncryptionAlgorithm | Yes | - | Yes | - |
| KeyLength | - | - | Yes | Yes |
| ExpirationDate | Yes | Yes | - | - |

## 6. 処理フロー

```
[開始]
    |
    v
[Connect-DbaInstance]
    |
    v
[データベースフィルタ]
    | - Database指定 or IncludeSystemDBs or ユーザーDBのみ
    | - ExcludeDatabase適用
    | - IsAccessible確認
    v
[データベースループ]
    |
    +-- [TDE有効判定]
    |       |
    |       v
    |   [master証明書取得]
    |       | - Thumbprint照合
    |       v
    |   [TDE情報出力]
    |
    +-- [証明書ループ]
    |       |
    |       v
    |   [Certificate情報出力]
    |
    +-- [非対称キーループ]
    |       |
    |       v
    |   [Asymmetric key情報出力]
    |
    +-- [対称キーループ]
            |
            v
        [Symmetric key情報出力]
    |
    v
[終了]
```

## 7. 内部実装詳細

### 7.1 データベースフィルタ

```powershell
# Get-DbaDbEncryption.ps1 行116-126
if ($Database) {
    $dbs = $server.Databases | Where-Object Name -In $Database
} elseif ($IncludeSystemDBs) {
    $dbs = $server.Databases | Where-Object IsAccessible
} else {
    $dbs = $server.Databases | Where-Object { $_.IsAccessible -and $_.IsSystemObject -eq 0 }
}

if ($ExcludeDatabase) {
    $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase
}
```

### 7.2 TDE証明書検出

```powershell
# Get-DbaDbEncryption.ps1 行134-167
if ($db.EncryptionEnabled) {
    $returnCertificate = [PSCustomObject]@{
        ...
        Encryption = "EncryptionEnabled (TDE)"
        ...
    }

    if ($db.DatabaseEncryptionKey.EncryptionType -eq 'ServerCertificate') {
        $serverCertificate = $server.Databases['master'].Certificates | Where-Object {
            (Compare-Object -ReferenceObject $db.DatabaseEncryptionKey.Thumbprint
                           -DifferenceObject $_.Thumbprint -SyncWindow 0).Length -eq 0
        }

        $returnCertificate.Name = $serverCertificate.Name
        $returnCertificate.LastBackup = $serverCertificate.LastBackupDate
        $returnCertificate.PrivateKeyEncryptionType = $serverCertificate.PrivateKeyEncryptionType
        $returnCertificate.Owner = $serverCertificate.Owner
        $returnCertificate.ExpirationDate = $serverCertificate.ExpirationDate
        $returnCertificate.EncryptionAlgorithm = $db.DatabaseEncryptionKey.EncryptionAlgorithm
    }

    $returnCertificate
}
```

### 7.3 証明書列挙

```powershell
# Get-DbaDbEncryption.ps1 行172-188
foreach ($cert in $db.Certificates) {
    [PSCustomObject]@{
        ComputerName             = $server.ComputerName
        InstanceName             = $server.ServiceName
        SqlInstance              = $server.DomainInstanceName
        Database                 = $db.Name
        Encryption               = "Certificate"
        Name                     = $cert.Name
        LastBackup               = $cert.LastBackupDate
        PrivateKeyEncryptionType = $cert.PrivateKeyEncryptionType
        EncryptionAlgorithm      = $null
        KeyLength                = $null
        Owner                    = $cert.Owner
        Object                   = $cert
        ExpirationDate           = $cert.ExpirationDate
    }
}
```

### 7.4 非対称キー列挙

```powershell
# Get-DbaDbEncryption.ps1 行191-207
foreach ($ak in $db.AsymmetricKeys) {
    [PSCustomObject]@{
        ...
        Encryption               = "Asymmetric key"
        Name                     = $ak.Name
        PrivateKeyEncryptionType = $ak.PrivateKeyEncryptionType
        EncryptionAlgorithm      = $ak.KeyEncryptionAlgorithm
        KeyLength                = $ak.KeyLength
        Owner                    = $ak.Owner
        Object                   = $ak
        ExpirationDate           = $null
    }
}
```

### 7.5 対称キー列挙

```powershell
# Get-DbaDbEncryption.ps1 行209-224
foreach ($sk in $db.SymmetricKeys) {
    [PSCustomObject]@{
        Server                   = $server.name
        Instance                 = $server.InstanceName
        Database                 = $db.Name
        Encryption               = "Symmetric key"
        Name                     = $sk.Name
        PrivateKeyEncryptionType = $sk.PrivateKeyEncryptionType
        EncryptionAlgorithm      = $ak.EncryptionAlgorithm  # Note: 実装ではakを参照
        KeyLength                = $sk.KeyLength
        Owner                    = $sk.Owner
        Object                   = $sk
    }
}
```

## 8. 使用例

### 8.1 基本的な使用

```powershell
# インスタンス上の全ユーザーデータベースの暗号化情報を取得
Get-DbaDbEncryption -SqlInstance DEV01
```

### 8.2 特定データベースの指定

```powershell
# 特定データベースの暗号化情報を取得
Get-DbaDbEncryption -SqlInstance DEV01 -Database MyDB
```

### 8.3 除外データベースの指定

```powershell
# 特定データベースを除外して取得
Get-DbaDbEncryption -SqlInstance DEV01 -ExcludeDatabase MyDB
```

### 8.4 システムDBを含める

```powershell
# システムデータベースも含めて取得
Get-DbaDbEncryption -SqlInstance DEV01 -IncludeSystemDBs
```

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

| エラー状況 | 処理 | ソース位置 |
|-----------|------|-----------|
| 接続失敗 | Stop-Function -Continue | Get-DbaDbEncryption.ps1 行109-111 |
| データベース列挙失敗 | Stop-Function -Continue | Get-DbaDbEncryption.ps1 行127-129 |
| TDE証明書未検出 | Stop-Function -Continue | Get-DbaDbEncryption.ps1 行156-158 |

## 10. 関連コマンド

| コマンド | 関係 | 説明 |
|---------|------|------|
| Enable-DbaDbEncryption | 関連 | TDEを有効化 |
| Disable-DbaDbEncryption | 関連 | TDEを無効化 |
| Get-DbaDbEncryptionKey | 関連 | 暗号化キー取得 |
| Backup-DbaDbCertificate | 関連 | 証明書バックアップ |

## 11. 注意事項・制約

1. **TDE証明書**: masterデータベースのCertificatesコレクションから取得
2. **Thumbprint照合**: Compare-Objectで証明書を特定
3. **システムDB**: デフォルトで除外、IncludeSystemDBsで含める
4. **対称キーのバグ**: EncryptionAlgorithmがakを参照（実装上の問題）
5. **SMOオブジェクト**: Objectプロパティで元オブジェクトにアクセス可能

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

### 12.1 関連ファイル一覧

| ファイル | 種類 | 行数 | 説明 |
|---------|------|------|------|
| public/Get-DbaDbEncryption.ps1 | メインコマンド | 228 | 暗号化インベントリ取得 |

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

```
Get-DbaDbEncryption
    |
    +-- Connect-DbaInstance (行108)
    +-- $server.Databases (データベース一覧, 行117-121)
    +-- $db.EncryptionEnabled (TDE判定, 行134)
    +-- $db.DatabaseEncryptionKey (TDEキー情報, 行151)
    +-- $server.Databases['master'].Certificates (TDE証明書, 行152)
    +-- $db.Certificates (証明書一覧, 行172)
    +-- $db.AsymmetricKeys (非対称キー一覧, 行191)
    +-- $db.SymmetricKeys (対称キー一覧, 行209)
```

### 12.3 データフロー図

```
[SqlInstance]
    |
    v
[Connect-DbaInstance]
    |
    v
[$server.Databases]
    |
    | Database/IncludeSystemDBs/ExcludeDatabase フィルタ
    v
[データベースループ]
    |
    +-- EncryptionEnabled = true
    |       |
    |       v
    |   [DatabaseEncryptionKey.EncryptionType]
    |       |
    |       +-- ServerCertificate --> master証明書照合
    |       |                              |
    |       |                              v
    |       |                         [TDE出力]
    |       |
    |       +-- その他 --> [TDE出力（証明書情報なし）]
    |
    +-- $db.Certificates --> [Certificate出力]
    |
    +-- $db.AsymmetricKeys --> [Asymmetric key出力]
    |
    +-- $db.SymmetricKeys --> [Symmetric key出力]
    |
    v
[出力]
```

### 12.4 読み解きの流れ

1. **processブロック インスタンスループ (行103-226)**
   - Connect-DbaInstance（行107-111）
   - データベースフィルタ（行115-129）

2. **データベースループ (行131-225)**
   - TDE処理（行134-170）
   - 証明書処理（行172-189）
   - 非対称キー処理（行191-208）
   - 対称キー処理（行209-224）

## 13. 改訂履歴

| 日付 | バージョン | 変更内容 |
|------|-----------|---------|
| 2026-02-18 | 1.0 | 初版作成 |
