0
0
Lập trình
TT

🔐 Kiểm Soát Quyền Chi Tiết cho Công Cụ MCP với APIM

Đăng vào 4 tháng trước

• 7 phút đọc

🔐 Kiểm Soát Quyền Chi Tiết cho Công Cụ MCP với APIM

Trong một bài viết trước, chúng ta đã tìm hiểu cách thực thi kiểm soát truy cập dựa trên vai trò (RBAC) cho các workflow Logic App bằng cách kết hợp Azure API Management (APIM) với Easy Auth.

👉 Nguyên tắc tương tự cũng áp dụng khi bạn công khai máy chủ Logic Apps MCP thông qua APIM.

Thay vì bảo vệ các workflow trực tiếp, chúng ta có thể bảo vệ các công cụ MCP — đảm bảo chỉ những người dùng có vai trò thích hợp mới có thể gọi các công cụ đó.


1. Tại sao cần thực thi ủy quyền ở cấp độ công cụ?

Các máy chủ MCP (Model Context Protocol) công khai các công cụ như những hoạt động có thể gọi được.

Ví dụ, một máy chủ MCP có thể cung cấp các công cụ như:

  • wf_arithmetic_add
  • wf_arithmetic_sub
  • wf_arithmetic_div

Nếu không có kiểm soát quyền truy cập, bất kỳ người dùng nào đã xác thực cũng có thể gọi bất kỳ công cụ nào.

Nhưng trong nhiều tình huống, bạn cần ủy quyền chi tiết:

  • Người dùng tài chính chỉ có thể chạy các công cụ tính toán tài chính.
  • Người dùng kỹ thuật chỉ có thể chạy các công cụ thiết kế.
  • Người dùng vận hành chỉ có thể chạy các công cụ giám sát.

2. Cấu hình chính sách ở cấp độ máy chủ MCP

Khi bạn công khai một máy chủ Logic Apps MCP trong APIM, bạn có thể đính kèm một chính sách ở cấp độ máy chủ MCP, cho phép bạn:

  • Chặn mọi yêu cầu JSON-RPC MCP
  • Phân tích tải trọng yêu cầu (method, params, arguments)
  • Xác thực và thực thi JWT tokens
  • Ánh xạ các vai trò trong token đến tên công cụ MCP

📍 Các bước trong cổng thông tin:

  1. Truy cập API ManagementMáy chủ MCP (bản xem trước).
  2. Chọn máy chủ MCP của bạn (ví dụ, ArithmeticOperations).
  3. Mở tab Policies.
  4. Dán đoạn mã chính sách dưới đây và lưu lại.

Điều này đảm bảo tất cả các hoạt động trên máy chủ MCP đó đều thừa hưởng cùng một quy tắc.


3. Phân biệt giữa Kết nối và Gọi công cụ

Một khách hàng MCP đầu tiên phát hành một cuộc gọi kết nối để khám phá khả năng.

Chúng ta không muốn thực thi xác thực trên những yêu cầu metadata này.

Vì vậy, trong APIM, chúng ta phân nhánh theo thân yêu cầu:

  • Nếu method = "tools/call" → 🔒 yêu cầu JWT + xác thực vai trò
  • Ngược lại (kết nối, khả năng, v.v.) → ✅ cho phép mà không cần xác thực

4. Ví dụ về chính sách

Dưới đây là một chính sách APIM đơn giản thực thi RBAC trên các cuộc gọi công cụ:

