Private Docs

Handoff — QA Review Security Baseline (สิ่งที่เหลือต้องทำ)

ผล multi-agent QA review 33 findings + checklist งานที่ต้อง apply

อัปเดต: 2026-07-02

Handoff — QA Review ชุดเอกสาร Security Baseline (advisor-substitute) + แผนเสริมให้ auditor-defensible

บันทึกเมื่อ: 2 กรกฎาคม 2026 · สถานะ: review เสร็จ ยังไม่ apply (user สั่ง “handoff ไว้ก่อน เดี๋ยวว่ากันอีกที”) AC ของงาน: Baseline ของ Backend Service ด้านความแข็งแรง/ความปลอดภัย — ให้เอาไปตอบผู้ตรวจ/ธนาคารได้ เอกสารเป้าหมายหลัก: SECURITY_BASELINE_TARGET_STATE.md (พร้อมเอกสารพี่น้อง 3 ไฟล์ในโฟลเดอร์เดียวกัน)


บริบท: session นี้ทำอะไรไป

  1. User (ผ่าน /brainstorming) ขอให้ advisor ตรวจคุณภาพชุดเอกสาร security เทียบมาตรฐานองค์กร API-GL-001 V3.0 (PDF) + Azure landing-zone HLD (ภาพ) — AC = baseline ความปลอดภัย backend service
  2. advisor() tool ล่ม (unavailable — ลอง 3 ครั้ง ตรงกับที่ HANDOFF_SECURITY_MASTER_PLAN_REREVIEW.md บันทึกไว้ว่า dead มาหลาย session) → ใช้ fallback ที่ handoff เดิมกำหนด: multi-agent Workflow review
  3. รัน Workflow wpt7e1dx9 (run id wf_51450bb6-755): 5 dimension reviewer อิสระ → merge/dedup → adversarial verify 2-lens/finding → synthesize73 agents, 0 error, 2.43M tokens
  4. ผล: 42 raw → 33 canonical → 33 ผ่าน adversarial verify (100% survive เพราะ findings ล้วนอ้าง quote+file
    ตรงตัว verify ง่าย)
  5. User พักงาน apply ไว้ → สั่งทำ handoff นี้

หลักฐานผลเต็ม (full 33 findings + verifyReason + survivors): C:\Users\SUPAKO~1\AppData\Local\Temp\claude\c--Source-Private-Atlas-docs\c987b237-88c9-4c54-a240-d591a3a01f4a\tasks\wpt7e1dx9.output ⚠️ เป็น OS temp — อาจถูกลบ. สรุป actionable ครบอยู่ด้านล่างนี้แล้ว ถ้าไฟล์หายใช้ด้านล่างได้เลย. Workflow script (rerun/resume ได้): C:\Users\supakornp\.claude\projects\c--Source-Private-Atlas-docs\c987b237-88c9-4c54-a240-d591a3a01f4a\workflows\scripts\security-baseline-doc-review-wf_51450bb6-755.js


คำตัดสินรวม (verdict)

ชุดเอกสาร พื้นฐานดี, evidence-driven, ซื่อสัตย์เรื่อง scope (§0 note บอกเองว่ารอบนี้ verify แค่ ④ UserService + ③ Package) — แต่ยังไม่ auditor-defensible เต็มตัว ต้องปิด gap ก่อนเสนอผู้ตรวจ. แก้ได้แบบ edit เฉพาะจุด ไม่ต้องรื้อโครง.

จุดแข็งที่ต้องรักษาไว้: โครง 7 หมวด API-GL-001 ชัด · claim ส่วนใหญ่มี file

· ใช้ UserService เป็น concrete template · ใช้ 🟡/“ต้อง confirm” hedge unknown แทนเดา ✅


งานที่ต้อง apply (เรียงตาม severity) — ทั้งหมดแก้ที่ Baseline เว้นระบุ

