บทที่ 7

ความปลอดภัย

2FA · Row-Level Security · PDPA · Data Privacy · สิทธิ์การเข้าถึง

2FA (Two-Factor Authentication)

ระบบบังคับใช้ 2FA สำหรับ ครู · School Admin · System Admin (ยกเว้นนักเรียน) เพื่อป้องกันการ login จากคนที่ได้ password ไป

เทคโนโลยีที่ใช้

  • TOTP (RFC 6238) — รหัส 6 หลักเปลี่ยนทุก 30 วินาที
  • Secret เก็บในฐานข้อมูลแบบ encrypted (AES-256-GCM)
  • TOTP_ENCRYPTION_KEY อยู่ใน server-only env var
  • รองรับทุกแอป: Google Authenticator · Microsoft Authenticator · Authy · 1Password

Row-Level Security (RLS)

ข้อมูลทุกโรงเรียนถูกแยกจากกันระดับ database row ไม่ใช่แค่ code · แม้ code มี bug ก็ไม่สามารถให้ user โรงเรียน A เห็นข้อมูลโรงเรียน B ได้

หลักการ

  • ทุก SELECT/INSERT/UPDATE/DELETE ผ่าน PostgreSQL RLS policies
  • User สามารถเห็นข้อมูลเฉพาะเมื่อ user_profiles.school_id = current_user_school()
  • ครูเห็นเฉพาะห้องที่ teacher_id = auth.uid()
  • นักเรียนเห็นเฉพาะห้องที่ตัวเองอยู่ (via classroom_members)
  • Service role (server-only) bypass RLS — ใช้สำหรับ admin actions

PDPA · ข้อมูลเด็ก

พ.ร.บ. คุ้มครองข้อมูลส่วนบุคคล (PDPA) กำหนดให้ห้ามใช้ข้อมูล minor ทำ behavioral targeting · krumis.app design ไว้ดังนี้:

✅ ที่เราทำ
  • หน้านักเรียน /s/* ไม่โหลด Google AdSense script เลย
  • ไม่มี analytics tracker บนหน้านักเรียน
  • ข้อมูลนักเรียน (คะแนน, การเข้าเรียน) เก็บในโรงเรียนเท่านั้น ไม่ส่งออก 3rd party
  • ads.txt + Google AdSense account ประกาศเป็น non-child-directed
❌ ที่เราไม่ทำ
  • ไม่ขายหรือแชร์ข้อมูลนักเรียนกับ 3rd party
  • ไม่ใช้ข้อมูลเด็กทำ advertising profile
  • ไม่เก็บ biometric (ลายนิ้วมือ/ใบหน้า) โดยไม่ขออนุญาต
สิทธิของผู้ใช้ตาม PDPA: ขอดูข้อมูล · ขอแก้ไข · ขอลบ · ขอ export · เพิกถอนความยินยอม · ติดต่อผ่าน LINE OpenChat เพื่อยื่นคำขอ

Data Storage · Backup

  • Database: PostgreSQL (Supabase Cloud · Singapore region)
  • Encrypted at rest + in transit (TLS 1.3)
  • Daily backup + Point-in-time recovery (Pro tier Supabase)
  • ไฟล์แนบ: Supabase Storage — quota 100MB (Free) / 5GB (Pro) / 10GB (School)

การเข้าถึงข้อมูลจากทีมงาน

ทีมงาน krumis.app ไม่มีสิทธิ์อ่านข้อมูลในฐานข้อมูลโดยพลการ — ต้องมีเหตุผล:

  • Debug bug ที่ user report — เข้าถึงเฉพาะ record ที่เกี่ยวข้อง
  • Support ticket — user อนุญาตก่อนเข้าถึง
  • Legal request — มีหมายศาล
  • ทุก access ถูก log ใน audit trail
รหัสผ่านและ 2FA secret ทีมงานไม่เห็น — รหัสผ่าน hashed ด้วย bcrypt · secret encrypted ด้วย key ที่อยู่ใน server env var

Best Practices สำหรับผู้ใช้

  • ใช้รหัสผ่านเฉพาะสำหรับ krumis.app — อย่าใช้ซ้ำกับระบบอื่น
  • เปิด 2FA ตั้งแต่ login ครั้งแรก — ไม่ข้าม
  • อย่าแชร์ account กับคนอื่น — ถ้าจำเป็นให้ admin สร้าง account ใหม่แยก
  • สแกน QR 2FA บนมือถือสำรอง เผื่อเครื่องหาย
  • Sign out จากเครื่องสาธารณะทุกครั้ง — และ ไม่ติ๊ก "จดจำเบราเซอร์ 30 วัน"
  • Report incidents ผ่าน LINE OpenChat ทันที
มีข้อสงสัยเรื่อง security? ติดต่อทีมงาน ก่อนดำเนินการใดๆ ที่ไม่แน่ใจ
krumis.app — ระบบจัดการงานครูไทย