Copy
<inbound>
  <base />

  <!-- Phân tích thân JSON -->
  <set-variable name="mcpBody" value="@(
    context.Request.Body.As<JObject>(preserveContent: true)
  )" />
  <set-variable name="mcpMethod" value="@{
    var body = (JObject)context.Variables["mcpBody"];
    return (string)body?["method"] ?? string.Empty;
  }" />

  <choose>
    <!-- 🔒 Chỉ xác thực các cuộc gọi công cụ -->
    <when condition="@((context.Variables.GetValueOrDefault<string>("mcpMethod") ?? "").Equals("tools/call", StringComparison.OrdinalIgnoreCase))">

      <!-- Xác thực JWT -->
      <validate-jwt header-name="Authorization" failed-validation-httpcode="401">
        <openid-config url="https://login.microsoftonline.com/<TENANT_ID>/v2.0/.well-known/openid-configuration" />
        <audiences>
          <audience>api://<YOUR-APP-ID-URI></audience>
        </audiences>
      </validate-jwt>

      <!-- Trích xuất tên công cụ -->
      <set-variable name="mcpToolName" value="@{
        var body = context.Request.Body.As<JObject>(preserveContent: true);
        return (string)body["params"]?["name"];
      }" />

      <!-- Trích xuất vai trò -->
      <set-variable name="roles_csv" value="@{
        var tok = context.Request.Headers.GetValueOrDefault("Authorization","").Substring(7);
        var jwt = string.IsNullOrEmpty(tok) ? null : tok.AsJwt();
        var arr = (jwt != null && jwt.Claims != null && jwt.Claims.ContainsKey("roles"))
                    ? jwt.Claims["roles"]
                    : new string[0];
        return string.Join(",", arr);   // ví dụ: "wf_arithmetic_add,wf_arithmetic_sub"
      }" />

      <!-- So sánh tên công cụ với các vai trò -->
      <set-variable name="isAuthorized" value="@{
        var wf = ((string)context.Variables.GetValueOrDefault("mcpToolName","")).ToLower();
        var roles = ((string)context.Variables.GetValueOrDefault("roles_csv","")).ToLower().Replace(" ", "");
        if (string.IsNullOrEmpty(wf) || string.IsNullOrEmpty(roles)) { return false; }
        var haystack = "," + roles + ",";
        var needle = "," + wf + ",";
        return haystack.Contains(needle);
      }" />

      <!-- Chặn nếu không được phép -->
      <choose>
        <when condition="@((bool)context.Variables["isAuthorized"])">
          <!-- Được phép, tiếp tục -->
        </when>
        <otherwise>
          <return-response>
            <set-status code="403" reason="Forbidden" />
            <set-body>@("{\"error\":\"Vai trò thiếu hoặc không hợp lệ\"}")</set-body>
          </return-response>
        </otherwise>
      </choose>
    </when>

    <!-- ✅ Cho phép các cuộc gọi không phải công cụ (kết nối, tài nguyên, v.v.) -->
    <otherwise />
  </choose>
</inbound>

5. Xác thực — Gọi Công Cụ MCP thông qua APIM

Với chính sách đã được thiết lập ở cấp độ máy chủ MCP, hãy xác thực hành vi này.

5.1 Cuộc gọi công cụ được ủy quyền

Khi một token hợp lệ được cung cấp và vai trò khớp với công cụ (wf_arithmetic_add), yêu cầu sẽ thành công:

Yêu cầu

Copy
{
  "method": "tools/call",
  "params": {
    "name": "wf_arithmetic_add",
    "arguments": {
      "number1": 1,
      "number2": 2
    }
  }
}

Phản hồi

Copy
{
    "content": [
        {
            "type": "text",
            "text": "{\"result\":3}"
        }
    ],
    "isError": false
}

5.2 Cuộc gọi công cụ không được ủy quyền (không khớp vai trò)

Nếu người gọi cố gắng gọi một công cụ mà không có vai trò yêu cầu trong token của họ,

APIM sẽ chặn yêu cầu trước khi nó đến máy chủ Logic Apps MCP.

Yêu cầu

Copy
{
  "method": "tools/call",
  "params": {
    "name": "wf_arithmetic_mul",
    "arguments": {
      "number1": 2,
      "number2": 2
    }
  }
}

Phản hồi

Copy
"Lỗi khi gọi phương thức: tools/call. Lỗi: Lỗi POST đến điểm cuối (HTTP 403): {\"error\":\"Vai trò thiếu hoặc không hợp lệ\"}"

🔎 Tóm tắt Cuối cùng

Bằng cách kết hợp Azure API Management (APIM) với Máy chủ Logic Apps MCP, chúng ta có thể đạt được ủy quyền dựa trên vai trò chi tiếtcấp độ công cụ:

  • Cuộc gọi kết nối / khám phá → Đi qua mà không cần xác thực.

  • Cuộc gọi công cụ (tools/call) → Yêu cầu một JWT hợp lệ.

  • Kiểm tra vai trò → Tên công cụ phải khớp với một trong các vai trò trong token.

  • Phản hồi

    • 401 Unauthorized → Không có hoặc token không hợp lệ.
    • 403 Forbidden → Token hợp lệ nhưng không khớp vai trò.
    • 200 OK → Token hợp lệ và vai trò khớp với công cụ.

Kết quả:

  • Mỗi công cụ MCP có thể được khóa lại cho các vai trò cụ thể.
  • Backend Logic Apps MCP vẫn không thay đổi.
  • APIM hoạt động như điểm thực thi chính sách, xử lý bảo mật, ghi chép và quản lý.

Với thiết lập này, bạn có thể công khai an toàn các máy chủ Logic Apps MCP cho các LLM và tác nhân, trong khi đảm bảo mọi cuộc gọi đều được xác thực, ủy quyền và ghi lại.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào