SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor

Chạy Claude Code an toàn trên server như thế nào

Claude Code có thể chạy mọi command mà user được phép chạy. Tìm hiểu skip permissions thay đổi gì và cách giới hạn rủi ro bằng sandbox, container hoặc VPS dùng một lần.

Chạy Claude Code an toàn trên server có nghĩa là gì

Để chạy Claude Code an toàn trên server, hãy bật các prompt yêu cầu cấp quyền, chạy Claude Code bằng một user riêng không có quyền đặc biệt, và tạo ranh giới thực sự cho các lần chạy không cần giám sát thay vì chỉ dựa vào mức độ tin cậy: dùng sandbox tích hợp sẵn, container hoặc một VPS có thể hủy, trên đó không lưu dữ liệu quan trọng. Flag --dangerously-skip-permissions loại bỏ bước phê duyệt giữa model và shell của bạn. Đánh đổi này có thể phù hợp với các tác vụ không cần giám sát, nhưng chỉ nên thực hiện bên trong một ranh giới giới hạn phạm vi mà một command sai có thể truy cập. Hướng dẫn này giải thích flag thực sự thay đổi điều gì và cách xây dựng ranh giới đó theo các mức cô lập tăng dần.

Claude Code có thể làm gì trên máy chủ của bạn

Claude Code là một coding agent chạy trong terminal. Nó đọc file, ghi file và chạy shell command với quyền của user khởi động nó. Đó là giá trị cốt lõi của công cụ này: nó có thể clone một repository, sửa code, chạy test, đọc lỗi rồi lặp lại quy trình để sửa code mà bạn không phải tự nhập từng command. Nếu bạn chưa thiết lập nó trên server, chạy Claude Code trên VPS bằng tmux hướng dẫn cách cài đặt và quản lý session. Trang này trình bày mức quyền bạn trao cho nó sau khi thiết lập.

Rủi ro nằm ngay trong câu trên nếu đọc lại lần nữa. Một process chạy shell command với quyền của user có thể làm mọi việc mà user đó có thể làm. Nó có thể đọc ~/.ssh/id_ed25519, ~/.aws/credentials và mọi file .env mà user của bạn có quyền mở. Nó có thể chạy curl và gửi dữ liệu đến bất kỳ host nào server có thể kết nối. Nó có thể chạy git push --force. Agent không có động cơ riêng. Nguy hiểm xảy ra khi task bị thực hiện sai, hoặc khi văn bản agent đọc trong lúc làm việc chứa instruction do người khác viết: một trang web mà nó đã fetch, hoặc một comment trong issue mà nó được yêu cầu sửa. Trường hợp thứ hai gọi là prompt injection. Vì vậy, việc “model thường xử lý hợp lý” không thể thay thế cho security plan. Instruction cũng có thể đến từ nguồn gần hơn, vì hai session Claude Code trên cùng một máy có thể gửi text cho nhau, và message từ session khác cũng chỉ là thêm text mà agent nhận được đọc. Hãy chuẩn bị cho lần chạy sai, không phải cho trường hợp trung bình.

Hệ thống quyền theo cách dễ hiểu

Trong Manual mode, Claude Code sẽ hỏi trước khi thực hiện. Việc đọc file bên trong project diễn ra âm thầm, nhưng khi chỉnh sửa file hoặc chạy shell command, nó sẽ hiển thị chính xác nội dung chỉnh sửa hoặc command rồi chờ bạn xác nhận. Bạn có thể duyệt một hành động, hoặc yêu cầu không hỏi lại. Lựa chọn thứ hai có hiệu lực đến khi session kết thúc đối với việc chỉnh sửa file. Với shell command, lựa chọn này được lưu vĩnh viễn cho repository và command đó, nên một lần xác nhận nhanh trên server có thể vẫn có hiệu lực sau khi session kết thúc. Với các rule bạn muốn duy trì có chủ đích, settings file chứa các danh sách allow, ask và deny cố định. Ví dụ: allow git status, ask với git push, deny việc đọc .env. Rule deny luôn được ưu tiên. Baseline này cũng đã thay đổi. Auto mode, trong đó một classifier kiểm tra các hành động thay cho bạn, trở thành mode mặc định cho session mới trên các gói Pro, Max và Team vào ngày 14 August 2026. Từ Claude Code v2.1.283, đây cũng là mode khởi động tích hợp cho các session interactive terminal và VS Code trên mọi gói, trừ khi bạn đã cố định một giá trị mặc định. Vì vậy, bạn nên biết mỗi permission mode thực sự cho phép những gì trước khi quyết định server mà bạn không thể theo dõi sẽ chạy mode nào.

