# ความปลอดภัย ## ภาพรวม Neotask ออกแบบมาด้วยสถาปัตยกรรมที่ให้ความสำคัญกับความปลอดภัยเป็นอันดับแรก Gateway bind กับ localhost โดยค่าเริ่มต้น ข้อมูลที่ละเอียดอ่อนทั้งหมดถูกเข้ารหัสในขณะพัก และการรันคำสั่งของเอเจนต์สามารถแซนด์บ็อกซ์ใน container แบบแยกตัว ## ความปลอดภัยเครือข่าย ### Loopback โดยค่าเริ่มต้น Gateway รับฟังเฉพาะบน `127.0.0.1` (localhost) เว้นแต่คุณจะเปลี่ยนโหมด binding อย่างชัดแจ้ง ไม่มีการเปิดเผยเครือข่ายภายนอกโดยค่าเริ่มต้น ### การตรวจสอบสิทธิ์ การเชื่อมต่อ WebSocket ทั้งหมดต้องการการตรวจสอบสิทธิ์: - **Token auth**, Bearer token (UUID หรือ string กำหนดเอง) - **Password auth**, รหัสผ่านที่ hash ด้วย bcrypt - **Trusted proxy**, Header ที่ตรวจสอบสิทธิ์ล่วงหน้าจาก reverse proxy - **Local trust**, การเชื่อมต่อ loopback ได้รับความเชื่อถือโดยปริยาย ### ความปลอดภัยการเข้าถึงระยะไกล สำหรับการเข้าถึงระยะไกล แนวทางที่แนะนำคือ **Tailscale VPN** หรือ **SSH tunneling**, ไม่ควรเปิดเผย Gateway โดยตรงต่ออินเทอร์เน็ต ## การจับคู่อุปกรณ์ ### วิธีการจับคู่ทำงาน client ทุกตัวที่เชื่อมต่อกับ Gateway ต้องถูกจับคู่: 1. อุปกรณ์แสดง identity (fingerprint + public key) 2. Gateway ออก pairing challenge (nonce) 3. อุปกรณ์ลงนาม nonce ด้วย private key 4. คุณอนุมัติอุปกรณ์ผ่าน UI 5. Gateway ออก device token สำหรับการเชื่อมต่อในอนาคต ### โมเดลความเชื่อถือ - **อุปกรณ์ local** (loopback) ได้รับการอนุมัติอัตโนมัติเพื่อความสะดวก - **อุปกรณ์ที่ไม่ใช่ local** ต้องการการอนุมัติอย่างชัดแจ้ง - Device token ถูกจัดเก็บในเครื่องและนำกลับมาใช้เมื่อเชื่อมต่อซ้ำ - อุปกรณ์สามารถถูกเพิกถอนได้ทุกเวลา ## การเข้ารหัส ### ข้อมูลในขณะพัก - **AES-256-GCM**, Token ความลับ และ API key ทั้งหมดถูกเข้ารหัสในขณะพัก - **คีย์ที่ได้จากเครื่อง**, คีย์การเข้ารหัสได้จาก scrypt จาก device identity - **ไม่มีการจัดเก็บข้อความธรรมดา**, Token ไม่เคยถูกจัดเก็บในข้อความธรรมดา ### ข้อมูลในขณะส่ง - **TLS**, HTTPS สำหรับการสื่อสาร API - **WSS**, WebSocket Secure สำหรับการเชื่อมต่อ Gateway (เมื่อใช้ Tailscale Serve หรือ reverse proxy) - **การลงนาม HMAC**, ความสมบูรณ์ของคำขอด้วย nonce และ timestamp ## Sandboxing ### การแยกตัวบน Docker การรันคำสั่งเอเจนต์สามารถ sandbox ใน Docker container: - **Profile ต่อเอเจนต์**, เอเจนต์แต่ละตัวสามารถมีการกำหนดค่า sandbox ของตัวเอง - **ขีดจำกัดทรัพยากร**, ขีดจำกัด CPU หน่วยความจำ และ timeout ที่กำหนดค่าได้ - **การแยกตัวเครือข่าย**, Container สามารถแยกตัวเครือข่าย - **การจำกัด Filesystem**, เอเจนต์เข้าถึงเฉพาะ workspace ของมัน - **Image กำหนดเอง**, ใช้ image สำเร็จรูปพร้อมเครื่องมือเฉพาะที่ติดตั้ง ### ขอบเขต Sandbox | ขอบเขต | คำอธิบาย | |, ----|, --, --, |\ | **Per-session** | Container ใหม่สำหรับแต่ละเซสชัน | | **Per-agent** | Container ถาวรต่อเอเจนต์ | | **Shared** | Container ที่ใช้ร่วมกันข้ามเอเจนต์ | ### การเข้าถึง Workspace เอเจนต์ที่ sandbox สามารถเข้าถึงไดเรกทอรี workspace ของตน (mount เข้า container) แต่ไม่สามารถเข้าถึง host filesystem นอก workspace ของตน ## การอนุมัติ Exec ควบคุมคำสั่งที่เอเจนต์สามารถรันบน node และ Gateway host: ### โหมด | โหมด | คำอธิบาย | |, ---|, --, --, |\ | **Allowlist** | เฉพาะคำสั่งที่อนุมัติล่วงหน้าเท่านั้นที่รัน | | **Ask** | คำสั่งที่ไม่รู้จักจะแจ้งให้ผู้ใช้อนุมัติ | | **Full** | ไม่มีข้อจำกัด (ใช้ด้วยความระมัดระวัง) | ### การกำหนดค่าต่อ Node แต่ละ node (macOS, headless host) มีการกำหนดค่าการอนุมัติ exec ของตัวเอง จัดเก็บในเครื่อง คุณสามารถอนุญาต binary เฉพาะ (เช่น `/usr/bin/docker`, `/usr/local/bin/terraform`) ในขณะที่บล็อกทุกอย่างอื่น ## โหมดยกระดับ บางการดำเนินการต้องการการรันบน Gateway host โดยตรง (ไม่ใช่ใน sandbox) โหมดยกระดับคือ: - จำกัดด้วยการอนุญาตอย่างชัดแจ้งใน agent config - มีเฉพาะบน Gateway host - ปิดใช้งานโดยค่าเริ่มต้น - ตรวจสอบได้ผ่านการบันทึก ## Security Audit Security audit ในตัวตรวจสอบ: - สิทธิ์ไฟล์ configuration (ควรเป็น 600) - สิทธิ์ไฟล์เซสชัน - เวอร์ชัน Node.js (security patch) - การตรวจจับความลับข้อความธรรมดา - การตรวจสอบ plugin allowlist - การตรวจสอบ network interface ที่เปิดอยู่ - ความสมบูรณ์ของการกำหนดค่า auth Audit สามารถแก้ไขปัญหาหลาย ๆ อย่างโดยอัตโนมัติเมื่อได้รับอนุญาต ## แนวทางปฏิบัติที่ดีที่สุด 1. **รักษา Gateway บน loopback**, ใช้ Tailscale หรือ SSH สำหรับการเข้าถึงระยะไกล 2. **เปิดใช้งาน sandboxing**, รันคำสั่งเอเจนต์ใน Docker container 3. **ใช้ exec allowlist**, จำกัดคำสั่งที่เอเจนต์สามารถรันบน node 4. **ตั้งค่า auth token**, กำหนดค่า token auth เสมอ แม้สำหรับ loopback 5. **ตรวจสอบสิทธิ์เอเจนต์**, ใช้ tool profile ขั้นต่ำที่เป็นไปได้ 6. **อัปเดต Neotask**, การอัปเดตรวมถึง security patch 7. **ตรวจสอบเป็นประจำ**, รัน security audit เพื่อค้นหาการกำหนดค่าที่ผิดพลาด 8. **จำกัดการโหลด plugin**, ติดตั้งเฉพาะ plugin จากแหล่งที่เชื่อถือได้