Guardrails สำหรับ Agent และการตั้งค่า LDAP ในขณะรันไทม์
วันนี้ผมได้ทำงานแก้ปัญหาที่แตกต่างกันสองอย่าง ซึ่งทั้งคู่มีเป้าหมายเดียวกันคือ การกำหนดขอบเขตให้ชัดเจนและควบคุมได้ง่าย
งานแรกคือการสร้าง MCP tools สำหรับ AI agent โดยผมต้องการให้ agent สามารถจัดการแพลตฟอร์มกิจกรรม (events platform) ได้ ไม่ว่าจะเป็นการแสดงรายการกิจกรรม, การตรวจสอบความพร้อม และการเผยแพร่ข้อมูลอัปเดต
ความท้าทายคือ MCP tools ใช้การยืนยันตัวตนด้วยโทเคน (token authentication) ซึ่งหมายความว่ามันจะขาดบริบทของเซสชัน (session context) เหมือนที่การร้องขอผ่านเว็บแบบมาตรฐานมี หากคุณพึ่งพาขอบเขตเทแนนท์แบบครอบคลุม (global tenant scope) ระบบอาจจะคืนค่าข้อมูลจากทุกองค์กรออกมา
ผมแก้ปัญหานี้ด้วยกฎ 3 ข้อ:
- กรองตามองค์กรอย่างชัดเจนในทุกการคิวรี (query) อย่าพึ่งพาขอบเขตแบบครอบคลุม (global scope)
- ใช้ permission strings แบบเดียวกับเว็บแอปฯ โดย agent ไม่ควรมีอำนาจมากกว่ามนุษย์ที่ใช้งานมัน
- ใช้ UUIDs ในการค้นหาแทนการใช้ไอดีแบบเพิ่มค่าอัตโนมัติ (auto-increment IDs)
จงปฏิบัติกับทุกเครื่องมือเสมือนว่าเป็นเอนด์พอยต์ที่ไม่น่าเชื่อถือ (untrusted endpoint) และวางตรรกะ (logic) ไว้ในที่ที่คุณสามารถทดสอบได้ในจุดเดียว
งานที่สองเกี่ยวข้องกับ identity portal ผมได้ย้ายการตั้งค่า LDAP จากไฟล์สแตติก (static files) ไปไว้ในส่วนติดต่อผู้ใช้สำหรับการตั้งค่า (settings UI) ทำให้ตอนนี้ผู้ดูแลระบบสามารถเปลี่ยน host, port และข้อมูลประจำตัว (credentials) ได้โดยไม่ต้องทำการ deploy ใหม่
นอกจากนี้ ผมยังได้เพิ่มการควบคุมเรื่องการหมดเวลาการเชื่อมต่อ (connection timeouts) และตัวเลือก SASL ซึ่งสิ่งนี้ทำให้เกิดอุปสรรคทางเทคนิคเกี่ยวกับ JSON
เมื่อคุณเก็บคีย์ที่เป็นจำนวนเต็ม (integer keys) ไว้ใน JSON เมื่อทำการถอดรหัส (decode) มันจะคืนค่ากลับมาเป็นสตริง (strings) แต่ฟังก์ชันของ LDAP ต้องการคีย์ที่เป็นจำนวนเต็ม ผมจึงต้องเขียน mapper เพื่อแปลงคีย์เหล่านั้นกลับเป็นจำนวนเต็มก่อนนำไปใช้งาน
เพื่อความปลอดภัย ผมจึงได้เพิ่ม guardrails สองอย่าง:
- เข้ารหัสรหัสผ่าน bind ขณะจัดเก็บ (at rest) ห้ามเก็บข้อมูลความลับไว้ในแคช (cache) ในรูปแบบข้อความธรรมดา (plaintext) โดยเด็ดขาด
- ตรวจสอบความถูกต้องของฟิลด์ JSON ก่อนบันทึก การตั้งค่าที่ผิดพลาดควรล้มเหลวตั้งแต่ขั้นตอนการบันทึก ไม่ใช่ไปล้มเหลวตอนที่ผู้ใช้ถูกล็อกไม่ให้เข้าใช้งาน
ผมยังใช้ assembler ตัวเดียวทั้งในการทดสอบและบันทึกการเชื่อมต่อ เพื่อให้มั่นใจว่าการเชื่อมต่อที่คุณทดสอบนั้นคือสิ่งเดียวกับที่คุณบันทึกไว้จริงๆ
งานวิศวกรรมไม่ใช่แค่เรื่องของการสร้างฟีเจอร์ แต่คือการสร้าง guardrails
Source: https://dev.to/nasrulhazim/dev-log-2026-06-24-agent-guardrails-and-runtime-ldap-config-2hi5