Thiết kế này giả định có người theo dõi terminal, và trên laptop điều đó thường đúng. Trên server, mục đích thường là không có ai theo dõi. Bạn khởi động một tác vụ dài bên trong tmux rồi đi ngủ. Khi đó, agent dừng lại để hỏi lúc 2 a.m. sẽ không tiếp tục xử lý cho đến sáng. Việc tạm dừng vừa tốn thời gian vừa tốn tiền, vì một Claude Code session không hoạt động sẽ mất warm prompt cache và turn tiếp theo phải trả chi phí để tạo lại cache đó. Đó là lý do thực tế khiến nhiều người dùng skip flag trên server, và vấn đề mà flag này giải quyết là có thật. Phần còn lại của hướng dẫn này trình bày cách giải quyết vấn đề đó mà không phải từ bỏ toàn bộ guardrail.

Thay đổi của --dangerously-skip-permissions

claude --dangerously-skip-permissions tắt bước phê duyệt. Các thao tác chỉnh sửa được thực hiện mà không cần prompt. Các lệnh shell cũng chạy mà không cần prompt. Các kiểm tra đường dẫn được bảo vệ, vốn thường dùng để bảo vệ những vị trí nhạy cảm, cũng bị bỏ qua. Các quy tắc deny do bạn khai báo vẫn có hiệu lực, và một số thao tác đặc biệt nguy hiểm vẫn dừng lại để hỏi, nhưng tóm tắt cách hoạt động rất đơn giản: model quyết định chạy gì thì lệnh đó được chạy.

Có 2 điểm về flag này cần lưu ý trên server. Thứ nhất, flag bị chặn khi Claude Code chạy với tư cách root hoặc qua sudo trên Linux và macOS, vì root không có prompt có thể thay đổi mọi file hoặc service trên máy. Agent vốn cũng cần một tài khoản không có đặc quyền riêng, và flag này bắt buộc điều đó. Thứ hai, flag không thay đổi hành vi của model theo bất kỳ cách nào. Nó loại con người khỏi vòng kiểm soát và không thay đổi gì khác, nên mọi lỗi mà prompt trước đây có thể ngăn chặn giờ sẽ được thực thi.

Vì vậy, hãy nhìn nhận vấn đề một cách thực tế. Nếu bỏ qua quyền, câu hỏi bảo mật chuyển từ “agent có làm điều gì xấu không” sang “một thao tác sai có thể gây ra bao nhiêu thiệt hại”. Bạn không còn cố kiểm soát từng quyết định nữa, mà bắt đầu kiểm soát phạm vi ảnh hưởng. Câu trả lời là containment, với nhiều mức độ.

Sandbox tích hợp sẵn của Claude Code

Trước khi đến các bậc, cần biết rằng Claude Code hiện đã tích hợp sandbox ở cấp OS cho các command mà nó chạy. Tính năng này loại bỏ phần lớn lý do khiến người dùng trước đây phải dùng skip flag. Trên Linux, Claude Code dùng bubblewrap để cô lập filesystem và dùng socat để định tuyến network traffic qua proxy. Bên trong sandbox, một command chỉ có thể ghi vào thư mục project và thư mục temp của session. Command chỉ có thể truy cập network thông qua proxy kiểm tra mọi domain với allow list. Lần đầu một command cần truy cập domain mới, Claude Code sẽ hỏi bạn. Trong auto mode, classifier sẽ thay bạn kiểm tra host mới.

Bật tính năng này bằng command /sandbox bên trong session. Trên Ubuntu và Debian, trước tiên hãy cài 2 package cần thiết:

sudo apt install bubblewrap socat

Trên Ubuntu 24.04 trở lên, policy AppArmor mặc định ngăn bubblewrap tạo user namespace cần thiết. Sandbox panel sẽ báo khi còn thiếu thành phần. Tài liệu sandboxing của Claude Code có profile AppArmor ngắn để khắc phục vấn đề này.

