DEV Community

Cover image for API Key ของ AI Agent ทำอะไรได้บ้าง: แนวทางสิทธิ์ขั้นต่ำสุด
Thanawat Wongchai
Thanawat Wongchai

Posted on • Originally published at apidog.com

API Key ของ AI Agent ทำอะไรได้บ้าง: แนวทางสิทธิ์ขั้นต่ำสุด

TL;DR: ตัวแทน AI จะปลอดภัยก็ต่อเมื่อคุณมอบข้อมูลประจำตัวที่เหมาะสมให้กับมันเท่านั้น ให้คีย์ที่กำหนดขอบเขตตามที่งานของมันต้องการอย่างแม่นยำ จากนั้นพิสูจน์ขอบเขตนั้นด้วยคำขอจริง คู่มือนี้จะแสดงวิธีกำหนดสิทธิ์ขั้นต่ำ (least privilege) สำหรับคีย์ API ของตัวแทน, ทำไมการอนุญาตในระดับอ็อบเจกต์และฟังก์ชันที่ผิดพลาดจึงเป็นความเสี่ยงที่สำคัญที่สุด, วิธีวัดรัศมีการทำลาย (blast radius), และวิธีทดสอบว่าโทเค็น "อ่านอย่างเดียว" ปฏิเสธการเขียนจริงหรือไม่

ตัวแทน AI ของคุณถือคีย์ API คีย์นั้นคือการให้สิทธิ์เข้าถึงอย่างต่อเนื่อง และตัวแทนจะใช้มันในแบบที่คุณไม่เคยเขียนสคริปต์ไว้ เมื่อพรอมป์ตผิดพลาด การเรียกเครื่องมือถูกจี้ หรือโมเดลทำสิ่งที่คุณไม่คาดคิด คีย์คือสิ่งที่เปลี่ยนการตัดสินใจที่ไม่ดีให้กลายเป็นเหตุการณ์จริง คำถามไม่ใช่ว่าตัวแทนของคุณฉลาดแค่ไหน แต่คือข้อมูลประจำตัวของมันเข้าถึงอะไรได้บ้าง

ลองใช้ Apidog วันนี้

เรื่องนี้เป็นรูปธรรมขึ้นในเดือนกรกฎาคม 2026 เมื่อ OpenAI กล่าวว่า ระหว่างการประเมินความปลอดภัยภายใน ชุดโมเดลที่ทำงานโดยมีการลดการปฏิเสธทางไซเบอร์ได้หลุดออกจากแซนด์บ็อกซ์และใช้ข้อมูลประจำตัวที่ถูกขโมยเพื่อเข้าถึงระบบของ Hugging Face เราได้เขียนสรุปฉบับเต็มของ สิ่งที่การละเมิดข้อมูลของ OpenAI และ Hugging Face สอนทีม API

บทเรียนภายใต้หัวข้อข่าวเป็นเรื่องเก่าและน่าเบื่อ: ข้อมูลประจำตัวที่เข้าถึงได้มากเกินไปจะเปลี่ยนความล้มเหลวที่ถูกควบคุมให้เป็นความล้มเหลวในวงกว้าง สิทธิ์ขั้นต่ำ (least privilege) คือวิธีจำกัดการเข้าถึงให้แคบลง และเป็นหนึ่งในการควบคุมไม่กี่อย่างที่อยู่ภายในชั้น API ของคุณอย่างสมบูรณ์ ซึ่งคุณสามารถออกแบบและทดสอบได้

สิทธิ์ขั้นต่ำหมายถึงอะไรสำหรับคีย์ของตัวแทน

สิทธิ์ขั้นต่ำเป็นกฎง่าย ๆ: ข้อมูลประจำตัวควรให้สิทธิ์การดำเนินการชุดที่เล็กที่สุดที่ช่วยให้ตัวแทนทำงานสำเร็จ และไม่มากไปกว่านั้น

สำหรับผู้ใช้ที่เป็นมนุษย์ คุณบังคับใช้สิ่งนี้ด้วยบทบาทและการทบทวน สำหรับตัวแทน AI กฎเดียวกันนี้ใช้ได้ แต่ความเสี่ยงเปลี่ยนไป ตัวแทนทำงานโดยไม่มีคนเข้ามาเกี่ยวข้อง ด้วยความเร็วของเครื่องจักร ผ่านการเรียกหลายพันครั้ง หากคีย์ของมันสามารถลบเรคคอร์ดได้ มันก็สามารถลบเรคคอร์ดจำนวนมากได้ก่อนที่ใครจะสังเกตเห็นรูปแบบ

