
ที่มาภาพ: Unknown Source
วิธียังระบบ Data Masking อัตโนมัติใน PostgreSQL ด้วย pg‑masker บน Pipeline CI/CD
⚡ สรุป 30 วิ
การทำ *Data Masking* ในฐานข้อมูล PostgreSQL เป็นวิธีสำคัญที่ช่วยปกป้องข้อมูลส่วนบุคคลขณะพัฒนาและทดสอบระบบ โดยไม่ต้องเปิดเผยค่าเดิมเต็มรูปแบบ pg‑masker คือเครื่องมือโอเพ่นซอร์สที่ทำงานได้เร็วและรองรับก…
ภาพรวม — Overview
การทำ *Data Masking* ในฐานข้อมูล PostgreSQL เป็นวิธีสำคัญที่ช่วยปกป้องข้อมูลส่วนบุคคลขณะพัฒนาและทดสอบระบบ โดยไม่ต้องเปิดเผยค่าเดิมเต็มรูปแบบ pg‑masker คือเครื่องมือโอเพ่นซอร์สที่ทำงานได้เร็วและรองรับการกำหนดกฎแบบยืดหยุ่น บทความนี้จะอธิบายวิธีตั้งค่าการ Masking อัตโนมัติบน Pipeline CI/CD เพื่อให้ขั้นตอนทดสอบข้อมูลเป็นเรื่อง “คลิก‑หนึ่ง” เสมอ
เตรียมสภาพแวดล้อม — Setup Environment
ก่อนเริ่มใช้งานต้องตรวจสอบว่ามีสิ่งต่อไปนี้พร้อมแล้วหรือไม่
- PostgreSQL เวอร์ชัน 13 ขึ้นไป (รองรับฟังก์ชัน JSONB ที่ pg‑masker ใช้)
- Docker หรือเครื่องที่สามารถรันคอนเทนเนอร์ได้ (ใช้สำหรับสร้างสภาพแวดล้อม CI)
- ระบบ CI/CD ที่เลือก (GitHub Actions, GitLab CI, Jenkins ฯลฯ)
Tip: ควรแยกฐานข้อมูล “dev” และ “prod” อย่างชัดเจน เพื่อลดความเสี่ยงของการ Mask ข้อมูลโดยไม่ได้ตั้งใจ
ติดตั้ง pg‑masker — Install pg-masker
pg‑masker มีให้ดาวน์โหลดเป็นไบนารีและ Docker image สองรูปแบบ เราจะใช้ Docker เพื่อให้สอดคล้องกับ Pipeline
- สร้างไฟล์ `Dockerfile` สำหรับขั้นตอน Masking
```dockerfile FROM ghcr.io/ankane/pg-masker:latest WORKDIR /app COPY config.yaml . ```
- ใส่ config.yaml ที่กำหนดกฎการ Mask (ดูหัวข้อถัดไป)
- สร้างอิมเมจด้วยคำสั่ง `docker build -t pg-masker .`
กำหนดไฟล์ตั้งค่า — Configure Rules
pg‑masker อ่านไฟล์ YAML เพื่อรู้ว่าจะ Mask คอลัมน์ใดและใช้วิธีไหน
```yaml tables: users: columns: email: "hash" phone_number: "random_phone" ssn: "null" orders: columns: credit_card: "mask_all" ```
- hash สร้างค่าแฮชคงที่ (ใช้สำหรับการตรวจสอบเอกลักษณ์)
- random_phone แทนด้วยหมายเลขโทรศัพท์สุ่มในรูปแบบไทย
- null ทำให้ค่ากลายเป็น NULL เพื่อไม่เปิดเผยข้อมูลเลย
คำเตือน: อย่าใส่กฎที่ทำให้คอลัมน์สำคัญเช่น primary key ถูกเปลี่ยนค่า เพราะอาจทำให้การนำเข้า/ส่งออกล้มเหลว
สร้าง Pipeline CI/CD — Build CI Pipeline
ต่อไปเป็นขั้นตอนเพิ่ม Job ในไฟล์ CI เพื่อเรียกใช้ Docker image ที่สร้างขึ้น
ตัวอย่างใน GitHub Actions (`.github/workflows/mask.yml`)
```yaml name: Data Masking
on: push: branches: [main]
jobs: mask: runs-on: ubuntu-latest steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up PostgreSQL
uses: harmon758/postgresql-action@v1 with: postgresql version: '13'
- name: Load test data
run: | psql -U postgres -d testdb -f ./scripts/seed.sql
- name: Run pg-masker
run: | docker build -t pg-masker . docker run --rm \ -e PGHOST=localhost \ -e PGPORT=5432 \ -e PGUSER=postgres \ -e PGPASSWORD=postgres \ pg-masker mask -c config.yaml -d testdb ```
ตัวอย่างใน GitLab CI (`.gitlab-ci.yml`)
```yaml stages:
- prepare
- mask
prepare: image: postgres:13 stage: prepare script:
- psql -U postgres -d $CI_DATABASE_NAME -f scripts/seed.sql
mask: image: docker:latest services:
- docker:dind
stage: mask script:
- docker build -t pg-masker .
- docker run --rm \
-e PGHOST=$POSTGRES_HOST \ -e PGPORT=5432 \ -e PGUSER=$POSTGRES_USER \ -e PGPASSWORD=$POSTGRES_PASSWORD \ pg-masker mask -c config.yaml -d $CI_DATABASE_NAME ```
- ทุกขั้นตอนทำงานใน container isolation ทำให้ข้อมูลจริงไม่ออกจากสภาพแวดล้อม CI
- ผลลัพธ์ของการ Mask จะถูกบันทึกลงฐานข้อมูลทดสอบที่ใช้ต่อไปในขั้นตอน Unit Test หรือ Integration Test
ตรวจสอบผลลัพธ์ — Validate Output
หลังจาก Job รันสำเร็จ ควรตรวจสอบว่า *masking* ทำงานตามคาด
- ใช้ `psql` สืบค้นตัวอย่างข้อมูล
```sql SELECT email, phone_number FROM users LIMIT 5; ```
- ตรวจสอบว่าคอลัมน์ที่ตั้งค่าเป็น null มีค่า NULL จริง
- หากต้องการอัตโนมัติให้เพิ่มขั้นตอน “assert” ลงใน Pipeline
```yaml
- name: Verify masking
run: | RESULT=$(psql -U postgres -d testdb -t -c "SELECT COUNT(*) FROM users WHERE email IS NULL;") if [ "$RESULT" -ne "0" ]; then exit 1; fi ```
เปรียบเทียบวิธีการ — Comparison Table
| วิธี | ความเร็ว | การดูแลรักษา | ความเสี่ยงข้อมูล |
|---|---|---|---|
| Masking ด้วยสคริปต์ SQL เอง | ปานกลาง‑ช้า (ต้องเขียนหลายคำสั่ง) | ยากต่อการอัปเดตเมื่อ schema เปลี่ยน | สูง (ลืมคอลัมน์บางตัว) |
| pg‑masker บน CI/CD | รวดเร็ว (หนึ่งคอมมานด์) | ง่าย – แก้ config.yaml เพียงไฟล์เดียว | ต่ำ (กฎชัดเจน, ทำงานใน sandbox) |
เคล็ดลับและข้อควรระวัง — Tips & Cautions
- Version lock: ระบุเวอร์ชันของ pg‑masker และ PostgreSQL ใน Dockerfile เพื่อลดความขัดแย้งเมื่ออัปเดต CI runner
- Secret management: ใช้ secret store ของระบบ CI (GitHub Secrets, GitLab CI Variables) เก็บค่าผู้ใช้/รหัสผ่าน ฯลฯ อย่า hard‑code ลงไฟล์ YAML
- Testing first: สร้างฐานข้อมูล “sandbox” แยกจาก “test” เพื่อทดลอง config.yaml ก่อนนำไปใช้งานจริง
Tip: ถ้าต้อง Mask ข้อมูลแบบหลายภาษา (เช่น ชื่อที่มีอักขระ Unicode) ให้เลือกฟังก์ชัน `hash` หรือ `random_string` ที่รองรับ UTF‑8 เพื่อลดการเกิด “garbled text”
สรุป — Summary
pg‑masker เป็นเครื่องมือที่ช่วยทำ *Data Masking* ใน PostgreSQL ได้อย่างอัตโนมัติและยืดหยุ่น การนำมันเข้าไปใน Pipeline CI/CD ทำให้ขั้นตอนทดสอบข้อมูลเป็นเรื่อง “หนึ่งคลิก” และลดความเสี่ยงของการรั่วไหล
- เตรียมสภาพแวดล้อม Docker, PostgreSQL ≥13, ระบบ CI
- ติดตั้ง สร้าง Docker image ของ pg‑masker พร้อม config.yaml
- กำหนดกฎ ใช้ hash, random, null ตามความต้องการของคอลัมน์
- เพิ่ม Job เรียก Docker ในขั้นตอน Masking ของ CI/CD
- ตรวจสอบผล คำสั่ง SQL หรือ assert ภายใน Pipeline
การทำตามขั้นตอนเหล่านี้จะทำให้ทีมพัฒนาได้ใช้ข้อมูลทดสอบที่ปลอดภัยโดยไม่ต้องเสียเวลาปรับแก้ด้วยมือทุกครั้ง ทั้งนี้ควรอัปเดต config.yaml เมื่อ schema มีการเปลี่ยนแปลงและเก็บ credential อย่างเป็นความลับเสมอ.
แชร์บทความนี้:
ชอบบทความแบบนี้?
สมัคร AI Automate Weekly Newsletter — รับเคล็ดลับ AI + how-to ใหม่
ทุกสัปดาห์ตรงถึง inbox ฟรี ไม่มีสแปม
แหล่งข่าวต้นฉบับ
- ชื่อต้นฉบับ
- วิธียังระบบ Data Masking อัตโนมัติใน PostgreSQL ด้วย pg‑masker บน Pipeline CI/CD
- ผู้เขียน
- กองบรรณาธิการ Thai Tech News
- แหล่ง
- บทความต้นฉบับ Thai Tech News · ช่วยร่างด้วย AI, เรียบเรียง/ตรวจสอบโดยกองบรรณาธิการ
- วันที่เผยแพร่
- 17 สิงหาคม 2569 เวลา 17:51