Sandbox có auto-allow mode. Các command chạy trong sandbox sẽ không hiện prompt vì boundary được áp dụng hiện đã thay cho chức năng mà prompt trước đây đảm nhiệm. Những command không thể chạy bên trong sandbox sẽ quay lại permission flow thông thường. Vì vậy, các thao tác thực sự bất thường vẫn yêu cầu xác nhận. Với hầu hết workflow trên server, đây là lựa chọn thay thế đúng cho skip flag. Bạn sẽ gặp ít câu hỏi hơn mà vẫn có boundary do OS áp dụng, thay vì không có boundary nào.

Cần hiểu rõ các giới hạn của tính năng này. Theo mặc định, command chạy trong sandbox vẫn có thể đọc phần lớn filesystem, bao gồm các file credential, trừ khi bạn deny những path đó. Setting sandbox.credentials tồn tại chính xác cho mục đích này. Network proxy kiểm tra tên domain nhưng không tự kiểm tra traffic. Vì vậy, một allow rule rộng như github.com vẫn có thể cho phép đưa dữ liệu ra ngoài. Docker không hoạt động bên trong sandbox. Sandbox cải thiện đáng kể mức bảo vệ cơ bản. Tuy nhiên, đây không phải boundary cô lập hoàn chỉnh. Vì vậy, các bậc bên dưới vẫn quan trọng.

Bậc thang cô lập

Có 3 bậc, theo thứ tự tăng dần về mức độ cô lập. Chọn bậc thấp nhất phù hợp với những gì khác đang chạy trên máy.

Bậc 1: một user không có quyền đặc biệt riêng. Agent có account riêng, thư mục home riêng, thư mục project riêng và không có quyền sudo:

sudo adduser --disabled-password --gecos "" agent

Ranh giới account ngăn agent truy cập các file của bạn: SSH key và mọi project khác trên máy. Nó cũng giúp sử dụng được skip flag, vì flag này không cho chạy dưới root. Đây là cùng nguyên tắc với chạy mọi service bằng user không có quyền đặc biệt, được áp dụng cho agent. Bậc 1 không cô lập được network và mọi dữ liệu trên máy có quyền đọc cho toàn hệ thống.

Bậc 2: một container. Anthropic cung cấp một devcontainer tham chiếu chạy Claude Code bằng user không phải root, kèm firewall rule giới hạn các host mà agent có thể truy cập. Container do bạn tự build cũng thực hiện được chức năng tương tự. Filesystem chỉ còn các volume bạn mount, còn lưu lượng outbound chỉ được phép theo rule của container. Đây là bậc trung gian phù hợp khi server đang chạy các service khác mà bạn cần bảo vệ. Giới hạn của cách này là các container dùng chung kernel của host, và chỉ một lần mount bất cẩn cũng có thể phá vỡ ranh giới; cấp cho container /var/run/docker.sock là nó có thể truy cập toàn bộ host.

Bậc 3: một VPS riêng. Đây là bậc mạnh nhất nhưng cũng trực diện nhất: cấp cho agent cả một máy không chứa bất kỳ dữ liệu nào bạn cần bảo vệ. Một VPS nhỏ có giá vài dollar mỗi tháng. Thiết lập máy theo runbook 10 phút đầu trên VPS mới, tạo snapshot của trạng thái sạch rồi để agent làm việc. Không có gì khác chạy trên đó. Không dùng SSH key cá nhân, chỉ dùng deploy key giới hạn trong một repository duy nhất. Không có cloud credential và không có dữ liệu production. Khi một lần chạy gặp sự cố, hoặc khi bạn chỉ muốn bắt đầu lại từ trạng thái sạch, hãy khôi phục snapshot hoặc hủy rồi dựng lại máy trong vài phút. Phạm vi ảnh hưởng chỉ giới hạn ở chi phí thuê máy. Với cách này, --dangerously-skip-permissions không còn đáng sợ, vì kết quả tệ nhất có thể xảy ra trong thực tế là phải dựng lại server và revoke một token.

Các bậc có thể kết hợp với nhau. Một agent chạy trong sandbox, bằng user không có quyền đặc biệt, trên một VPS có thể hủy bỏ, gần như không phát sinh thêm chi phí nhưng khiến các kịch bản sự cố trở nên rất đơn giản. Đó là mục tiêu.

Bảo vệ thông tin xác thực

Quy tắc quan trọng nhất: user của agent không được đọc các secret thuộc về bất kỳ thành phần nào khác.

Chỉ cấp API key cho agent. Không cấp cho thành phần nào khác. Đặt key trong một file thuộc sở hữu của user chạy agent với mode 600, rồi nạp file đó khi shell khởi động:

install -m 600 /dev/null /home/agent/claude.env
echo 'export ANTHROPIC_API_KEY=your-key-here' >> /home/agent/claude.env
echo 'source ~/claude.env' >> /home/agent/.bashrc

Tiếp theo, chặn chiều truy cập còn lại. Trên các bản cài Debian và Ubuntu cũ, cũng như với account được tạo trong quá trình cài đặt, home directory có thể cho mọi user trên máy đọc. Vì vậy, hãy siết quyền của home directory của bạn: chmod 750 /home/youruser. Kiểm tra bằng ls -ld /home/* và sửa mọi thứ mà account của agent có thể liệt kê.

Giới hạn phạm vi của từng token. GitHub token có quyền chi tiết và chỉ giới hạn trong một repository, hoặc deploy key riêng cho từng repository, sẽ giới hạn thiệt hại khi credential bị lộ ở một project thay vì toàn bộ account. Nếu dùng sandbox, hãy thêm các thiết lập credential của sandbox để ~/.ssh và ~/.aws bị từ chối, kể cả khi chỉ đọc. Đồng thời, không lưu credential production trên máy này, vì agent không thể làm lộ secret chưa từng tồn tại trên máy. Nếu các secret đó được lưu trong password manager tự host, hãy đặt password manager trên một máy khác với agent và kiểm tra riêng hệ thống đó, vì các điểm yếu của Vaultwarden nằm ở admin token và file backup, không phải ở vault đã mã hóa.

Git là lớp bảo vệ an toàn

Mọi thay đổi do agent commit đều có thể review và revert. Git cung cấp sẵn cả hai khả năng nếu agent làm việc trên một branch và commit trong quá trình thực hiện:

git switch -c agent/refactor-auth

Những thay đổi mà agent không commit sẽ không có cơ chế bảo vệ này: git reset --hard sẽ loại bỏ các thay đổi chưa commit đối với những file đang được Git theo dõi, còn Git hoàn toàn không quản lý nội dung bên ngoài repository. Sau khi chạy xong, dùng git diff main...agent/refactor-auth để xem những gì agent đã commit. Sau đó dùng git status và git diff HEAD trên branch để kiểm tra những thay đổi còn lại chưa được commit. Giữ lại các thay đổi phù hợp và xóa branch nếu lần chạy không tạo ra kết quả hữu ích. Một lần chạy chỉ sửa 3 file dễ đọc và review vào buổi sáng hơn nhiều so với lần chạy viết lại một nửa module. Đây là lý do thực tế để dùng một skill buộc agent chỉ thực hiện thay đổi nhỏ nhất nhưng vẫn đủ dùng. Bảo vệ branch chính ở phía forge để token của agent không thể push vào đó và không thể force-push ở bất kỳ đâu. Lịch sử commit đồng thời là audit log ghi lại những gì đã xảy ra trong lúc bạn ngủ. Giá trị của nó cao hơn nhiều so với mọi lượng nội dung hiển thị trong terminal scrollback.

Mạng là một phần của phạm vi ảnh hưởng

Một agent có thể chạy curl. Câu này mô tả toàn bộ vấn đề egress: bất cứ thứ gì agent đọc được thì cũng có thể gửi đến nơi khác, và agent bị prompt injection có thể làm điều đó. User không có đặc quyền không giới hạn được việc này, vì bất kỳ user nào cũng có thể truy cập mọi nơi mà server truy cập được. Sandbox giới hạn phạm vi này theo domain thông qua proxy của nó. Container có thể giới hạn bằng các firewall rule riêng. VPS riêng giới hạn ngay từ đầu lượng dữ liệu có thể bị rò rỉ, nên đây là phương án chắc chắn nhất trong ba phương án.

Đừng cố giải quyết egress chỉ bằng ufw. ufw mặc định cho phép toàn bộ traffic đi ra, còn việc viết các rule outbound nhưng vẫn cho phép apt, npm, git và Claude API hoạt động là công việc phức tạp, dễ âm thầm bị lỗi. Thay vào đó, hãy chọn ranh giới ở cấp sandbox, container hoặc máy chủ, nơi domain allow list hoặc một máy chủ độc lập có thể giải quyết vấn đề này một cách rõ ràng.

Nếu bạn tự xây dựng agent dùng API thay vì chạy Claude Code, cách tiếp cận vẫn hoàn toàn giống nhau. Xây dựng AI agent với Claude trên VPS trình bày hướng này, và agent đó cũng cần một user riêng, các token có phạm vi giới hạn tương tự và một máy chủ riêng có thể hủy bỏ.

Trước hết, hãy harden máy chủ

Dù bạn chọn mức nào, bản thân máy chủ vẫn cần có các cấu hình cơ bản trước khi agent được cài đặt: chỉ cho phép SSH bằng key, không cho phép root login, firewall mặc định từ chối, và tự động cập nhật bảo mật. Tạo checklist tại đây rồi thực hiện lần lượt một lần:

ToolHarden the box before the agent moves in

FAQ

Có an toàn khi dùng --dangerously-skip-permissions trên server không?

Không, nếu chỉ bật flag này. Flag này tắt mọi prompt yêu cầu phê duyệt, nên lệnh nguy hiểm đầu tiên sẽ chạy ngay khi model tạo ra nó. Đây là một đánh đổi có thể chấp nhận khi giới hạn được phạm vi ảnh hưởng: tối thiểu phải dùng một user không có đặc quyền riêng; với tác vụ thực sự không cần giám sát, nên dùng container hoặc một VPS tạm thời chỉ chứa một project và một token có scope giới hạn. Không bao giờ dùng cách này trên máy chứa credential production hoặc dữ liệu mà bạn không thể mất.

Claude Code có sandbox không?

Có. Claude Code có sẵn sandbox cho shell command, mở bằng command /sandbox. Trên Linux, sandbox dùng bubblewrap; trên macOS, sandbox dùng Seatbelt. Sandbox giới hạn quyền ghi trong thư mục project và định tuyến network access qua một proxy chỉ cho phép các domain đã được phê duyệt. Chế độ auto-allow chạy các command trong sandbox mà không hiển thị prompt. Vì vậy, chế độ này giảm gián đoạn giống skip flag nhưng vẫn giữ được ranh giới do OS enforced. Đây không phải là ranh giới isolation hoàn chỉnh, nên hãy kết hợp với một user riêng hoặc một máy riêng khi chạy các tác vụ không cần giám sát.

Vì sao skip flag từ chối chạy khi là root?

Vì root không có prompt yêu cầu phê duyệt có thể sửa mọi file và mọi service trên system. Do đó, Claude Code chặn --dangerously-skip-permissions khi chạy dưới root hoặc qua sudo trên Linux và macOS. Cách xử lý không phải là tìm cách vượt qua kiểm tra này. Hãy tạo một user không có đặc quyền cho agent và chạy agent bằng user đó. Ranh giới giữa các account là lớp containment đầu tiên và rẻ nhất.

Claude Code có thể đọc SSH key và file .env của tôi không?

Claude Code có thể đọc mọi thứ mà user đang chạy nó có quyền đọc. Ngay cả policy mặc định của sandbox cũng cho phép đọc các đường dẫn credential cho đến khi bạn chặn chúng. Vì vậy, hãy chạy agent bằng user riêng, đặt mode của thư mục home của bạn là 750 hoặc chặt hơn, chặn các đường dẫn credential trong cấu hình sandbox và tuyệt đối không lưu secret production trên máy đó. Secret mà máy chưa từng lưu thì không thể bị đọc hoặc làm lộ.

Cách an toàn nhất để chạy Claude Code không cần giám sát là gì?

Dùng một VPS riêng giá rẻ chỉ dành cho công việc của agent: harden trong 10 phút, tạo snapshot sạch, chạy Claude Code dưới một user không có đặc quyền với sandbox được bật, lưu API key trong file mode-600, dùng deploy key riêng cho từng repository và thực hiện mọi thay đổi trên các branch mà bạn review trước khi merge. Nếu một lần chạy gặp lỗi, bạn chỉ cần revoke một token và khôi phục snapshot; các tài nguyên khác của bạn không bị ảnh hưởng.