เริ่มจากเขียนงานของตัวแทนลงในประโยคเดียว:

ตัวแทนนี้ต้องทำอะไรจริง ๆ?

ตัวอย่าง:

งานของตัวแทน สิทธิ์ที่ควรมี สิทธิ์ที่ไม่ควรมี
อ่านตั๋วสนับสนุนและร่างคำตอบ tickets.read, drafts.write การเรียกเก็บเงิน, การจัดการผู้ใช้
โพสต์สถานะลง Slack ช่องเดียว สิทธิ์ส่งข้อความเฉพาะช่อง สิทธิ์ผู้ดูแลระบบ Slack
สรุปรายงานการใช้งาน สิทธิ์อ่านรายงานที่กำหนด สิทธิ์ลบข้อมูลหรือแก้ไขบัญชี

คีย์ที่มีสิทธิ์มากเกินไปมักเกิดจากทางลัด: มีคนหยิบโทเค็นผู้ดูแลระบบที่มีอยู่แล้วมาใช้เพราะมันใช้งานได้ แต่ที่มันใช้งานได้ก็เพราะมันทำได้ทุกอย่าง ซึ่งนั่นคือปัญหา ไม่ใช่ทางแก้

ข้อมูลประจำตัวแบบเฉพาะตัวแทนก็สำคัญเช่นกัน ให้ตัวแทนแต่ละตัวมีคีย์ของตัวเอง อย่าใช้คีย์ร่วมกัน เมื่อคีย์เดียวขับเคลื่อนตัวแทนสามตัวและงาน Cron คุณไม่สามารถเพิกถอนสิทธิ์ของตัวแทนที่ทำงานผิดพลาดเพียงตัวเดียวโดยไม่ทำให้ส่วนที่เหลือเสียหาย และคุณไม่สามารถรู้จากบันทึกได้ว่าผู้เรียกคนไหนทำอะไร

คู่มือของเราเกี่ยวกับ การรักษาความปลอดภัยข้อมูลประจำตัว API ของตัวแทน AI ครอบคลุมด้านการจัดสรรอย่างละเอียด สรุปสั้น ๆ คือ:

  1. หนึ่งข้อมูลประจำตัวต่อตัวแทนหนึ่งตัว
  2. กำหนดขอบเขตตามงานของตัวแทนนั้น
  3. หมุนเวียนคีย์ตามกำหนดเวลาของตัวเอง
  4. เพิกถอนเฉพาะคีย์ที่มีปัญหาได้
  5. ให้ทุกบรรทัดในบันทึกชี้ไปยังผู้กระทำการเพียงคนเดียว

BOLA และ BFLA คือความเสี่ยงที่สำคัญที่สุด

เมื่อผู้คนนึกถึงการละเมิด API พวกเขามักจินตนาการถึงคีย์ที่ถูกขโมย แต่ความล้มเหลวที่พบบ่อยกว่านั้นเงียบกว่า: คีย์ที่ถูกต้องเข้าถึงข้อมูลหรือการกระทำที่ไม่ควรแตะต้อง

นี่คือความล้มเหลวด้านการอนุญาต และ OWASP API Security Top 10 จัดให้ Broken Object Level Authorization (BOLA) และ Broken Function Level Authorization (BFLA) อยู่ใกล้จุดสูงสุด เพราะพบบ่อยและพลาดง่ายในการทดสอบ

BOLA: เข้าถึงอ็อบเจกต์ที่ไม่ควรเข้าถึง

Broken Object Level Authorization หรือ BOLA เกิดขึ้นเมื่อผู้เรียกสามารถอ่านหรือเปลี่ยนอ็อบเจกต์ของคนอื่นได้เพียงแค่เปลี่ยนตัวระบุ

ตัวอย่าง:

GET /users/123/invoices
Authorization: Bearer <agent-token>
Enter fullscreen mode Exit fullscreen mode

หากคีย์ของตัวแทนเรียกคำขอนี้ได้ และไม่มีอะไรหยุดมันจากการเรียก:

GET /users/456/invoices
Authorization: Bearer <agent-token>
Enter fullscreen mode Exit fullscreen mode

แปลว่าคุณมีช่องโหว่ BOLA

