Chuyển đến nội dung chính

レッスン 3: 健康データ分類 (PHI/ePHI) とリスク評価

医療データを機密レベルに従って分類します: PHI、ePHI、PII、臨床データ、管理データ。 NIST SP 800-30 に従ってデータ分類ポリシー、データ フロー マッピング、リスク評価を開発し、医療マイクロサービス システムのリスク レジスタを設定します。

🏗️ アーキテクチャ — レッスン 3 レッスン 3: 医療データ分類 (PHI/ePHI) & リスク評価

マイクロサービス ヘルスケア システムの構築 — HIPAA 標準を備えた Quarkus、PostgreSQL、Keycloak

パート 1: アーキテクチャとプラットフォーム

xdev.asia

1. 医療向けのデータ分類フレームワーク

医療データ分類ピラミッド — 公開から制限付きまでの 4 レベル

###1.1.データを分類する必要があるのはなぜですか?

すべてのデータに同じレベルの保護が必要なわけではありません。データ分類は次のことに役立ちます。

  • セキュリティ コストの最適化: リソースを最も重要なデータに集中させます
  • 法的遵守: 規制要件に従って正しい管理を適用します。
  • 攻撃対象領域を削減: 機密データの範囲を制限します
  • インシデント対応: 侵害が発生した場合の対処を優先します。

###1.2.医療データの分類レベル

医療データ分類ピラミッド — 公開から制限付きまでの 4 レベル

レベル名前例暗号化アクセス監査
4 - 制限付き最大制限HIV/エイズ、メンタルヘルス、遺伝学、依存症治療、リプロダクティブ・ヘルス必須 (AES-256)指名された個人のみ完全なログ記録、リアルタイムのアラート
3 - 機密セキュリティカルテ、検査、処方箋、画像診断、健康保険必須 (AES-256)役割ベース(治療臨床医)完全なログ
2 - 内部内部予約スケジュール、統計 (匿名)、医療スタッフ、構成おすすめ部門別標準ロギング
1 - パブリックパブリックサービス、勤務時間、病院の連絡先、健康上の指示のリスト不要パブリック基本的なロギング

###1.3. PostgreSQL スキーマにおけるデータ分類

