पाठ 15 / 28
मॉडल के बाहर नीति Engine
कोड में allow, ask या deny तय करें, argument सीमाओं के साथ।
मॉडल प्रस्तावित करता है; कोड निर्णय लेता है
मॉडल के tool अनुरोध और असली कार्रवाई के बीच नीति परत रखें। वह tool खोजती है, arguments को नियमों (राशि सीमाएँ, अनुमत प्राप्तकर्ता, अनुमत paths) से जाँचती है, वर्तमान user की अनुमतियाँ देखती है, और allow, मनुष्य से पूछो, या deny लौटाती है। अज्ञात tools डिफ़ॉल्ट रूप से अस्वीकृत हैं। यह कोड चतुर पाठ से अपने नियमों से डिगाया नहीं जा सकता, prompt के वाक्य के विपरीत। नीति को छोटा, पठनीय, परखने योग्य और versioned रखें, और हर निर्णय log करें। उदाहरण में reads अनुमत हैं, एक-प्राप्तकर्ता ईमेल को अनुमोदन चाहिए, दो-प्राप्तकर्ता ईमेल और 90,000 का refund अनुमोदित होने पर भी अस्वीकृत हैं, हटाना हमेशा अस्वीकृत है, और अज्ञात tool अस्वीकृत है।
Argument सीमाओं के साथ allow, ask, deny, चलाकर
मैंने यह सादे Python 3 (सिर्फ़ standard library) से चलाया। यहाँ सारे हमले स्थानीय डेटा पर हानिरहित प्रदर्शन हैं, कोई असली system उपयोग नहीं हुआ। हर call नियमों से आँकी जाती है: reads पास, ईमेल पहले पूछता है और अनुमोदन के बाद पास होता है, सीमा उल्लंघन मनुष्य के अनुमोदन पर भी अस्वीकृत, delete_account हमेशा अस्वीकृत, और अज्ञात drop_database डिफ़ॉल्ट रूप से अस्वीकृत।
POLICY = {
"get_order": {"mode": "allow"},
"send_email": {"mode": "ask", "max_recipients": 1},
"refund": {"mode": "ask", "max_amount": 5000},
"delete_account":{"mode": "deny"},
}
def decide(tool, args, approved=False):
rule = POLICY.get(tool)
if rule is None: return "DENY (unknown tool)"
if rule["mode"] == "deny": return "DENY"
if "max_amount" in rule and args.get("amount", 0) > rule["max_amount"]: return "DENY (amount over limit)"
if "max_recipients" in rule and len(args.get("to", [])) > rule["max_recipients"]: return "DENY (too many recipients)"
if rule["mode"] == "ask" and not approved: return "ASK the human"
return "ALLOW"
for tool, args, ok in [("get_order", {}, False), ("send_email", {"to": ["a@x.com"]}, False), ("send_email", {"to": ["a@x.com"]}, True),
("send_email", {"to": ["a@x.com", "b@x.com"]}, True), ("refund", {"amount": 90000}, True),
("delete_account", {}, True), ("drop_database", {}, True)]:
print(f"{tool:15} {str(args):28} approved={ok!s:5} -> {decide(tool, args, ok)}")
Output:
get_order {} approved=False -> ALLOW
send_email {'to': ['a@x.com']} approved=False -> ASK the human
send_email {'to': ['a@x.com']} approved=True -> ALLOW
send_email {'to': ['a@x.com', 'b@x.com']} approved=True -> DENY (too many recipients)
refund {'amount': 90000} approved=True -> DENY (amount over limit)
delete_account {} approved=True -> DENY
drop_database {} approved=True -> DENY (unknown tool)नीति को कोड की तरह परखें
Allow, ask और deny मामलों की unit test करें, सीमा के ठीक बराबर जैसे मानों समेत।
त्वरित जाँच: जिस tool को नीति नहीं जानती उसका क्या होना चाहिए?
- डिफ़ॉल्ट रूप से deny
- Allow, क्योंकि मॉडल ने माँगा
- एक बार allow, फिर पूछें
- नीति अनदेखी करें
Answer
डिफ़ॉल्ट रूप से deny — Default-deny का अर्थ नए या injected tool नाम निकल नहीं सकते।