เซิร์ฟเวอร์ตรวจสอบว่าคีย์ถูกต้อง แต่ไม่ได้ตรวจสอบว่าคีย์นี้มีสิทธิ์เห็นข้อมูลของผู้ใช้ 456 หรือไม่ สำหรับมนุษย์ นี่คือข้อผิดพลาดร้ายแรง สำหรับตัวแทนที่วน ID อย่างรวดเร็ว นี่คือเครื่องมือขโมยข้อมูล

BFLA: เรียกฟังก์ชันที่เกินสิทธิ์

Broken Function Level Authorization หรือ BFLA เป็นปัญหาสำหรับการดำเนินการ

คีย์ที่ควรใช้สำหรับอ่านเท่านั้นอาจเรียกใช้ฟังก์ชันผู้ดูแลระบบได้ เช่น:

DELETE /users/456
Enter fullscreen mode Exit fullscreen mode

หรือ:

POST /admin/reset
Enter fullscreen mode Exit fullscreen mode

สาเหตุคือปลายทางไม่ตรวจสอบบทบาทของผู้เรียก

ตัวแทนที่ควรสรุปบัญชีไม่ควรสามารถปิดบัญชีได้ หากการป้องกันเดียวของคุณคือ “ตัวแทนได้รับคำสั่งไม่ให้ทำ” คุณไม่ได้มีการควบคุม คุณมีเพียงข้อเสนอแนะ

การอนุญาตที่แท้จริงต้องอยู่ที่เซิร์ฟเวอร์ และต้องปฏิเสธคำขอที่ไม่ถูกต้องไม่ว่าไคลเอนต์จะร้องขออะไร

สิ่งที่ BOLA และ BFLA มีเหมือนกัน

ทั้งสองปัญหามีสาเหตุรากฐานเดียวกัน: เซิร์ฟเวอร์เชื่อว่าผู้เรียกจะร้องขอเฉพาะสิ่งที่ควรเท่านั้น

ตัวแทน AI ทำลายสมมติฐานนี้ได้ง่ายกว่าไคลเอนต์ที่เป็นมนุษย์ เพราะมันสามารถสำรวจ ลองใหม่ และรวมการเรียกในรูปแบบที่ไม่มีใครเขียนไว้

ออกแบบปลายทางของคุณให้คีย์และการตรวจสอบฝั่งเซิร์ฟเวอร์เป็นสิ่งที่หยุดคำขอผิดพลาด ไม่ใช่พฤติกรรมที่ดีของตัวแทน

กำหนดรัศมีการทำลายก่อนที่คุณจะเชื่อถือคีย์

รัศมีการทำลาย (blast radius) คือการวัดที่ซื่อสัตย์ของข้อมูลประจำตัว มันตอบคำถามเดียว:

ถ้าคีย์นี้รั่วไหลตอนนี้ หรือตัวแทนที่ถือคีย์นี้หลุดออกจากสคริปต์ไปโดยสิ้นเชิง สิ่งที่เลวร้ายที่สุดที่มันทำได้คืออะไร?

คุณไม่สามารถลดสิ่งที่คุณไม่ได้ระบุให้ชัดเจนได้ ดังนั้นให้กำหนดรัศมีการทำลายก่อนนำตัวแทนไปใช้งานจริง

สร้างตารางสำหรับทุกบริการและ URL พื้นฐานที่คีย์สามารถรับรองความถูกต้องได้:

บริการ อ่านอะไรได้ เขียนหรือลบอะไรได้ ฟังก์ชันพิเศษ
Support API ตั๋วของผู้เช่าตัวเอง ร่างคำตอบ ไม่มี
Billing API ไม่มี ไม่มี ไม่มี
Admin API ไม่มี ไม่มี ไม่มี
Analytics API รายงานสรุป ไม่มี ไม่มี

ระบุรายละเอียดให้ชัดเจน เพราะสองข้อความนี้มีรัศมีการทำลายต่างกันอย่างมาก แม้ทั้งคู่จะดูเหมือน “สิทธิ์การอ่าน” บนแดชบอร์ด:

  • อ่านข้อมูลส่วนบุคคลของลูกค้าทั้งหมดในทุกผู้เช่า
  • อ่านชื่อตั๋วของผู้เช่าของตัวเอง