🔴 must_fix (1)

  • M-1 · APIM rate-limit over-claim — Baseline L130 ✅ Bearer 200/60s, Anon 30/60s ขัด Compliance L17 rate-limit APIM ถูก comment out (SG-20). เป็นการโชว์ control ที่ปิดอยู่ว่า active ต่อผู้ตรวจ + ตัวเลข 200/60s ไม่มี source อื่นยืนยัน. แก้: ยืนยันสถานะจริงของ APIM policy ก่อน (edge global vs per-route อาจคนละตัว) → ถ้า commented out จริง เปลี่ยน ✅ เป็น 🟡/❌ ใน Baseline L130 + Roadmap L175 + อ้าง SG-20; เอาเลข 200/60s ออกหรือ mark “per HLD design intent, ยังไม่ enforce”. ห้ามให้ 3 เอกสารขัดกันเรื่อง control ที่ตอบผู้ตรวจ.

🟡 should_fix — ธีม A: Accuracy / over-claim

  • A-1 · “fact-check 3 รอบ” (Baseline L11/L158) จริงมี 2 รอบ (Roadmap L7) → แก้เป็น “2 รอบ”, เก็บ count ที่ Roadmap ที่เดียวแล้ว reference
  • A-2 · Sentinel หมวด 3 = ✅ (Baseline L78 “ไม่มี secret hardcode”) จริง Compliance L13 = 🔴 demo project EncryptionKey ค้าง git (SG-02c) + §0 บอกเองว่าไม่ได้ verify Sentinel → ลดเป็น 🟡 + caveat หรือ mark ”— (out of verified scope)”
  • A-3 · “evidence file
    ทุก service”
    (Baseline L11/L158) จริง Roadmap mark หลายข้อ ⚠️/ต้อง confirm + ThirdPartyFX เดิมไม่อยู่ใน inventory → ลดถ้อยคำเป็น “evidence สำหรับข้อ verified; ข้อ ⚠️ ยังไม่ยืนยัน”
  • A-4 · platform-edge ✅ ไม่มี provenance — เซลล์ WAF/DDoS/rate-limit ที่ขอบ (L90/92/129/130) อ้างจาก HLD diagram ไม่ได้ verify config จริง แต่โชว์ ✅ เท่ากับเซลล์ที่ verify จากโค้ด → เพิ่ม provenance legend (✅ code-verified · ◇ HLD/config-asserted · ~ assumed-convention) แล้ว re-tag

🟡 should_fix — ธีม B: Sub-control หายเทียบ API-GL-001 §7 (เพิ่มแถวใน checklist)

  • B-1 · §1.2 Server authentication — ไม่มีแถวตรวจ upstream cert (CA/expiry/revocation/domain-match) → เพิ่มแถวหมวด 1 หรือ cross-ref หมวด 4 (Roadmap L150 ทำแล้ว)
  • B-2 · §2 Object-level authorization — หมวด 2 มีแค่ function-level (แยก read/admin) ขาด own-data-only / BOLA / IDOR (Roadmap L130 มี) → เพิ่มแถว
  • B-3 · §2 Replay/nonce — ขาด replay-attack protection (short-lived + nonce) ที่ §7(2) สั่งชัด (Roadmap L133 = 🟡) → เพิ่มแถว 🟡
  • B-4 · §5.1 Data Validation/Injection — หมวด 5 ไม่มีแถว input/response validation + กัน SQLi/OS-command (Roadmap L157 = FluentValidation, EF parameterized ✅) → เพิ่มแถว ✅
  • B-5 · §7.3 Response size/pagination — หมวด 7 มีแค่ “จำกัด request” ขาด response pagination (Roadmap L178 = 🟡) → เพิ่มแถว 🟡
  • B-6 · §5.2 (nit) HTTP-verb allowlist + Content-Type validation หาย → เพิ่ม/รวมเป็นแถวเดียว
  • B-7 · §3.1 (nit) ห้ามฝัง secret ใน API Specification (Swagger) ด้วย (Baseline L78 ครอบแค่ source/config) + PDPA destruction-evidence (Roadmap L146) หาย → ขยายถ้อยคำ/เพิ่มหมายเหตุ

