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

Bài 3: Phân loại Dữ liệu Y tế (PHI/ePHI) & Đánh giá Rủi ro

Phân loại dữ liệu y tế theo mức độ nhạy cảm: PHI, ePHI, PII, dữ liệu lâm sàng, dữ liệu hành chính. Xây dựng Data Classification Policy, Data Flow Mapping, Risk Assessment theo NIST SP 800-30, và thiết lập Risk Register cho hệ thống microservices y tế.

🏗️ Kiến trúc — Bài 3 Bài 3: Phân loại Dữ liệu Y tế (PHI/ePHI) & Đánh giá Rủi ro

Xây dựng Hệ thống Y tế Microservices — Quarkus, PostgreSQL, Keycloak chuẩn HIPAA

Phần 1: Kiến trúc & Nền tảng

xdev.asia

1. Data Classification Framework cho Y Tế

Kim tự tháp phân loại dữ liệu y tế — 4 cấp độ từ Public đến Restricted

1.1. Tại sao cần phân loại dữ liệu?

Không phải tất cả dữ liệu đều cần cùng mức độ bảo vệ. Phân loại dữ liệu giúp:

  • Tối ưu chi phí bảo mật: Tập trung resources vào dữ liệu quan trọng nhất
  • Tuân thủ pháp luật: Áp dụng đúng controls theo yêu cầu quy định
  • Giảm attack surface: Hạn chế phạm vi dữ liệu nhạy cảm
  • Incident response: Ưu tiên xử lý khi xảy ra breach

1.2. Healthcare Data Classification Levels

Kim tự tháp phân loại dữ liệu y tế — 4 mức từ Public đến Restricted

LevelTênVí dụEncryptionAccessAudit
4 - RESTRICTEDHạn chế tối đaHIV/AIDS, sức khỏe tâm thần, di truyền, điều trị nghiện, sức khỏe sinh sảnRequired (AES-256)Named individuals onlyFull logging, real-time alerts
3 - CONFIDENTIALBảo mậtHồ sơ bệnh án, xét nghiệm, đơn thuốc, chẩn đoán hình ảnh, BHYTRequired (AES-256)Role-based (treating clinicians)Full logging
2 - INTERNALNội bộLịch hẹn, thống kê (ẩn danh), nhân viên y tế, cấu hìnhRecommendedDepartment-basedStandard logging
1 - PUBLICCông khaiDanh mục dịch vụ, giờ làm việc, liên hệ bệnh viện, hướng dẫn SKNot requiredPublicBasic logging

1.3. Data Classification trong PostgreSQL Schema

-- 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. Data Flow Mapping

2.1. PHI Data Flow trong Microservices

Luồng dữ liệu PHI qua các microservices — từ Patient Portal qua API Gateway, Keycloak đến các services và databases

2.2. Data Flow Documentation Template

#Data ElementSourceDestinationTransportEncryptionClassification
1Patient NamePortalPatient ServiceHTTPS/TLS 1.3In-transit + At-restL3
2Lab ResultsLab InstrumentLab ServiceHL7v2/MLLP over TLSIn-transit + At-restL3
3Diagnosis CodeClinical ServiceBilling ServiceKafka (SSL)Application-levelL3
4HIV StatusClinical ServiceClinical DBJDBC/SSLColumn encryptionL4
5Audit EventAll ServicesAudit ServiceKafka (SSL)Event encryptionL2
6AppointmentScheduling ServiceNotification ServiceKafka (SSL)In-transitL2

3. Risk Assessment theo NIST SP 800-30

3.1. Risk Assessment Methodology

6 bước đánh giá rủi ro theo NIST SP 800-30 — từ xác định Threats đến Risk Response

3.2. Threat Identification cho Healthcare Microservices

Threat CategoryThreatThreat Source
ExternalSQL Injection vào Patient ServiceAttacker
ExternalRansomware mã hóa databaseCybercriminal
ExternalMITM attack trên API callsNetwork attacker
ExternalCredential stuffing vào Patient PortalBot network
InternalNhân viên truy cập PHI trái phépInsider
InternalDatabase admin export toàn bộ patient dataPrivileged user
InternalDeveloper hardcode credentialsNegligent employee
EnvironmentalDatabase corruption do hardware failureInfrastructure
EnvironmentalMất dữ liệu do thiên taiNatural disaster
Supply ChainVulnerability trong Quarkus dependencyThird-party

3.3. Vulnerability Assessment

// 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. Risk Matrix