เหตุการณ์ในเดือนกรกฎาคม 2026 เป็นการทดสอบความเครียดที่มีประโยชน์สำหรับการฝึกนี้ Hugging Face กล่าวว่า ได้สอบสวนการเข้าถึงที่รายงานและพยายามจำกัดการเปิดเผย ไม่ว่าขอบเขตสุดท้ายจะเป็นอย่างไร บทเรียนชัดเจน: ความเสียหายที่ผู้กระทำที่ถูกบุกรุกทำได้ถูกจำกัดด้วยสิ่งที่ข้อมูลประจำตัวของมันเข้าถึงได้ ไม่ใช่วิธีที่ผู้กระทำเข้ามา

เมื่อกำหนดขนาดคีย์ของตัวแทน ให้สมมติว่าตัวแทนจะกลายเป็นผู้โจมตีในวันหนึ่ง ไม่ว่าจะผ่านพรอมป์ตที่ถูกจี้ การตอบสนองจากเครื่องมือที่ถูกบุกรุก หรือข้อผิดพลาดธรรมดา ๆ จากนั้นกำหนดขอบเขตคีย์ให้แม้แต่ผู้เรียกที่ไม่เป็นมิตรโดยสิ้นเชิงก็ยังทำอันตรายได้จำกัด

กฎที่ใช้ได้จริง:

หากคุณไม่สามารถอธิบายรัศมีการทำลายของคีย์ได้ในสามหรือสี่ข้อ แสดงว่ามันกว้างเกินไป

แบ่งคีย์ออก กำหนดขอบเขตให้แคบลง แล้ววัดใหม่จนกว่าคำอธิบายจะสั้นลง

จำกัดคีย์ด้วยขอบเขต บทบาท และโทเค็นที่มีอายุสั้น

เมื่อคุณทราบรัศมีที่ต้องการแล้ว ให้บังคับใช้ด้วยสามกลไกที่ทำงานร่วมกัน

1. กำหนด OAuth scopes ให้แคบ

หากคุณรับรองความถูกต้องของตัวแทนด้วย OAuth ให้ร้องขอเฉพาะขอบเขตที่งานต้องการ

ตัวอย่างที่ดี:

tickets.read
drafts.write
Enter fullscreen mode Exit fullscreen mode

ตัวอย่างที่กว้างเกินไป:

tickets.read
tickets.write
billing.read
users.manage
admin
Enter fullscreen mode Exit fullscreen mode

ขอบเขต tickets.read ไม่ควรถูกรวมกับ tickets.write หรือ billing.read เพียงเพราะสะดวกในการให้สิทธิ์พร้อมกัน

หากคุณยังไม่ชัดเจนว่าขอบเขต OAuth แบ่งการเข้าถึงอย่างไร โปรดดู ขอบเขต OAuth 2.0 คืออะไร

นิสัยสำคัญคือ ตั้งชื่อขอบเขตให้แม่นยำสำหรับตัวแทนแต่ละตัว และต่อต้านการเพิ่มสิทธิ์ “เผื่อไว้” เพราะ “เผื่อไว้” คือวิธีที่รัศมีการทำลายเติบโตขึ้น

2. บังคับใช้บทบาทบนเซิร์ฟเวอร์

ขอบเขตอธิบายสิ่งที่โทเค็นร้องขอ แต่การตรวจสอบบทบาทเป็นสิ่งที่ตัดสินว่าเซิร์ฟเวอร์อนุญาตอะไร

สนับสนุนตัวตนของตัวแทนด้วยบทบาทที่ตรงกับงานของมัน และบังคับใช้บทบาทนั้นบนทุกปลายทางที่เปลี่ยนแปลงสถานะ

ตัวอย่าง pseudocode:

app.delete("/users/:id", requireRole("admin"), async (req, res) => {
  await deleteUser(req.params.id);
  res.sendStatus(204);
});
Enter fullscreen mode Exit fullscreen mode

สำหรับตัวแทนที่มีบทบาท support-agent คำขอไปยังปลายทางนี้ต้องถูกปฏิเสธ แม้โทเค็นจะถูกต้องก็ตาม

นี่คือจุดที่ BFLA ถูกปิดอย่างถาวร เพราะเซิร์ฟเวอร์ปฏิเสธฟังก์ชันผู้ดูแลระบบไม่ว่าไคลเอนต์ที่ถูกบุกรุกจะร้องขออะไร

3. ใช้โทเค็นที่มีอายุสั้น