-- Data classification metadata table
CREATE TABLE data_classification (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    schema_name VARCHAR(100) NOT NULL,
    table_name VARCHAR(100) NOT NULL,
    column_name VARCHAR(100) NOT NULL,
    classification_level INTEGER NOT NULL CHECK (classification_level BETWEEN 1 AND 4),
    classification_label VARCHAR(50) NOT NULL,
    contains_phi BOOLEAN DEFAULT false,
    encryption_required BOOLEAN DEFAULT false,
    masking_rule VARCHAR(100),
    retention_days INTEGER,
    legal_basis TEXT,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Ví dụ classification cho patient table
INSERT INTO data_classification (schema_name, table_name, column_name,
    classification_level, classification_label, contains_phi, encryption_required, masking_rule)
VALUES
    ('public', 'patients', 'id', 2, 'INTERNAL', false, false, NULL),
    ('public', 'patients', 'full_name', 3, 'CONFIDENTIAL', true, true, 'PARTIAL_MASK'),
    ('public', 'patients', 'date_of_birth', 3, 'CONFIDENTIAL', true, false, 'YEAR_ONLY'),
    ('public', 'patients', 'cccd_number', 3, 'CONFIDENTIAL', true, true, 'FULL_MASK'),
    ('public', 'patients', 'phone', 3, 'CONFIDENTIAL', true, true, 'PARTIAL_MASK'),
    ('public', 'patients', 'email', 3, 'CONFIDENTIAL', true, true, 'PARTIAL_MASK'),
    ('public', 'patients', 'address', 3, 'CONFIDENTIAL', true, true, 'CITY_ONLY'),
    ('public', 'patients', 'blood_type', 2, 'INTERNAL', false, false, NULL),
    ('public', 'patients', 'hiv_status', 4, 'RESTRICTED', true, true, 'FULL_MASK'),
    ('public', 'patients', 'insurance_number', 3, 'CONFIDENTIAL', true, true, 'PARTIAL_MASK');

2. データ フロー マッピング

###2.1.マイクロサービスにおける PHI データ フロー

マイクロサービス間の PHI データの流れ — 患者ポータルから API ゲートウェイ、Keycloak を経て、サービスとデータベースまで

###2.2.データ フロー ドキュメント テンプレート

#データ要素出典目的地交通機関暗号化分類
1患者名ポータル患者サービスHTTPS/TLS 1.3輸送中 + 静止中L3
2ラボの結果実験器具ラボサービスTLS 上の HL7v2/MLLP輸送中 + 静止中L3
3診断コード臨床サービス請求サービスカフカ (SSL)アプリケーションレベルL3
4HIV ステータス臨床サービス臨床DBJDBC/SSL列の暗号化L4
5監査イベントすべてのサービス監査サービスカフカ (SSL)イベントの暗号化L2
6予約スケジューリングサービス通知サービスカフカ (SSL)輸送中L2

3. NIST SP 800-30 に基づくリスク評価

###3.1.リスク評価方法

NIST SP 800-30 に従ってリスクを評価する 6 つのステップ — 脅威の特定からリスク対応まで

###3.2.医療マイクロサービスの脅威の特定

脅威カテゴリ脅威脅威の発生源
外部患者サービスへの SQL インジェクション攻撃者
外部ランサムウェアはデータベースを暗号化しますサイバー犯罪
外部API 呼び出しに対する MITM 攻撃ネットワーク攻撃
外部患者ポータルへの資格情報の詰め込みボットネットワーク
内部従業員による PHI への不正アクセスインサイダー
内部データベース管理者はすべての患者データをエクスポートします特権ユーザー
内部開発者のハードコード資格情報怠慢な従業員
環境ハードウェア障害によるデータベースの破損インフラ
環境自然災害によるデータ損失自然災害
サプライチェーンQuarkus 依存関係の脆弱性サードパーティ

###3.3.脆弱性評価

// Ví dụ: Checklist kiểm tra vulnerabilities trong Quarkus service
public class SecurityVulnerabilityChecklist {

    // V1: SQL Injection - Sử dụng parameterized queries
    // ❌ VULNERABLE
    String badQuery = "SELECT * FROM patients WHERE name = '" + userInput + "'";

    // ✅ SECURE
    @NamedQuery(name = "Patient.findByName",
                query = "SELECT p FROM Patient p WHERE p.name = :name")
    List<Patient> findByName(@Param("name") String name);

    // V2: Broken Authentication - Token validation
    // ❌ VULNERABLE: Không verify token
    String userId = jwt.getClaim("sub"); // Không verify expiration, issuer

    // ✅ SECURE: Quarkus OIDC tự động verify
    @Authenticated
    @RolesAllowed("doctor")
    public Response getPatient(UUID id) { ... }

    // V3: Sensitive Data Exposure in Logs
    // ❌ VULNERABLE
    log.info("Patient created: " + patient.toString()); // Logs PHI!

    // ✅ SECURE
    log.info("Patient created: id={}", patient.getId()); // Only log ID
}

###3.4.リスクマトリクス

5x5 リスク評価マトリックス — 可能性 x 低レベルから重大レベルまでの影響

無視できる (1)低 (2)中 (3)高 (4)クリティカル (5)
非常に高い (5)低い中高いクリティカルクリティカル
高 (4)低い中高い高いクリティカル
中 (3)低い低い中高い高い
低 (2)低い低い低い中中
非常に低い (1)低い低い低い低い中

4. 医療マイクロサービスのリスク登録

###4.1.リスク登録テンプレート

IDリスクの説明可能性影響リスクレベル緩和オーナーステータス
R001患者 API への SQL インジェクション中 (3)クリティカル (5)高いパラメータ化されたクエリ、入力検証、WAF開発チーム緩和
R002インサイダー アクセス PHI は許可されていません高 (4)高 (4)高いRBAC、RLS、監査ログ、DLPセキュリティチーム進行中
R003ランサムウェアは、patient_db を暗号化します。中 (3)クリティカル (5)高い不変バックアップ、ネットワークセグメンテーション、EDR運用チーム緩和
R004Keycloakトークンの盗難中 (3)高 (4)高い有効期間の短いトークン、mTLS、DPoP開発チーム進行中
R005ログ内の PHI 暴露高 (4)高 (4)高いログのサニタイズ、CI/CD での PHI 検出開発チーム開く
R006Kafka の暗号化されていない PHI中 (3)高 (4)高いアプリケーションレベルの暗号化、Kafka SSL開発チーム開く
R007データベースのバックアップの盗難低 (2)クリティカル (5)中暗号化されたバックアップ、キー管理運用チーム緩和
R008API キー/認証情報の公開中 (3)高 (4)高いVault シークレット管理、ハードコーディングされたシークレットなしすべてのチーム進行中
R009患者ポータルでの DDoS中 (3)中 (3)中レート制限、WAF、CDN運用チーム緩和
R010サードパーティの依存関係 CVE高 (4)中 (3)高い自動スキャン、Dependabot、SBOM開発チーム継続中

###4.2.リスク治療計画

4 つのリスク処理戦略 — 軽減、移転、受け入れ、回避

  • 軽減 ← リスクが高い場合に推奨: コントロールを実装し、可能性/影響を軽減します。
  • TRANSFER (転送): サイバー保険、専門プロバイダーへのアウトソーシング
  • ACCEPT (受け入れる) ← 低リスクの場合のみ: リスク受容の文書化、モニタリング
  • AVOID (回避): リスク源を排除し、アーキテクチャを変更します。

5. データ保持ポリシー

###5.1.ベトナムの健康に関する保持要件

データ型保管時間法的根拠
外来診療記録10年回覧 46/2018/TT-BYT
入院患者の医療記録20年回覧 46/2018/TT-BYT
死亡医療記録20年回覧 46/2018/TT-BYT
テスト結果10年病院の規則
画像診断10年病院の規則
監査ログ6 年 (HIPAA)HIPAA §164.530(j)
処方箋5年薬事法
同意記録生涯 + 6 年HIPAA / 政令 13/2023

###5.2. PostgreSQL での自動保存

-- Partition strategy for data retention
CREATE TABLE audit_events (
    id UUID DEFAULT gen_random_uuid(),
    event_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    event_type VARCHAR(50) NOT NULL,
    actor_id UUID NOT NULL,
    resource_type VARCHAR(100) NOT NULL,
    resource_id UUID,
    action VARCHAR(20) NOT NULL,
    outcome VARCHAR(20) NOT NULL,
    details JSONB
) PARTITION BY RANGE (event_time);

-- Create monthly partitions
CREATE TABLE audit_events_2026_01 PARTITION OF audit_events
    FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');

CREATE TABLE audit_events_2026_02 PARTITION OF audit_events
    FOR VALUES FROM ('2026-02-01') TO ('2026-03-01');

-- Automated partition management
-- Drop partitions older than retention period (6 years for HIPAA)
-- Archive to cold storage before dropping

6. まとめ

このレッスンでは次のことを行います。

  • 医療データのための 4 レベルの データ分類フレームワーク を開発する
  • マイクロサービス アーキテクチャ経由で PHI の データ フロー マッピング を作成
  • NIST SP 800-30 方法論に従って リスク評価 を実行します
  • リスク治療計画を含む リスク登録 を設定します
  • ベトナムの規制および HIPAA に基づく データ保持ポリシー の定義

演習

  1. 医療システム データベース内のすべてのテーブル/列を 4 つのレベルに分類します。
  2. 3 つの主な使用例のデータ フロー図を作成します: 検査への登録、検査結果の記録、薬の処方
  3. リスク評価を実行し、少なくとも 15 個のリスクについてリスク登録を作成します
  4. 組織に適したデータ保持ポリシーを策定する


◀ 前の記事次の記事 ▶
レッスン 2: Quarkus Stack を使用した医療向けの安全なマイクロサービス アーキテクチャレッスン 4: 医療情報システムの STRIDE/DREAD の脅威モデリング