Ma trận đánh giá rủi ro 5x5 — Likelihood x Impact từ LOW đến CRITICAL

Negligible (1)Low (2)Medium (3)High (4)Critical (5)
Very High (5)LOWMEDIUMHIGHCRITICALCRITICAL
High (4)LOWMEDIUMHIGHHIGHCRITICAL
Medium (3)LOWLOWMEDIUMHIGHHIGH
Low (2)LOWLOWLOWMEDIUMMEDIUM
Very Low (1)LOWLOWLOWLOWMEDIUM

4. Risk Register cho Healthcare Microservices

4.1. Risk Register Template

IDRisk DescriptionLikelihoodImpactRisk LevelMitigationOwnerStatus
R001SQL Injection vào Patient APIMedium (3)Critical (5)HIGHParameterized queries, input validation, WAFDev TeamMitigated
R002Insider access PHI không authorizedHigh (4)High (4)HIGHRBAC, RLS, Audit logging, DLPSecurity TeamIn Progress
R003Ransomware mã hóa patient_dbMedium (3)Critical (5)HIGHImmutable backups, network segmentation, EDROps TeamMitigated
R004Keycloak token theftMedium (3)High (4)HIGHShort-lived tokens, mTLS, DPoPDev TeamIn Progress
R005PHI exposure in logsHigh (4)High (4)HIGHLog sanitization, PHI detection in CI/CDDev TeamOpen
R006Unencrypted PHI in KafkaMedium (3)High (4)HIGHApplication-level encryption, Kafka SSLDev TeamOpen
R007Database backup theftLow (2)Critical (5)MEDIUMEncrypted backups, key managementOps TeamMitigated
R008API key/credential exposureMedium (3)High (4)HIGHVault secrets management, no hardcoded secretsAll TeamsIn Progress
R009DDoS on patient portalMedium (3)Medium (3)MEDIUMRate limiting, WAF, CDNOps TeamMitigated
R010Third-party dependency CVEHigh (4)Medium (3)HIGHAutomated scanning, Dependabot, SBOMDev TeamOngoing

4.2. Risk Treatment Plan

4 chiến lược xử lý rủi ro — Mitigate, Transfer, Accept, Avoid

  • MITIGATE (Giảm thiểu) ← Preferred cho HIGH risks: Implement controls, giảm likelihood/impact
  • TRANSFER (Chuyển giao): Cyber insurance, outsource cho specialist provider
  • ACCEPT (Chấp nhận) ← Chỉ cho LOW risks: Document risk acceptance, monitor
  • AVOID (Tránh): Loại bỏ nguồn rủi ro, thay đổi architecture

5. Data Retention Policy

5.1. Retention Requirements cho Y Tế Việt Nam

Loại dữ liệuThời gian lưu trữCơ sở pháp lý
Hồ sơ bệnh án ngoại trú10 nămThông tư 46/2018/TT-BYT
Hồ sơ bệnh án nội trú20 nămThông tư 46/2018/TT-BYT
Hồ sơ bệnh án tử vong20 nămThông tư 46/2018/TT-BYT
Kết quả xét nghiệm10 nămQuy định bệnh viện
Chẩn đoán hình ảnh10 nămQuy định bệnh viện
Audit logs6 năm (HIPAA)HIPAA §164.530(j)
Đơn thuốc5 nămLuật Dược
Consent recordsLifetime + 6 yearsHIPAA / NĐ 13/2023

5.2. Automated Retention trong 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. Tổng kết

Trong bài học này, chúng ta đã:

  • Xây dựng Data Classification Framework 4 cấp cho dữ liệu y tế
  • Tạo Data Flow Mapping cho PHI qua microservices architecture
  • Thực hiện Risk Assessment theo NIST SP 800-30 methodology
  • Thiết lập Risk Register với risk treatment plans
  • Định nghĩa Data Retention Policy theo quy định Việt Nam và HIPAA

Bài tập

  1. Phân loại tất cả tables/columns trong database hệ thống y tế của bạn theo 4 cấp
  2. Vẽ Data Flow Diagram cho 3 use cases chính: đăng ký khám, ghi nhận kết quả xét nghiệm, kê đơn thuốc
  3. Thực hiện Risk Assessment và tạo Risk Register cho ít nhất 15 risks
  4. Xây dựng Data Retention Policy phù hợp với tổ chức


◀ Bài trướcBài tiếp theo ▶
Bài 2: Kiến trúc Microservices An toàn cho Y Tế với Quarkus StackBài 4: Threat Modeling STRIDE/DREAD cho Health Information System