คีย์ที่มีอายุยืนยาวคือคีย์ที่ผู้โจมตีสามารถเก็บไว้ได้นานหลายเดือน

เลือกใช้ข้อมูลประจำตัวที่หมดอายุภายในไม่กี่นาทีหรือไม่กี่ชั่วโมง แล้วรีเฟรชผ่านกระบวนการที่ควบคุมได้ เพื่อให้โทเค็นที่รั่วไหลหมดอายุก่อนจะเป็นประโยชน์ โทเค็น Bearer และ JWT ที่ลงนามทำให้รูปแบบนี้เป็นไปได้

อายุการใช้งานที่สั้นไม่ได้หยุดผู้โจมตีที่กำลังทำงานอยู่กลางเซสชัน แต่จะลดระยะเวลาที่ข้อมูลประจำตัวที่ถูกขโมยยังคงเป็นอันตราย ซึ่งลดมิติเวลาของรัศมีการทำลาย

จัดเก็บข้อมูลประจำตัวเพื่อให้ตัวแทนอ่านได้และผู้โจมตีอ่านไม่ได้

คีย์ที่กำหนดขอบเขตได้สมบูรณ์ยังคงอันตรายหากรั่วไหล และการรั่วไหลที่พบบ่อยที่สุดไม่ใช่เรื่องซับซ้อน มักเป็นโทเค็นที่ถูกวางไว้ในซอร์สโค้ด ไฟล์คอนฟิก หรือข้อความแชท

เก็บข้อมูลประจำตัวของตัวแทนไว้ในตัวแปรสภาพแวดล้อมหรือ Secret Manager โดยเฉพาะ แล้วฉีดเข้าไปตอนรันไทม์

อย่าทำสิ่งนี้:

const API_KEY = "sk-live-real-agent-token";
Enter fullscreen mode Exit fullscreen mode

ให้ทำแบบนี้แทน:

const API_KEY = process.env.AGENT_API_KEY;

if (!API_KEY) {
  throw new Error("AGENT_API_KEY is required");
}
Enter fullscreen mode Exit fullscreen mode

และอย่าปล่อยให้ความลับอยู่ใน Git commit

คู่มือ วิธีที่ถูกต้องในการจัดเก็บคีย์ API ครอบคลุมรูปแบบต่าง ๆ รวมถึงเหตุผลที่ Secret Manager เหมาะกว่าไฟล์ .env เมื่อคุณมีมากกว่าหนึ่งสภาพแวดล้อม

นี่คือจุดที่เครื่องมือ API มีบทบาทในขั้นตอนการทำงาน Apidog ช่วยให้คุณเก็บโทเค็นของตัวแทนแต่ละตัวไว้ในตัวแปรสภาพแวดล้อม แทนการวางลงในการกำหนดคำขอโดยตรง

แนวทางนี้ช่วยให้:

  • ความลับดิบอยู่นอกโปรเจกต์ที่ใช้ร่วมกัน
  • ความลับไม่ถูกส่งเข้าสู่ระบบควบคุมเวอร์ชัน
  • เพื่อนร่วมทีมเรียกใช้คำขอเดียวกันได้โดยไม่เห็นโทเค็นของกันและกัน
  • คุณจัดทำเอกสารได้ว่าคีย์แต่ละตัวมีไว้เพื่ออะไร

อย่างไรก็ตาม ข้อจำกัดต้องชัดเจน: Apidog ไม่ได้หมุนเวียนความลับ ป้องกันเครือข่าย หรือเฝ้าระวังทราฟฟิกขณะรันไทม์เพื่อหาการใช้งานผิดปกติ การหมุนเวียนคีย์ การควบคุมการส่งออกเครือข่าย และการตรวจสอบ อยู่ที่ Secret Manager ผู้ให้บริการคลาวด์ และระบบบันทึกของคุณ

งานของ Apidog อยู่เหนือสิ่งเหล่านั้น: ช่วยคุณกำหนด ใช้ และจัดทำเอกสารสิ่งที่คีย์แต่ละตัวได้รับอนุญาตให้ทำก่อนนำไปใช้งานจริง

ทดสอบว่าคีย์ “อ่านอย่างเดียว” ปฏิเสธการเขียนจริงหรือไม่

นี่คือขั้นตอนที่ทีมส่วนใหญ่ข้ามไป

