บทที่ 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? ติดต่อทีมงาน ก่อนดำเนินการใดๆ ที่ไม่แน่ใจ