ระบบความปลอดภัยและการควบคุมข้อมูล (Security, Governance & Privacy)
5.6 ความปลอดภัย การกำกับดูแล และความเป็นส่วนตัวข้อมูล (Security & Governance)
เพื่อปกป้องสิทธิ์ข้อมูลส่วนบุคคลตามกฎหมาย PDPA/GDPR ท่อส่งข้อมูลระดับองค์กรต้องมีมาตรการคุมสิทธิ์เข้าถึง เข้ารหัสรหัสผ่าน ปิดบังข้อมูลอ่อนไหว (PII) และมีสมุดบัญชีข้อมูล (Data Catalog) ที่ชัดเจน
- Step 1: Data Ingestion & Event Processing
- Step 2: Distributed Computation & State Management
- Step 3: Orchestration & Resource Allocation
1. การควบคุมสิทธิ์: RBAC (Role-Based) และ ABAC (Attribute-Based)
Learning Progression
- [BASIC] ปูพื้นฐานภาษาเข้าใจง่าย - เข้าใจคอนเซปต์ภาพรวมและการแก้ปัญหาเบื้องต้น
- [INTERMEDIATE] โค้ด/คอนฟิกไวยากรณ์จริง - การเขียนโค้ดเพื่อใช้งานจริงในระบบ
- [PROFESSIONAL] Under-the-hood & Performance/FinOps - กลไกเบื้องลึกและการรีดประสิทธิภาพ
Real-World Enterprise Scenario
เคสระบบการเงิน/Big Tech: การรองรับ Transaction จำนวนมหาศาลต่อวินาทีพร้อมประกัน Data Integrity สูงสุด โดยใช้สถาปัตยกรรมที่ยืดหยุ่นและการมอนิเตอร์ระดับสูง
ทฤษฎีและกลไกการทำงาน (How it works): การให้สิทธิ์เข้าถึงข้อมูลยึดหลัก Least Privilege: - **RBAC**: กำหนดสิทธิ์ตาม "บทบาท" (เช่น Role: Data_Analyst มีสิทธิ์ SELECT ตารางการเงิน) - **ABAC**: ล้ำลึกกว่าโดยกำหนดสิทธิ์จาก "คุณลักษณะ" (Attributes) เช่น แผนก, เวลา, หรือพิกัด (เช่น อนุญาตให้เข้าถึงตารางการเงิน *เฉพาะ* พนักงานแผนกบัญชีที่ล็อกอินจาก IP ภายในบริษัทในเวลางานเท่านั้น)
-- IAM Policy JSON example for ABAC in AWS Lake Formation
{
"Effect": "Allow",
"Action": "lakeformation:GetDataAccess",
"Condition": {
"StringEquals": {
"aws:PrincipalTag/Department": "Finance" -- ABAC condition
}
}
}
Use Case ในชีวิตจริง (Real-world Scenario): บริษัทข้ามชาติมีนโยบาย Data Sovereignty (อธิปไตยข้อมูล) วิศวกรใช้ ABAC กำหนดแท็ก `region=EU` ไว้ที่ตารางของชาวยุโรป ทำให้พนักงานที่ล็อกอินจากสิงคโปร์ (ซึ่งมีแท็ก `region=APAC`) ไม่สามารถคิวรี่ข้อมูลชาวยุโรปได้เลยแม้จะมี Role เป็น Admin ก็ตาม
ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การกำหนด Policy ของ ABAC ที่ซับซ้อนเกินไปอาจทำให้เกิดสภาวะ "สิทธิ์ขัดแย้ง" จนไม่มีใครเข้าตารางได้ แก้ไขโดยใช้ระบบประเมินผล Policy Simulator ทดสอบสิทธิ์ก่อนประกาศใช้จริง
2. Column-Level Encryption & Dynamic Data Masking (DDM)
ทฤษฎีและกลไกการทำงาน (How it works): เพื่อปกป้องข้อมูล PII (เช่น รหัสบัตรเครดิต): - **Column-Level Encryption**: ข้อมูลจะถูกเข้ารหัสทางคณิตศาสตร์เก็บลงดิสก์ (Encryption at rest) หากแฮกเกอร์ขโมยไฟล์ไปได้ จะเห็นแค่ตัวอักษรขยะ - **Dynamic Data Masking (DDM)**: การปิดบังข้อมูล *ขณะกำลังคิวรี่ (On-the-fly)* โดยที่ข้อมูลในดิสก์ยังเป็นของจริง หากผู้ไม่มีสิทธิ์คิวรี่ ระบบจะพ่นค่า `XXXX` ออกมาแทน
-- SQL syntax creating a Dynamic Data Masking policy in Snowflake
CREATE OR REPLACE MASKING POLICY secure_credit_card_mask AS (val string)
RETURNS string ->
CASE
WHEN CURRENT_ROLE() IN ('SECURITY_ADMIN') THEN val -- See real data
ELSE 'XXXX-XXXX-XXXX-' || SUBSTR(val, 13, 4) -- Masked for everyone else
END;
ALTER TABLE sales MODIFY COLUMN card_number SET MASKING POLICY secure_credit_card_mask;
Use Case ในชีวิตจริง (Real-world Scenario): คอลเซ็นเตอร์เปิดหน้าจอประวัติลูกค้าเพื่อรับสาย ระบบฐานข้อมูลใช้ DDM ปิดบังเลขบัตรเครดิตเหลือแค่ 4 ตัวท้ายบนหน้าเว็บ แต่เมื่อฝ่ายบัญชี (มีสิทธิ์พิเศษ) รันสรุปยอด จะสามารถดึงเลขบัตรเต็มไปตัดเงินได้ปกติ
ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การเข้ารหัส Column-Level Encryption ทำให้ไม่สามารถรันคำสั่งกลุ่ม `GROUP BY` หรือค้นหา `WHERE` แบบ Exact Match ได้รวดเร็วเพราะต้องถอดรหัสก่อน แก้ไขโดยหลีกเลี่ยงการเข้ารหัสฟิลด์ที่ต้องใช้เป็นคีย์เชื่อมตารางหลัก (Join Keys)
3. Data Cataloging (Apache Atlas & Amundsen) และ Data Lineage
ทฤษฎีและกลไกการทำงาน (How it works): เมื่อข้อมูลใน Data Lake มีเป็นแสนตาราง องค์กรต้องมี **Data Catalog** (สมุดบัญชีข้อมูล เช่น Apache Atlas หรือ Amundsen) ทำหน้าที่เป็น "Google Search สำหรับข้อมูลภายใน" ให้พนักงานค้นหาตาราง ดูพจนานุกรมข้อมูล (Data Dictionary) และดู **Data Lineage** (แผนภาพต้นน้ำ-ปลายน้ำ) ว่าข้อมูลนี้ไหลมาจากไหนและใครเป็นเจ้าของ
# Example configuration injecting OpenLineage metadata from Spark to Data Catalog
spark.conf.set("spark.extraListeners", "io.openlineage.spark.agent.OpenLineageSparkListener")
spark.conf.set("spark.openlineage.transport.url", "http://atlas-catalog-server:21000")
spark.conf.set("spark.openlineage.namespace", "pipecraft-prod")
Use Case ในชีวิตจริง (Real-world Scenario): นักวิเคราะห์การตลาดต้องการสร้างแคมเปญใหม่ แต่ไม่รู้ว่ามีตาราง "อายุลูกค้า" อยู่ที่ไหน จึงพิมพ์ค้นหาใน Amundsen ระบบแสดงตารางพร้อมขึ้น Data Lineage ชี้ให้เห็นว่าตารางนี้ถูกสร้างมาจากท่อส่งของทีม Data Engineer ชื่อ "A" ทำให้ติดต่อขอใช้งานได้ถูกคน
ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การติดตั้ง Catalog แต่ปล่อยให้ Metadata เก่าไม่อัปเดต (Stale Data) จะทำให้ไม่มีใครเชื่อถือระบบ แก้ไขโดยบังคับให้ CI/CD ดึง Schema ล่าสุดส่งอัปเดตเข้า Data Catalog อัตโนมัติทุกครั้งที่มีการเปลี่ยนโค้ดตาราง
4. การจัดการความลับ: HashiCorp Vault และ AWS Secrets Manager
ทฤษฎีและกลไกการทำงาน (How it works): การเขียนรหัสผ่าน Database หรือ API Key ฝังลงในซอร์สโค้ด (Hardcoded Credentials) ถือเป็นข้อผิดพลาดด้านความปลอดภัยขั้นร้ายแรง ระบบโปรดักชันจะนำรหัสเหล่านี้ไปฝากไว้ในตู้เซฟกลางเช่น **HashiCorp Vault** หรือ **AWS Secrets Manager** โค้ดของเราจะใช้ IAM Role ขอสิทธิ์เข้าไปเบิกคีย์มาใช้ชั่วคราวใน RAM ตอนรันไทม์เท่านั้น
# Retrieving database credentials securely from AWS Secrets Manager
import boto3
import json
def get_secret_credentials(secret_name, region_name="ap-southeast-1"):
client = boto3.client(service_name='secretsmanager', region_name=region_name)
response = client.get_secret_value(SecretId=secret_name)
return json.loads(response['SecretString'])
Use Case ในชีวิตจริง (Real-world Scenario): วิศวกรลาออก ระบบ Secrets Manager รองรับฟีเจอร์ Key Rotation สั่งหมุนเปลี่ยนรหัสผ่านฐานข้อมูลใหม่ทั้งหมดอัตโนมัติทุกๆ 30 วัน โดยที่แอปพลิเคชัน Airflow ไม่ล่มเลยเพราะมันดึงคีย์ใหม่ผ่าน API ทุกครั้งที่เริ่มงาน
ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): ถ้าระบบยิงขอ API ถี่เกินไป (เช่น 1,000 ครั้งต่อวินาที) จะโดนบล็อก Throttling Limit แก้ไขโดยให้โค้ดทำ Local Caching เก็บค่าในแรมชั่วคราวไว้ 5 นาที แล้วค่อยขอใหม่
5. การจัดการสิทธิ์ผู้บริโภคข้อมูล (GDPR/PDPA) และ Right to be Forgotten
ทฤษฎีและกลไกการทำงาน (How it works): กฎหมายคุ้มครองข้อมูลส่วนบุคคล (PDPA) ให้สิทธิ์เจ้าของข้อมูลในการร้องขอให้ลบประวัติของตนเองทิ้ง (Right to be Forgotten) ในสถาปัตยกรรม Data Lake แบบดั้งเดิม การลบข้อมูล 1 แถวจากไฟล์ Parquet 1GB ต้องใช้แรงเขียนทับไฟล์ใหม่ทั้งหมด เทคโนโลยีอย่าง **Apache Iceberg / Delta Lake** เข้ามาช่วยแก้ปัญหาโดยรองรับคำสั่ง Row-level DELETE โดยมันจะเก็บ Metadata ชี้ไปว่าแถวไหนถูกลบแล้ว ข้ามการสแกนไปได้เลย
-- PySpark SQL Purging PII rows requested under GDPR/PDPA compliance
DELETE FROM iceberg_prod.gold.customer_profiles
WHERE customer_id = 'cust_gdpr_9011'; -- Iceberg performs metadata rewrite atomically
Use Case ในชีวิตจริง (Real-world Scenario): ลูกค้ายื่นเรื่องขอลบไอดีผ่านฝ่ายกฎหมาย ระบบ Data Engineering มีจ๊อบอัตโนมัติรันทุกวันศุกร์ (Batch Purge) วิ่งไปสแกนและลบเรคคอร์ดของลูกค้ารายนั้นออกจากตาราง Data Lake ทั้งหมดอย่างไร้ร่องรอยตามกฎหมาย
ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การรัน DELETE แถวข้อมูลยิบย่อยบนตาราง Parquet ทำให้ไฟล์ฉีกขาดและคิวรี่ช้าลงอย่างรุนแรง (Small File Problem) แก้ไขโดยต้องรันคำสั่ง `VACUUM` หรือ `OPTIMIZE` เคลียร์กวาดขยะหลังจากการลบข้อมูลเสร็จสิ้น
Weekend Sandbox Challenge: Setup Dynamic Data Masking
โจทย์ปฏิบัติการ: จงเขียนจำลองคำสั่ง SQL เพื่อสร้างนโยบาย Dynamic Data Masking สำหรับซ่อนคอลัมน์อีเมล (Email) ของลูกค้า หากผู้ใช้งานไม่ใช่ `DATA_ADMIN` ให้แสดงผลเป็น `***@***.com`
# Mock SQL Masking Implementation
CREATE MASKING POLICY email_mask AS (val VARCHAR) RETURNS VARCHAR ->
CASE
WHEN CURRENT_ROLE() IN ('DATA_ADMIN') THEN val
ELSE '***@***.com'
END;
ALTER TABLE users MODIFY COLUMN email SET MASKING POLICY email_mask;
Senior Technical Interview Q&A
Q1: Role-Based Access Control (RBAC) ต่างจาก Attribute-Based Access Control (ABAC) อย่างไร?
A1: RBAC ควบคุมสิทธิ์ด้วย "ตำแหน่ง/บทบาท" แบบตายตัว เช่น กลุ่ม Data Scientist เข้าถึงตารางได้ทั้งหมด ส่วน ABAC มีความยืดหยุ่นกว่าและควบคุมระดับ "เงื่อนไขคุณลักษณะ" เช่น ยอมให้เข้าถึงได้ต่อเมื่อมีแท็กแผนกตรงกับตาราง และล็อกอินในช่วงเวลาทำการเท่านั้น ซึ่งตอบโจทย์ Governance ระดับองค์กรที่ซับซ้อนได้ดีกว่า
Q2: การทำ Column-Level Encryption เก็บในดิสก์ ต่างจากการทำ Dynamic Data Masking (DDM) ในมุมมองของความปลอดภัยอย่างไร?
A2: Column-Level Encryption ป้องกันระดับฮาร์ดแวร์/ดิสก์ (Data at rest) ข้อมูลที่ฝังในดิสก์ถูกเข้ารหัสทางคณิตศาสตร์ทั้งหมด หากมีคนขโมยฮาร์ดดิสก์ไปก็เปิดอ่านไม่ได้ ส่วน DDM ป้องกันระดับซอฟต์แวร์ (Data in transit / on-the-fly) ข้อมูลในดิสก์ยังเป็นของจริงปกติ แต่ระบบ Database จะสกัดเอาเครื่องหมาย XXXX แปะทับค่าจริงตอนพ่นผลลัพธ์คิวรี่ออกไปหน้าจอ เพื่อไม่ให้พนักงานที่ไม่มีสิทธิ์เห็นค่าจริง
ข้อดี / จุดเด่น & ข้อเสีย / ข้อควรระวัง
ข้อดี / จุดเด่น
- ปกป้องสิทธิ์ผู้ใช้และมั่นใจได้ว่าโครงสร้างธุรกิจสอดคล้องตามกฎหมายคุ้มครองข้อมูล
- สืบหาต้นเหตุความผิดพลาดของตัวเลขรายงานได้รวดเร็วผ่านโครงสร้างแผนผังข้อมูล
ข้อเสีย / ข้อควรระวัง
- การเข้ารหัสและการกรองสิทธิ์อาจจะส่งผลให้ประสิทธิภาพการคิวรีข้อมูลดึงช้าลง
- ต้องอาศัยการวางแผนโครงสร้างผู้ดูแลสิทธิ์ใช้งานตารางและการประสานงานที่รัดกุม
ปฏิบัติการจริง (Lab Practice)
แล็บ: พัฒนาสคริปต์ทำหน้ากากข้อมูลบดบังเบอร์โทรศัพท์ (Data Masking)
วิธีรันแล็บปฏิบัติการบนเครื่องจริง (Local Terminal Execution Blueprint)
เนื่องจากปฏิบัติการ Data Engineering / DevOps ระดับสูงต้องรันบน Environment จริง ขั้นตอนด้านล่างนี้คือคำสั่งสำหรับนำไปรันบน Terminal / Docker ในเครื่องของคุณ:
mkdir -p pipecraft-lab && cd pipecraft-lab python3 -m venv venv && source venv/bin/activate pip install --upgrade pip pandas polars pytest requests
# Run execution pipeline test
python3 -c "
import polars as pl
print(' [PipeCraft Lab] Running local pipeline engine...')
df = pl.DataFrame({'id': [1, 2, 3], 'status': ['SUCCESS', 'SUCCESS', 'AUDITED']})
print(df)
"
# Verify clean execution exit status echo " PipeCraft Local Lab Execution Completed Successfully!"
💡 คำแนะนำ & ทริกเด็ด
ในการทำรายงานสำหรับวิเคราะห์ทั่วไป ให้ใช้ค่า Hash Key หรือ UUID แทนชื่อจริงของลูกค้าเสมอ เพื่อลดความเสี่ยงจากการที่ข้อมูลคลังวิเคราะห์หลุดรั่วไหลสู่ภายนอก