Khi Anthropic công bố kiến trúc containment cho các agent dựa trên Claude, tôi nhận ra điều mà 15 năm làm kỹ thuật bảo mật đã dẫn đến: AI agent cần mô hình bảo mật giống hệt như chúng ta áp dụng cho code không tin cậy.

Không phải phiên bản nhẹ hơn. Không phải “tin tưởng nhưng kiểm tra”. Đúng là cùng một mô hình — isolation trước, cấp quyền sau, audit tất cả.

Vấn đề là hầu hết các team triển khai agent theo chiều ngược lại. Họ cấp quyền truy cập rộng rãi vì đó là “hệ thống của họ”, rồi cố gắng hạn chế sau khi sự cố xảy ra. Đây là cách bạn tạo ra các agent vô tình xóa dữ liệu production, rò rỉ secrets vào context window của LLM, hoặc bị thao túng để lạm dụng chính những quyền hợp lệ của chúng.


Insight Cốt Lõi: Agent Là Code Không Tin Cậy

Đây là sự thay đổi tư duy quan trọng: một AI agent không phải đồng nghiệp của bạn. Đó là một process thực thi các lệnh tùy ý được dẫn xuất từ language model, user input và tool output — bất kỳ thứ nào trong số đó đều có thể bị tạo ra một cách độc hại.

Ngay khi bạn chấp nhận điều này, kiến trúc bảo mật trở nên hiển nhiên. Bạn đã biết cách sandbox code không tin cậy. Bạn làm điều đó cho JavaScript trên browser, cho microservice trong container, cho sandbox xử lý thanh toán. Các kỹ thuật này áp dụng trực tiếp.

Framework containment của Anthropic tổ chức điều này thành bốn tầng, mỗi tầng xử lý một attack surface khác nhau.


Tầng 1: Process Isolation

Ranh giới đầu tiên là ranh giới tính toán. Môi trường thực thi của agent không được có quyền truy cập tài nguyên host-level ngoài những gì được cấp phép một cách rõ ràng.

Trong thực tế, điều này có nghĩa là container — nhưng không chỉ Docker với cài đặt mặc định. Bạn cần:

  • Root filesystem chỉ đọc — agent không thể sửa đổi runtime của chính nó
  • Drop Linux capabilities — không có CAP_NET_ADMIN, CAP_SYS_ADMIN, không có đường leo thang đặc quyền
  • Resource quotas — giới hạn CPU, memory và I/O ngăn các vòng inference không kiểm soát làm sập các service lân cận
  • Không chia sẻ kernel namespace — mỗi instance agent chạy trong PID, network và mount namespace riêng của nó

Trong .NET, điều này ánh xạ gọn gàng sang việc chạy agent worker trong container với --cap-drop ALL --cap-add NET_BIND_SERVICE --read-only --tmpfs /tmp. Ứng dụng chạy với user không phải root, không có quyền ghi ngoài các path scratch được chỉ định.


Tầng 2: Filesystem Sandboxing

Process isolation xử lý ranh giới compute. Filesystem sandboxing xử lý ranh giới dữ liệu.

Một agent nên hoạt động trong một working directory có scope, không có quyền truy cập vào host path, workspace của agent khác, hoặc secret store. Nguyên tắc đơn giản: nếu agent không cần nó để hoàn thành task, nó không thể thấy nó.

Mô hình của Anthropic thêm một tinh chỉnh hữu ích: ephemeral workspace theo mặc định. Working directory của agent được tạo mới cho mỗi task và bị xóa khi hoàn thành. Bất kỳ thứ gì cần được lưu giữ phải được ghi rõ ràng vào durable store thông qua controlled interface — không phải thông qua quyền truy cập filesystem trực tiếp.

Trong .NET, triển khai điều này với workspace factory:

public async Task<AgentWorkspace> CreateEphemeralWorkspace(string taskId)
{
    var path = Path.Combine(_baseDir, "agent-workspaces", taskId);
    Directory.CreateDirectory(path);
    return new AgentWorkspace(path, maxSizeBytes: 100 * 1024 * 1024);
}

Class AgentWorkspace validate mọi thao tác path với root — không có ../ escape, không có symlink traversal, không có absolute path ngoài sandbox. Đây chính xác là cách bạn xây dựng secure file upload handler, áp dụng cho agent execution.


Tầng 3: Kiểm Soát Network Egress

Đây là tầng hầu hết các team bỏ qua, và cũng là nơi xảy ra các vi phạm gây hại nhất.

Một agent với quyền truy cập mạng không bị hạn chế có thể: exfiltrate dữ liệu đến endpoint do kẻ tấn công kiểm soát, gọi external API mà không được ủy quyền, tạo các request bypass rate limiting và audit logging, và trở thành vector cho supply-chain attack nếu tool implementation của nó fetch remote content.

Cách tiếp cận của Anthropic là egress allowlist: agent chỉ có thể tiếp cận các endpoint được phê duyệt trước, và mỗi kết nối outbound được ghi log với identity của agent, target, và tool đã khởi tạo.

Trong Kubernetes, đây là NetworkPolicy. Trong Docker Compose, bạn thêm egress proxy (Squid hoặc Envoy đều hoạt động tốt). Trong AWS, đó là VPC với egress qua inspecting NAT Gateway và Security Group chỉ whitelist các destination cần thiết.

Với .NET HttpClient, enforce điều này ở tầng HttpMessageHandler:

public class EgressGuardHandler : DelegatingHandler
{
    private readonly HashSet<string> _allowedHosts;
    
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken ct)
    {
        var host = request.RequestUri?.Host;
        if (host == null || !_allowedHosts.Contains(host))
            throw new SecurityException($"Egress blocked: {host}");
            
        _logger.LogInformation("Agent egress: {Host} via {Tool}", host, _currentTool);
        return await base.SendAsync(request, ct);
    }
}

Tầng 4: Tool Permission Scoping

Tầng thứ tư có ngữ nghĩa phong phú nhất: kiểm soát những gì agent có thể làm, không chỉ nơi nó có thể đi.

Mô hình tool permission của Anthropic hoạt động giống như OAuth scope. Mỗi tool được khai báo với tập capability tối thiểu mà nó yêu cầu. Agent được cấp tập con của các tool có sẵn cho mỗi task, dựa trên những gì task đó hợp lệ cần. Bản thân các tool bị hạn chế ở các resource scope cụ thể.

Vấn đề “confused deputy” rất quan trọng ở đây. Một cuộc tấn công confused deputy hoạt động như sau: một input độc hại thuyết phục agent của bạn sử dụng tool hợp lệ có đặc quyền cao theo cách mà nhà thiết kế hệ thống không dự định. Agent không bị xâm phạm — nó đang làm chính xác những gì nó được ủy quyền làm, chỉ là trong ngữ cảnh mà kẻ tấn công đã tạo ra.

Trong .NET, mô hình hóa điều này như capability token được cấp khi tạo task:

public record AgentCapabilities(
    IReadOnlySet<ToolName> AllowedTools,
    IReadOnlySet<string> AllowedResourcePrefixes,
    bool CanWriteExternalSystems,
    TimeSpan MaxExecutionTime
);

Mỗi lần gọi tool validate capability token trước khi thực thi. Token là bất biến sau khi được cấp. Ngay cả khi LLM của agent tạo ra lời gọi tool ngoài scope được cấp, runtime từ chối trước khi thực thi.


Production Containment Checklist

Trước khi triển khai bất kỳ agent nào lên production, hãy xác minh 10 kiểm soát này:

  1. Container chạy với user không phải root với root filesystem chỉ đọc
  2. Tất cả Linux capabilities đã bị drop trừ những capabilities cần thiết một cách rõ ràng
  3. Ephemeral workspace được tạo cho mỗi task, bị xóa khi hoàn thành
  4. Egress allowlist được enforce ở tầng mạng, không phải tầng ứng dụng
  5. Mỗi kết nối outbound được ghi log với agent identity và tool khởi tạo
  6. Tool allowlist theo loại task — không có agent role nào có quyền truy cập tất cả tool
  7. Resource scope validation trong mỗi tool — path, resource ID, account scope đều được kiểm tra
  8. Thời gian thực thi tối đa được enforce với hard timeout, không chỉ soft cancellation
  9. Audit log cho mỗi lần gọi tool bao gồm input, output và thời gian
  10. Playbook ứng phó sự cố có thể thu hồi credential agent và terminate session trong vòng 60 giây

Containment cuối cùng sẽ thất bại — câu hỏi là bạn có thể phản ứng nhanh đến mức nào khi nó xảy ra.


Tại Sao Điều Này Quan Trọng Hơn Bao Giờ Hết

Khi các agent chuyển từ demo sang hệ thống production chạm vào dữ liệu và tiền thật, bề mặt bảo mật tăng lên theo tỷ lệ tương ứng. Các team sẽ ship an toàn ở quy mô lớn là những team coi agent containment như một mối quan tâm kỹ thuật hàng đầu — không phải checklist tuân thủ được áp dụng sau khi ra mắt.

Framework của Anthropic không có gì kỳ lạ. Đó là ứng dụng có kỷ luật của các nguyên tắc bảo mật mà chúng ta đã duy trì trong nhiều thập kỷ, được điều chỉnh cho môi trường thực thi mới.

Bắt đầu với Tầng 1. Container hóa với đặc quyền tối thiểu. Mọi thứ khác xây dựng từ đó.

Xuất nội dung

Bình luận