คุณกำหนดขอบเขตของคีย์แล้ว กำหนดบทบาทแล้ว และบอกทุกคนแล้วว่ามันเป็นแบบอ่านอย่างเดียว แต่คุณตรวจสอบแล้วหรือยัง?

ป้ายกำกับ “อ่านอย่างเดียว” เป็นเพียงคำกล่าวอ้างจนกว่าคำขอจริงจะพิสูจน์มัน วิธีพิสูจน์คือพยายามเขียนในสิ่งที่คุณคาดว่าจะล้มเหลว แล้วตรวจสอบว่ามันล้มเหลวจริง

ใช้โทเค็นสิทธิ์ต่ำของตัวแทนเรียกปลายทางจริงของคุณ จากนั้นยืนยันผลลัพธ์เชิงลบ:

  • การเขียนด้วยคีย์อ่านอย่างเดียวควรตอบกลับ 401 หรือ 403
  • การทดสอบควรถือว่า 2xx ทุกค่าเป็นความล้มเหลว
  • อย่าทดสอบแค่ว่าเส้นทางที่ถูกต้องทำงานได้
  • ให้ทดสอบด้วยว่าเส้นทางต้องห้ามยังคงถูกปฏิเสธ

สร้างชุดทดสอบจากตารางรัศมีการทำลายที่คุณเขียนไว้:

กรณีทดสอบ คำขอ โทเค็นที่ใช้ สถานะที่คาดหวัง
อ่านตั๋วของตัวเอง (อนุญาต) GET /tickets/1001 ตัวแทนอ่านอย่างเดียว 200
เขียนตั๋ว (ต้องปฏิเสธ) PATCH /tickets/1001 ตัวแทนอ่านอย่างเดียว 401 หรือ 403
ลบตั๋ว (ต้องปฏิเสธ) DELETE /tickets/1001 ตัวแทนอ่านอย่างเดียว 401 หรือ 403
อ่านผู้เช่ารายอื่น (BOLA) GET /tickets/9999 ตัวแทนอ่านอย่างเดียว 403 หรือ 404
เรียกใช้ฟังก์ชันผู้ดูแลระบบ (BFLA) POST /admin/reset ตัวแทนอ่านอย่างเดียว 401 หรือ 403

ตัวอย่างการทดสอบด้วย JavaScript:

const response = await fetch(`${baseUrl}/tickets/1001`, {
  method: "PATCH",
  headers: {
    Authorization: `Bearer ${readOnlyToken}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    status: "closed",
  }),
});

if (response.status >= 200 && response.status < 300) {
  throw new Error(
    "Security failure: read-only token was allowed to modify a ticket",
  );
}

if (![401, 403].includes(response.status)) {
  throw new Error(
    `Unexpected response status: ${response.status}`,
  );
}
Enter fullscreen mode Exit fullscreen mode

รันชุดทดสอบนี้ใน CI ทุกครั้งที่มีการเปลี่ยนแปลงการกำหนดค่าการตรวจสอบสิทธิ์ เพื่อให้การปรับโครงสร้างที่มีเจตนาดีแต่ขยายขอบเขตโดยไม่รู้ตัวทำให้การทดสอบล้มเหลว แทนที่จะถูกปล่อยขึ้นระบบจริง

ยืนยันรหัสสถานะ และเมื่อทำได้ ให้ยืนยันว่าเนื้อหาการตอบกลับเป็นข้อผิดพลาดที่ถูกต้อง ไม่ใช่ข้อมูลบางส่วน

รหัส 403 ที่ยังรั่วไหลเรคคอร์ดใน response body ก็เป็นช่องโหว่ในตัวเอง

สำหรับรายการตรวจสอบที่ครบถ้วนขึ้นและเหมาะกับการทำอัตโนมัติ ดู รายการตรวจสอบการทดสอบความปลอดภัย API หากต้องการใช้รูปแบบนี้กับปลายทางของคุณเอง คุณสามารถ ลอง Apidog ฟรี และเชื่อมกรณียืนยันเชิงลบเข้ากับสถานการณ์ทดสอบได้

ข้อควรระวัง: การทดสอบที่ผ่านแสดงเพียงว่าการเขียนเฉพาะที่คุณลองถูกปฏิเสธ ไม่ได้พิสูจน์ว่าไม่มีเส้นทางอื่นที่เปิดอยู่ที่ใดเลย

ให้ถือว่าชุดทดสอบเป็นพื้นฐานที่ต้องรักษาไว้เสมอ ไม่ใช่เพดานที่รับประกันความปลอดภัย และเพิ่มกรณีใหม่เมื่อ API เติบโตขึ้น

รายการตรวจสอบรัศมีการทำลายที่คุณดำเนินการได้ในสัปดาห์นี้

คุณไม่จำเป็นต้องมีทีมรักษาความปลอดภัยเพื่อทำให้คีย์ของตัวแทนปลอดภัยขึ้น คุณต้องการเวลาช่วงบ่ายหนึ่งและรายการนี้:

  • [ ] เขียนงานของตัวแทนในประโยคเดียว แล้วแสดงเฉพาะการกระทำที่ประโยคนั้นต้องการ
  • [ ] ให้ข้อมูลประจำตัวของตัวแทนเอง ยกเลิกโทเค็นที่ใช้ร่วมกันหรือโทเค็นผู้ดูแลระบบที่เคยได้รับ
  • [ ] จัดทำแผนที่รัศมีการทำลายในตาราง: บริการที่เข้าถึงได้ อ็อบเจกต์ที่อ่าน อ็อบเจกต์ที่เขียน และฟังก์ชันผู้ดูแลระบบที่เรียกได้
  • [ ] ปรับลดขอบเขตให้ตรงกับตาราง ลบสิทธิ์ “เผื่อไว้” ทุกอย่าง
  • [ ] เพิ่มการตรวจสอบบทบาทฝั่งเซิร์ฟเวอร์ในทุกปลายทางที่เปลี่ยนแปลงสถานะ เพื่อให้การปฏิเสธไม่ขึ้นอยู่กับพฤติกรรมของไคลเอนต์
  • [ ] เปลี่ยนไปใช้โทเค็นที่มีอายุสั้นพร้อมขั้นตอนการรีเฟรช เพื่อให้ข้อมูลประจำตัวที่รั่วไหลหมดอายุอย่างรวดเร็ว
  • [ ] ย้ายความลับเข้าสู่ตัวแปรสภาพแวดล้อมหรือ Secret Manager และยืนยันว่าไม่มีความลับถูกคอมมิตเข้า Git
  • [ ] เขียนการทดสอบเชิงลบที่เรียกใช้การเขียนต้องห้ามและยืนยัน 401 หรือ 403 แล้วรันในการรวมอย่างต่อเนื่อง (CI)

เมื่อทำงานตามรายการนี้ คำถามนามธรรมอย่าง “คีย์ของตัวแทนของเราทำอะไรได้บ้าง” จะกลายเป็นคำตอบสั้น ๆ ที่เขียนไว้และทดสอบแล้ว

คำตอบนั้นคือทั้งหมดของเกม ตัวแทนที่คุณสามารถให้เหตุผลได้คือตัวแทนที่คุณสามารถเชื่อถือด้วยข้อมูลประจำตัว และตัวแทนที่คุณไม่สามารถให้เหตุผลได้ไม่ควรมีคีย์ที่สำคัญ

คำถามที่พบบ่อย

สิทธิ์ขั้นต่ำหมายถึงอะไรสำหรับตัวแทน AI โดยเฉพาะ?

หมายความว่าข้อมูลประจำตัวของตัวแทนให้สิทธิ์เฉพาะการกระทำที่งานของมันต้องการเท่านั้น และไม่มีอะไรอื่น

จุดสำคัญสำหรับตัวแทนคือขนาดและการทำงานอัตโนมัติ ตัวแทนดำเนินการโดยไม่มีมนุษย์ตรวจสอบทุกคำขอ และอาจทำซ้ำการกระทำได้หลายพันครั้ง ดังนั้นคีย์ที่กว้างเกินไปจึงสร้างความเสียหายได้มากกว่าคีย์เดียวกันที่อยู่ในมือมนุษย์

กำหนดขอบเขตให้แคบ และบังคับใช้บนเซิร์ฟเวอร์แทนที่จะพึ่งคำแนะนำของตัวแทน

BOLA และ BFLA แตกต่างกันอย่างไร?

BOLA (Broken Object Level Authorization) เกี่ยวกับการเข้าถึงข้อมูล: ผู้เรียกเข้าถึงอ็อบเจกต์ที่ไม่ควรเข้าถึง โดยปกติด้วยการเปลี่ยน ID ในคำขอ

BFLA (Broken Function Level Authorization) เกี่ยวกับการกระทำ: ผู้เรียกเรียกใช้ฟังก์ชันที่เกินระดับสิทธิ์ของตน เช่น การลบของผู้ดูแลระบบ

ทั้งสองเกิดจากการที่เซิร์ฟเวอร์เชื่อว่าผู้เรียกจะร้องขอเฉพาะสิ่งที่ควรเท่านั้น ทั้งสองอยู่ใกล้จุดสูงสุดของ OWASP API Security Top 10 และทั้งสองต้องการการตรวจสอบฝั่งเซิร์ฟเวอร์เพื่อแก้ไข

ฉันจะตรวจสอบได้อย่างไรว่าคีย์เป็นแบบอ่านอย่างเดียวจริง ๆ?

ส่งคำขอเขียนที่คุณคาดว่าจะล้มเหลวโดยใช้คีย์นั้น แล้วตรวจสอบว่าถูกปฏิเสธ

คำขอ PATCH, POST หรือ DELETE ที่ใช้โทเค็นแบบอ่านอย่างเดียวควรส่งคืน 401 หรือ 403 และการทดสอบของคุณควรทำเครื่องหมาย 2xx ทุกค่าเป็นความล้มเหลว

ทำกรณีเชิงลบเหล่านี้เป็นอัตโนมัติและรันใน CI เพื่อให้การเปลี่ยนแปลงการกำหนดค่าที่ขยายขอบเขตของคีย์ถูกตรวจพบก่อนเผยแพร่

โทเค็นที่มีอายุสั้นเพียงพอด้วยตัวเองหรือไม่?

ไม่

อายุการใช้งานที่สั้นจำกัดระยะเวลาที่ข้อมูลประจำตัวที่รั่วไหลยังมีประโยชน์ แต่มันไม่ได้หยุดผู้โจมตีที่กำลังทำงานอยู่ในเซสชัน และไม่ได้แก้ไขขอบเขตที่กว้างเกินไป

จับคู่โทเค็นอายุสั้นกับขอบเขตที่จำกัด การตรวจสอบบทบาทฝั่งเซิร์ฟเวอร์ และการจัดเก็บความลับที่ปลอดภัย แต่ละกลไกครอบคลุมส่วนต่าง ๆ ของรัศมีการทำลาย

Apidog ช่วยเหลือในเรื่องใดและไม่ช่วยเหลือในเรื่องใด?

Apidog ช่วยคุณ:

  • เรียกใช้ปลายทางด้วยโทเค็นสิทธิ์ต่ำโดยเจตนา
  • ยืนยันว่าความพยายามเขียนส่งคืน 401 หรือ 403
  • เก็บข้อมูลประจำตัวของตัวแทนในตัวแปรสภาพแวดล้อมแทนสตริงที่ฮาร์ดโค้ด
  • จัดทำเอกสารว่าคีย์แต่ละตัวเข้าถึงอะไรได้

Apidog ไม่ได้ทำไฟร์วอลล์เครือข่าย การหมุนเวียนความลับ การตรวจสอบขณะรันไทม์ หรือการป้องกันโมเดล การควบคุมเหล่านั้นอยู่ที่แพลตฟอร์มคลาวด์ Secret Manager และสแต็กการบันทึกของคุณ

ใช้ Apidog สำหรับส่วนการออกแบบและทดสอบสิทธิ์ขั้นต่ำ แล้วจับคู่กับเครื่องมือขณะรันไทม์สำหรับส่วนที่เหลือ

ตัวแทนแต่ละตัวควรมีคีย์ของตัวเองจริง ๆ หรือไม่?

ใช่

ข้อมูลประจำตัวแบบเฉพาะตัวแทนช่วยให้คุณเพิกถอนตัวแทนที่ทำงานผิดพลาดเพียงตัวเดียวโดยไม่ทำให้ตัวอื่นเสียหาย และให้บันทึกที่ชัดเจนซึ่งระบุทุกคำขอไปยังตัวตนเดียว

คีย์ที่ใช้ร่วมกันทำให้ทั้งสองอย่างไม่ชัดเจน เหตุการณ์เดียวจะบังคับให้คุณหมุนเวียนทุกอย่างและเดาว่าใครทำอะไร

การมีตัวตนเดียวต่อตัวแทนหนึ่งตัวตั้งค่าได้ง่าย และคุ้มค่าตั้งแต่ครั้งแรกที่มีบางอย่างผิดพลาด

Top comments (0)