# ๐Ÿš€ 10๋ถ„ ๋งŒ์— ๋๋‚ด๋Š” ์—์ด์ „ํŠธ ๊ฑฐ๋ฒ„๋„Œ์Šค ์‹œ์ž‘ ๊ฐ€์ด๋“œ 10๋ถ„ ์•ˆ์— ๊ฑฐ๋ฒ„๋„Œ์Šค๊ฐ€ ์ ์šฉ๋œ AI ์—์ด์ „ํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด ๋ณด์„ธ์š”. > **์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ:** Python 3.11+ / Node.js 18+ / .NET 8.0+ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ. ## ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š” ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ ˆ์ด์–ด๋Š” ๋ชจ๋“  ์—์ด์ „ํŠธ์˜ ํ–‰๋™์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ด๋ฅผ ๊ฐ€๋กœ์ฑ„์„œ(intercept) ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ```mermaid graph LR A[AI ์—์ด์ „ํŠธ] -->|๋„๊ตฌ ํ˜ธ์ถœ| B{๊ฑฐ๋ฒ„๋„Œ์Šค ๋ ˆ์ด์–ด} B -->|์ •์ฑ… ํ™•์ธ| C{์ •์ฑ… ์—”์ง„} C -->|ํ—ˆ์šฉ| D[๋„๊ตฌ ์‹คํ–‰] C -->|์ฐจ๋‹จ| E[๋ณด์•ˆ ์ฐจ๋‹จ] D --> F[๊ฐ์‚ฌ ๋กœ๊ทธ] E --> F F --> G[OTEL / ๊ตฌ์กฐํ™”๋œ ๋กœ๊ทธ] ``` ## 1. ์„ค์น˜ ๊ฑฐ๋ฒ„๋„Œ์Šค ํˆดํ‚ท ํ†ตํ•ฉ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ```bash pip install agent-governance-toolkit[full] ``` ๋˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ๋ณ„๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```bash pip install agent-os-kernel # ์ •์ฑ… ๊ฐ•์ œ + ํ”„๋ ˆ์ž„์›Œํฌ ์—ฐ๋™ pip install agentmesh-platform # ์ œ๋กœ ํŠธ๋Ÿฌ์ŠคํŠธ ์‹ ์›์ฆ๋ช… + ์‹ ๋ขฐ ์นด๋“œ pip install agent-governance-toolkit # OWASP ASI ๊ฒ€์ฆ + ๋ฌด๊ฒฐ์„ฑ CLI pip install agent-sre # SLO, ์—๋Ÿฌ ๋ฒ„์ง“, ์นด์˜ค์Šค ํ…Œ์ŠคํŠธ pip install agentmesh-runtime # ์‹คํ–‰ ๊ฐ๋…๊ด€ + ๊ถŒํ•œ ๊ฒฉ๋ฆฌ ๋ง pip install agentmesh-marketplace # ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ pip install agentmesh-lightning # ๊ฐ•ํ™”ํ•™์Šต(RL) ํ›ˆ๋ จ ๊ฑฐ๋ฒ„๋„Œ์Šค ``` ### TypeScript / Node.js ```bash npm install @microsoft/agent-governance-sdk ``` ### .NET ```bash dotnet add package Microsoft.AgentGovernance ``` `.csproj` ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œํ•ด์„œ ์‹คํ–‰ํ•˜์„ธ์š”. ```bash dotnet add YourApp.csproj package Microsoft.AgentGovernance ``` Visual Studio Package Manager Console์—์„œ๋Š” **Default project** ๋“œ๋กญ๋‹ค์šด์—์„œ ๋Œ€์ƒ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ ๋ฅธ ๋’ค ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ```powershell Install-Package Microsoft.AgentGovernance ``` ## 2. ์„ค์น˜ ํ™•์ธ ๋ฏธ๋ฆฌ ํฌํ•จ๋œ ์ ๊ฒ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ```bash python scripts/check_gov.py ``` ๋˜๋Š” agt CLI๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•ด๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ```bash agt verify agt verify --badge ``` ## 3. ์ฒซ ๋ฒˆ์งธ ๊ฑฐ๋ฒ„๋„Œ์Šค ์—์ด์ „ํŠธ ๋งŒ๋“ค๊ธฐ `governed_agent.py` ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ```python from agent_os.policies import PolicyEvaluator from agent_os.policies.schema import ( PolicyDocument, PolicyRule, PolicyCondition, PolicyAction, PolicyOperator, PolicyDefaults, ) # --- 1๋‹จ๊ณ„: ์—์ด์ „ํŠธ ๋„๊ตฌ(tool) ์ •์˜ --- def web_search(query: str) -> str: """์›น ๊ฒ€์ƒ‰ ๋„๊ตฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜""" return f"๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ: {query}" def delete_file(path: str) -> str: """์œ„ํ—˜ํ•œ ๋„๊ตฌ โ€” ์ •์ฑ…์— ์˜ํ•ด ์ฐจ๋‹จ๋˜์–ด์•ผ ํ•จ""" return f"์‚ญ์ œ๋จ: {path}" TOOLS = { "web_search": web_search, "delete_file": delete_file, } # --- 2๋‹จ๊ณ„: ๊ฑฐ๋ฒ„๋„Œ์Šค ์ •์ฑ… ์ •์˜ --- policy = PolicyDocument( name="agent-safety", version="1.0", description="์—ฐ๊ตฌ์šฉ ์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ „ ์ •์ฑ…", defaults=PolicyDefaults(action=PolicyAction.ALLOW), rules=[ PolicyRule( name="block-dangerous-tools", condition=PolicyCondition( field="tool_name", operator=PolicyOperator.IN, value=["delete_file", "shell_exec", "execute_code"], ), action=PolicyAction.DENY, message="์•ˆ์ „ ์ •์ฑ…์— ์˜ํ•ด ๋„๊ตฌ๊ฐ€ ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", priority=100, ), PolicyRule( name="block-ssn-patterns", condition=PolicyCondition( field="input_text", operator=PolicyOperator.MATCHES, value=r"\b\d{3}-\d{2}-\d{4}\b", ), action=PolicyAction.DENY, message="๊ฐœ์ธ์ •๋ณด์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌํšŒ๋ณด์žฅ๋ฒˆํ˜ธ(SSN) ํŒจํ„ด ๊ฐ์ง€ โ€” ์ฐจ๋‹จ๋จ", priority=90, ), ], ) evaluator = PolicyEvaluator(policies=[policy]) # --- 3๋‹จ๊ณ„: ๊ฑฐ๋ฒ„๋„Œ์Šค ์—์ด์ „ํŠธ ๊ตฌ์ถ• --- class GovernedAgent: """๋ชจ๋“  ๋„๊ตฌ(Tool) ํ˜ธ์ถœ ์ „์— ์ •์ฑ…์„ ํ™•์ธํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์—์ด์ „ํŠธ""" def __init__(self, name, tools, evaluator): self.name = name self.tools = tools self.evaluator = evaluator def call_tool(self, tool_name: str, params: dict) -> str: # ์‹คํ–‰๊ด€๋ จ ์‚ฌ์ „ ์ •์ฑ… ํ™•์ธ (Pre-execution check) decision = self.evaluator.evaluate({ "tool_name": tool_name, "input_text": str(params), "agent_id": self.name, }) if not decision.allowed: print(f" โœ— ์ฐจ๋‹จ๋จ: {decision.reason}") return f"[์ฐจ๋‹จ๋จ] {decision.reason}" # ๋„๊ตฌ ์‹คํ–‰ print(f" โœ“ ํ—ˆ์šฉ๋จ: {tool_name}") tool_fn = self.tools[tool_name] return tool_fn(**params) # --- 4๋‹จ๊ณ„: ์‹คํ–‰ --- agent = GovernedAgent("research-agent", TOOLS, evaluator) print("์—์ด์ „ํŠธ: ์›น ๊ฒ€์ƒ‰ ์ค‘...") result = agent.call_tool("web_search", {"query": "์ตœ์‹  AI ๊ฑฐ๋ฒ„๋„Œ์Šค ๋‰ด์Šค"}) print(f" ๊ฒฐ๊ณผ: {result}\n") print("์—์ด์ „ํŠธ: ํŒŒ์ผ ์‚ญ์ œ ์‹œ๋„ ์ค‘...") result = agent.call_tool("delete_file", {"path": "/etc/passwd"}) print(f" ๊ฒฐ๊ณผ: {result}\n") print("์—์ด์ „ํŠธ: ์ฟผ๋ฆฌ์— SSN์„ ํฌํ•จํ•˜์—ฌ ๊ฒ€์ƒ‰ ์ค‘...") result = agent.call_tool("web_search", {"query": "lookup 123-45-6789"}) print(f" ๊ฒฐ๊ณผ: {result}") ``` ์‹คํ–‰ ๊ฒฐ๊ณผ ํ™•์ธ: ```bash python governed_agent.py ``` ์˜ˆ์ƒ ์ถœ๋ ฅ: ``` ์—์ด์ „ํŠธ: ์›น ๊ฒ€์ƒ‰ ์ค‘... โœ“ ํ—ˆ์šฉ๋จ: web_search ๊ฒฐ๊ณผ: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ: ์ตœ์‹  AI ๊ฑฐ๋ฒ„๋„Œ์Šค ๋‰ด์Šค ์—์ด์ „ํŠธ: ํŒŒ์ผ ์‚ญ์ œ ์‹œ๋„ ์ค‘... โœ— ์ฐจ๋‹จ๋จ: ์•ˆ์ „ ์ •์ฑ…์— ์˜ํ•ด ๋„๊ตฌ๊ฐ€ ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ: [์ฐจ๋‹จ๋จ] ์•ˆ์ „ ์ •์ฑ…์— ์˜ํ•ด ๋„๊ตฌ๊ฐ€ ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ: ์ฟผ๋ฆฌ์— SSN์„ ํฌํ•จํ•˜์—ฌ ๊ฒ€์ƒ‰ ์ค‘... โœ— ์ฐจ๋‹จ๋จ: ์‚ฌํšŒ๋ณด์žฅ๋ฒˆํ˜ธ(SSN) ํŒจํ„ด ๊ฐ์ง€ โ€” ์ฐจ๋‹จ๋จ ๊ฒฐ๊ณผ: [์ฐจ๋‹จ๋จ] ์‚ฌํšŒ๋ณด์žฅ๋ฒˆํ˜ธ(SSN) ํŒจํ„ด ๊ฐ์ง€ โ€” ์ฐจ๋‹จ๋จ ``` ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ ˆ์ด์–ด๋Š” ์‹คํ–‰ ์ „ **๋ชจ๋“  ๋„๊ตฌ ํ˜ธ์ถœ**์„ ๊ฐ€๋กœ์ฑ•๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—์ด์ „ํŠธ๊ฐ€ `delete_file`์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ธ ์ •๋ณด(PII)๋ฅผ ์œ ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ### YAML ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ •์ฑ… ๋กœ๋”ฉ ์‹ค๋ฌด ํ™˜๊ฒฝ์—์„œ๋Š” ์ธ๋ผ์ธ ์ฝ”๋“œ ๋Œ€์‹  YAML ํŒŒ์ผ๋กœ ์ •์ฑ…์„ ์ •์˜ํ•˜์„ธ์š”. ```python from agent_os.policies import PolicyEvaluator evaluator = PolicyEvaluator() evaluator.load_policies("policies/") # ๋ชจ๋“  *.yaml ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. result = evaluator.evaluate({"tool_name": "web_search", "agent_id": "analyst-1"}) print(f"ํ—ˆ์šฉ ์—ฌ๋ถ€: {result.allowed}") ``` ### ์ฒซ ๋ฒˆ์งธ ๊ฑฐ๋ฒ„๋„Œ์Šค ์—์ด์ „ํŠธ โ€” TypeScript `governed_agent.ts` ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ```typescript import { PolicyEngine, AgentIdentity, AuditLogger } from "@microsoft/agent-governance-sdk"; const identity = AgentIdentity.generate("my-agent", ["web_search", "read_file"]); const engine = new PolicyEngine([ { action: "web_search", effect: "allow" }, { action: "delete_file", effect: "deny" }, ]); console.log(engine.evaluate("web_search")); // "allow" (ํ—ˆ์šฉ) console.log(engine.evaluate("delete_file")); // "deny" (์ฐจ๋‹จ) ``` ### ์ฒซ ๋ฒˆ์งธ ๊ฑฐ๋ฒ„๋„Œ์Šค ์—์ด์ „ํŠธ โ€” .NET `GovernedAgent.cs` ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ```csharp using AgentGovernance; using AgentGovernance.Policy; var kernel = new GovernanceKernel(new GovernanceOptions { PolicyPaths = new() { "policies/default.yaml" }, EnablePromptInjectionDetection = true, }); var result = kernel.EvaluateToolCall("did:mesh:agent-1", "web_search", new() { ["query"] = "AI news" }); Console.WriteLine($"Allowed: {result.Allowed}"); // ์ •์ฑ…์ด ํ—ˆ์šฉํ•  ๊ฒฝ์šฐ True result = kernel.EvaluateToolCall("did:mesh:agent-1", "delete_file", new() { ["path"] = "/etc/passwd" }); Console.WriteLine($"Allowed: {result.Allowed}"); // False ``` ## 4. ๊ธฐ์กด ํ”„๋ ˆ์ž„์›Œํฌ ์—ฐ๋™ ์ด ํˆดํ‚ท์€ ์ฃผ์š”ํ•œ ์—์ด์ „ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์—ฐ๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ LangChain ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ```python from agent_os.policies import PolicyEvaluator # ๊ฑฐ๋ฒ„๋„Œ์Šค ์ •์ฑ… ๋กœ๋“œ evaluator = PolicyEvaluator() evaluator.load_policies("policies/") # ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ชจ๋“  ๋„๊ตฌ ํ˜ธ์ถœ ์ „ ํ‰๊ฐ€ ์ˆ˜ํ–‰ decision = evaluator.evaluate({ "agent_id": "langchain-agent-1", "tool_name": "web_search", "action": "tool_call", }) if decision.allowed: # LangChain ๋„๊ตฌ ํ˜ธ์ถœ ์ง„ํ–‰ result = your_langchain_agent.run(...) else: print(f"์ฐจ๋‹จ๋จ: {decision.reason}") ``` ์‹ฌํ™”๋œ ์—ฐ๋™ ๊ตฌํ˜„์„ ์œ„ํ•ด ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ์ „์šฉ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```bash pip install agentmesh-langchain # LangChain ์–ด๋Œ‘ํ„ฐ pip install llamaindex-agentmesh # LlamaIndex ์–ด๋Œ‘ํ„ฐ pip install crewai-agentmesh # CrewAI ์–ด๋Œ‘ํ„ฐ ``` ์ง€์›๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ: **LangChain**, **OpenAI Agents SDK**, **AutoGen**, **CrewAI**, **Google ADK**, **Semantic Kernel**, **LlamaIndex**, **Anthropic**, **Mistral**, **Gemini** ๋“ฑ. ## 5. OWASP ASI 2026 ์ปค๋ฒ„๋ฆฌ์ง€ ํ™•์ธ ๋ฐฐํฌ ํ™˜๊ฒฝ์ด OWASP ์—์ด์ „ํŠธ ๋ณด์•ˆ ์œ„ํ˜‘์„ ์ปค๋ฒ„ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ```bash # ํ…์ŠคํŠธ ์š”์•ฝ ๋ณด๊ณ ์„œ agt verify # CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์œ„ํ•œ JSON ์ถœ๋ ฅ agt verify --json # README์šฉ ๋ฐฐ์ง€(Badge) ์ƒ์„ฑ agt verify --badge ``` ### ์•ˆ์ „ํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํˆดํ‚ท์˜ ๋ชจ๋“  CLI ๋„๊ตฌ๋Š” ๋‚ด๋ถ€ ์ •๋ณด ์œ ์ถœ์„ ๋ฐฉ์ง€ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. JSON ๋ชจ๋“œ์—์„œ ๋ช…๋ น์ด ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์ œ๋œ ์Šคํ‚ค๋งˆ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ```json { "status": "error", "message": "An internal error occurred during verification", "type": "InternalError" } ``` "File not found(ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ)"์ฒ˜๋Ÿผ ์ž˜ ์•Œ๋ ค์ง„ ์—๋Ÿฌ๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฉ”์‹œ์ง€๋ฅผ ํฌํ•จํ•˜์ง€๋งŒ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์‹œ์Šคํ…œ ์—๋Ÿฌ๋Š” ๋ณด์•ˆ ๋ฌด๊ฒฐ์„ฑ์„ ์œ„ํ•ด ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ## 6. ๋ชจ๋“ˆ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ชจ๋“ˆ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ```bash # ๊ธฐ์ค€ ๋ฌด๊ฒฐ์„ฑ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์ƒ์„ฑ(Baseline integrity manifest) agt integrity --generate integrity.json # ์ดํ›„ ํ•ด๋‹น ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒ€์ฆ ์ˆ˜ํ–‰ agt integrity --manifest integrity.json ``` ## ๋” ์•Œ์•„๋ณด๊ธฐ | ํ•ญ๋ชฉ | ์œ„์น˜ | |------|-------| | ์ „์ฒด API ๋ ˆํผ๋Ÿฐ์Šค (Python) | [agent-governance-python/agent-os/README.md](../../agent-governance-python/agent-os/README.md) | | TypeScript ํŒจํ‚ค์ง€ ๋ฌธ์„œ | [agent-governance-typescript/README.md](../../agent-governance-typescript/README.md) | | .NET ํŒจํ‚ค์ง€ ๋ฌธ์„œ | [agent-governance-dotnet/README.md](../../agent-governance-dotnet/README.md) | | OWASP ์ปค๋ฒ„๋ฆฌ์ง€ ๋งต | [docs/OWASP-COMPLIANCE.md](../../docs/OWASP-COMPLIANCE.md) | | ํ”„๋ ˆ์ž„์›Œํฌ ํ†ตํ•ฉ ๊ฐ€์ด๋“œ | [agent-governance-python/agent-os/src/agent_os/integrations/](../../agent-governance-python/agent-os/src/agent_os/integrations/) | | ์˜ˆ์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ | [agent-governance-python/agent-os/examples/](../../agent-governance-python/agent-os/examples/) | | ๊ธฐ์—ฌํ•˜๊ธฐ | [CONTRIBUTING.md](../../CONTRIBUTING.md) | | ๋ณ€๊ฒฝ ์ด๋ ฅ | [CHANGELOG.md](../../CHANGELOG.md) | --- *๋ณธ ๊ฐ€์ด๋“œ๋Š” [@davidequarracino](https://github.com/davidequarracino) ๋‹˜์ด ์ž‘์„ฑํ•˜์‹  ์ดˆ๊ธฐ ํ€ต ์Šคํƒ€ํŠธ ๋ฌธ์„œ๋“ค([#106](https://github.com/microsoft/agent-governance-toolkit/pull/106), [#108](https://github.com/microsoft/agent-governance-toolkit/pull/108))์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.*