🟡 should_fix — ธีม C: Infra-layer หายทั้งดง (เพิ่มหมวด/แถวใหม่)

  • C-1 · TLS ทุก hop ✅ เกินจริง (L90) — in-cluster ไม่มี mTLS/service mesh (IaC grep istio/linkerd = 0), gateway→pod/pod→pod ไม่เข้ารหัส → เปลี่ยนเป็น 🟡 (terminate/verify เฉพาะขอบ)
  • C-2 · NetworkPolicy default-deny / pod isolation / egress — ไม่มีเลย → เพิ่มแถว (สำคัญ: ปิด lateral movement ของ threat actor #2 ที่ Roadmap L105 ระบุเอง — Zero Trust B4)
  • C-3 · Container/pod hardening (runAsNonRoot, readOnlyRootFilesystem, drop capabilities) — IaC ตั้งจริงแค่ ~3/13 service (centralized/fxcodex/orchestrator); แม่แบบ ④ UserService เองก็ไม่มี → เพิ่มแถว 🟡 + ชี้ให้ standardize ที่ base Dockerfile/manifest template
  • C-4 · Key Vault access model — L78 มีแค่ “ReportToken ใน KV ✅” ขาด KV RBAC least-privilege / workload-identity (IaC มี azure.workload.identity=true + CSI ให้ credit ได้) / private-endpoint → เพิ่มแถวแยก

🟡 should_fix — ธีม D: Auth worst-case หายจากเอกสาร (survivorship bias)

  • D-1 · เพิ่ม WorkflowService + ThirdPartyFXService เป็น worst-case exception ในหมวด 1 & 2 (Baseline grep 2 ชื่อนี้ = 0 hit):
    • WorkflowServiceWorkFlow01.API/Program.cs:73-81 register BypassAuthHandler เป็น auth scheme เดียว, guard แค่ if(IsProduction()) throwactive bypass ทุก non-prod (Dev/SIT/UAT) คืน Role=Admin ให้ anonymous (แรงกว่า if(false) ของ UserService)
    • ThirdPartyFXServiceThirdPartyFX01.API/Program.cs ไม่มี AddAuthentication/[Authorize] เลย (grep = 0), MapHub("/hubs/fx-rate") anonymous, CORS AllowAnyHeader/Method/Credentialsไม่มี control ใน 7 หมวดเลยแม้แต่ Production
  • D-2 · แก้ model “4 ตัวแทน → ยกทั้ง platform” (L5) — เป็น survivorship/best-case sampling (เลือก UserService ที่ทำถูกสุด); auditor คาดหวัง risk-based/worst-case → เติม caveat ว่าเป็น inductive generalization ที่พิสูจน์ได้เฉพาะ control ใน shared-lib code; per-service auth-registration/config/deployment ต้อง scan ครบ (ชี้ Roadmap); ตั้งชื่อ exception ที่รู้แล้ว (WF/ThirdPartyFX); พิจารณาเพิ่ม coverage table ~13 service ราย service

🟡 should_fix — ธีม E: Auditor-readiness (governance)

  • E-1 · Document-control block — มีแค่ date+“Draft”; ขาด version/author/reviewer/approver sign-off/data-classification/review-cadence/changelog → เพิ่ม header + เลื่อนจาก Draft เป็น reviewed/approved ก่อนเสนอผู้ตรวจ
  • E-2 · Owner/Target-date/Severity ต่อ gap — checklist มีแต่ status icon → เพิ่มคอลัมน์ Owner + Target date + Risk severity อย่างน้อยสำหรับ 5 ข้อใน §2 และทุก cell 🟡/❌ + pointer ไป Roadmap §5 phases
  • E-3 · Requirement วัดผลไม่ได้ → แปลงเป็นเกณฑ์: max session idle/absolute TTL (แทน “720h 🟡”), cipher-suite allowlist (แทน “ควร audit”), Swagger-exposure test ต่อ env (แทน “ต้อง confirm”)

🔵 nits (ทำทีหลังได้)

  • N-1 · WAF วางผิดหมวด — อยู่หมวด 4 (Secure Communication) ควรอยู่ หมวด 7.2 เท่านั้น (ซ้ำอยู่แล้ว L129); เติมแถว cert/mutual-auth ในหมวด 4 แทน
  • N-2 · Circuit-breaker ✅ ประเมินแค่ Sentinel session-read; จุดที่ §7.1 เจตนา (ThirdParty→DGA/e-Gov external call) อยู่นอก 4 ตัวแทน → หมายเหตุ scope
  • N-3 · Security-alerting 🟡 “ยังไม่เป็นระบบ” ไม่ attribute platform monitoring (Defender/App Insights/Azure Monitor ใน HLD) → แยก infra ✅ (ต้อง confirm เปิดใช้) vs security-rules 🟡
  • N-4 · UserService dev-bypass if(false) อยู่ที่ AuthenticationExtensions.cs:38 (ไม่ใช่ Program.cs) + ยัง ship dead bypass code + TODO ค้าง → เพิ่ม evidence pointer แม่น + flag ให้ลบ dead code
  • N-5 · ShowPII remediation (L108) — ShowPII เป็น hardcoded C# gated !IsProduction() (PipelineExtensions.cs:123-126) ไม่ได้อยู่ใน Package (grep = 0) → เอา “Package” ออก; ปัญหาจริง = UserService diverge จาก template’s IsDevelopment() ไปเป็น !IsProduction(); fix = เปลี่ยนเป็น IsEnvironment('Local') หรือย้ายเป็น Package helper

Cross-doc reconcile (ถ้าเลือกแก้ทั้งชุด 4 ไฟล์)

  • X-1 · Dead links — Compliance L5 ลิงก์ SECURITY_SCAN_FINDINGS.md + SECURITY_HARDENING_PLAN.md ที่ไม่มีจริง (Glob=0) → สร้างไฟล์ (SG-ID+file
    ) หรือ repoint ไป Roadmap §3 Gap Register + inline evidence
  • X-2 · Handoff เดิม staleHANDOFF_SECURITY_MASTER_PLAN_REREVIEW.md บอก round-2 “ยังไม่ apply” แต่ Roadmap L7 บอก apply แล้ว (M1/M5/M7/S4 integrate จริง) → mark handoff เดิมเป็น SUPERSEDED/DONE หรือย้าย archive
  • X-3 · ID scheme — Roadmap ใช้ V-001/V-005/V-007, Compliance ใช้ SG-04/05 (V-001 = SG-04) ไม่มี mapping → เพิ่มตาราง map หรือรวม scheme
  • X-4 · Compliance orphan — Baseline/Roadmap ไม่อ้าง Compliance เลย (grep=0) → เพิ่ม cross-ref + note ว่า ”✅ ใน Baseline = per-control, 0/7 ใน Compliance = per-category rollup” (คนละหน่วยวัด)

วิสัยทัศน์ “เอกสารเสริมกัน” (4-doc pyramid) — ที่ user ถามตรงๆ

ไฟล์บทบาทต้องเสริม
Baselinetarget-state summary (“good looks like”), scoped 4 ตัวแทนชี้ Roadmap เป็น worst-case/full register อย่างเด่น + inline worst specimen
Roadmapfull gap register + remediation ~13 service = แหล่งความจริงเก็บ single-source metadata (round-count, inventory, applied-status)
Compliance Matrixdeep per-control audit ของ 1 ตัวแทน (Sentinel ②)repoint dead links, ให้ Baseline/Roadmap อ้างถึง
Handoff (เดิม)working/session statemark superseded

หลัก: single source of truth (metadata ซ้ำเก็บที่เดียว) + cross-ref ครบวง + unify ID + แยกหน่วยวัด + scope-boundary โปร่งใส (กันคนอ่าน Baseline เดี่ยวๆ แล้วเข้าใจ posture สูงกว่าจริง)


แนวทางที่แนะนำสำหรับ session หน้า

3 ทางที่เสนอ user (ยังไม่เลือก): (1) แก้ baseline ให้ auditor-defensible [แนะนำเป็นสเต็ปแรก] · (2) แก้ทั้งชุด 4 ไฟล์ให้ sync · (3) เขียน REVIEW report แยกไฟล์ แนะนำ: เริ่ม (1) ปิด M-1 + ธีม A–E ที่ Baseline ก่อน (ตรง AC ที่สุด) แล้วค่อยขยับ (2) reconcile cross-doc (X-1..X-4). ถ้า user อยากได้ evidence trail ค่อยทำ (3). สำคัญ: ต้อง verify APIM policy จริง (M-1) และ code claim ที่ยัง flag ก่อน apply — อย่าเชื่อเอกสารเดิมคำเดียว (ธีม A ทั้งหมดคือ over-claim ที่เคยหลุด).


Gotchas / environment notes

  • advisor() ตายทั้ง environment — ลอง 3 ครั้ง session นี้ก็ยัง unavailable. ถ้ายัง dead ให้ใช้ Workflow multi-agent review เป็น fallback (pattern ใน script wf_51450bb6-755 — 5 dim → merge → 2-lens verify → synth; resume ได้ด้วย resumeFromRunId)
  • PDF ภาษาไทย (API-GL-001...pdf ที่ C:\Users\supakornp\Downloads\) extract text เพี้ยน (font cp874 ไม่ map Unicode). วิธีที่ได้ผล: pip install pymupdf แล้ว render เป็น PNG (fitz matrix 2.2x) → Read ภาพด้วยตา (Thai ชัด). Ground-truth §7 ที่ผม verify แล้วอยู่ที่ scratchpad api-gl-001-groundtruth.md (⚠️ temp อาจถูกลบ — ถ้าหาย regenerate จากภาพหน้า 9-13)
  • Context files ที่ agent ใช้ (temp scratchpad, อาจถูกลบ): api-gl-001-groundtruth.md (§7 ground-truth 7 หมวด), azure-hld-description.md (คำอธิบาย HLD). ถ้าจะทำต่อจริงจัง แนะนำ copy 2 ไฟล์นี้เข้าโฟลเดอร์ security/02072026/ ให้ persist
  • ไฟล์ทั้งหมดใน security/02072026/ ยัง untracked ใน git — ถาม user ก่อน commit
  • ทำงานภายใต้ /brainstorming (HARD-GATE: design ก่อน approve ก่อน apply) — session หน้าถ้า apply ควรผ่าน design/approval หรือ user สั่งชัด

Suggested skills สำหรับ session หน้า

  • ถ้า user เลือกแก้เอกสาร (ทาง 1/2): ไม่ต้องใช้ skill พิเศษ — แก้ markdown ตรงๆ ด้วย Edit ตาม checklist ด้านบน (must_fix ก่อน). ก่อน apply M-1 และ code-claim ที่ flag ควร verify กับ code/policy จริงก่อน (Grep/Read repo หรือ APIM policy XML)
  • ถ้าต้องการ independent re-check หลังแก้: advisor() (ลองก่อน เผื่อกลับมา) → ถ้ายัง dead ใช้ Workflow resume จาก wf_51450bb6-755 (verify เฉพาะจุดที่แก้ ไม่ต้อง full re-review)
  • ถ้า user ขอสร้าง SECURITY_SCAN_FINDINGS.md/SECURITY_HARDENING_PLAN.md (ที่ Compliance ลิงก์หาแต่ไม่มีจริง) = scope Sentinel Gateway แยก — เริ่มจากอ่าน Backend_SentinelGatewayService/ (มี SECURITY_REVIEW.md/CHECKLIST เดิม 04062026 ที่มี SG-ID ต่อยอดได้)

References

  • เอกสารเป้าหมาย: SECURITY_BASELINE_TARGET_STATE.md · SECURITY_MASTER_PLAN_DEFENSE_ROADMAP.md · COMPLIANCE_MATRIX.md · HANDOFF_SECURITY_MASTER_PLAN_REREVIEW.md
  • มาตรฐานองค์กร: API-GL-001_API Guideline V3.0-2568.pdf (ที่ C:\Users\supakornp\Downloads\) — §7 API Security Standard = 7 หมวด (Authentication · Authorization · Data Confidentiality & Integrity · Secure Communication · Secure Coding & Configuration · Audit Log & Monitoring · Resource Adequacy)
  • Workflow ผลเต็ม: task wpt7e1dx9 output (temp path ด้านบน) · script security-baseline-doc-review-wf_51450bb6-755.js
  • ไม่มี hardcoded credential ค่าจริงถูกคัดลอกมาในเอกสารนี้ — อ้างเฉพาะ file