Chạy Claude Code an toàn trên máy chủ
Claude Code chạy được mọi lệnh mà user của bạn chạy được. Cờ bỏ qua phân quyền thay đổi gì, và cách khoanh vùng thiệt hại, từ sandbox tới VPS dùng xong bỏ.
Chạy Claude Code an toàn trên máy chủ nghĩa là gì
Để chạy Claude Code an toàn trên máy chủ, hãy giữ nguyên bước hỏi quyền, chạy nó bằng một tài khoản riêng không đặc quyền, và với những lần chạy không có người ngồi canh, hãy dựng một ranh giới thật thay vì trông vào niềm tin: sandbox tích hợp sẵn, một container, hoặc một VPS dùng xong bỏ không chứa thứ gì bạn quan tâm. Cờ --dangerously-skip-permissions gỡ bỏ bước phê duyệt giữa model và shell của bạn. Đánh đổi đó có thể hợp lý với công việc chạy không giám sát, nhưng chỉ khi nó nằm trong một ranh giới khoanh lại được tầm với của một câu lệnh sai. Hướng dẫn này giải thích cờ đó thực sự thay đổi điều gì, và cách dựng ranh giới đó theo từng bậc cô lập tăng dần.
Claude Code làm được gì trên máy của bạn
Claude Code là một coding agent chạy trong terminal của bạn. Nó đọc file, ghi file, và chạy lệnh shell dưới quyền của user đã khởi động nó. Đó chính là toàn bộ giá trị 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 sửa code trong một vòng lặp, mà bạn không phải gõ từng lệnh. Nếu bạn chưa cài nó trên máy chủ, hướng dẫn chạy Claude Code trên VPS với tmux nói về phần cài đặt và quản lý session. Trang này nói về sức mạnh bạn trao cho nó khi nó đã nằm trên máy.
Rủi ro nằm ở chính câu vừa rồi, khi bạn đọc lại lần thứ hai. Một tiến trình chạy lệnh shell dưới quyền user của bạn thì làm được mọi thứ user của bạn làm được. Nó đọc được ~/.ssh/id_ed25519, ~/.aws/credentials, và mọi file .env mà user của bạn mở được. Nó chạy được curl và gửi dữ liệu tới bất kỳ host nào mà máy chủ kết nối được. Nó chạy được git push --force. Bản thân agent không có động cơ riêng. Nguy hiểm nằm ở chỗ một tác vụ đi chệch hướng, hoặc văn bản nó đọc trong lúc làm việc có chứa chỉ dẫn do người khác viết: một trang web nó tải về, hoặc một bình luận trong issue mà bạn nhờ nó sửa. Trường hợp thứ hai gọi là prompt injection, và đó là lý do câu "model thường thì cũng biết điều thôi" không phải một kế hoạch bảo mật. Bạn phải tính cho lần chạy hỏng, chứ không phải lần chạy trung bình.
Hệ thống phân quyền, nói cho dễ hiểu
Mặc định, Claude Code hỏi trước khi hành động. Đọc file bên trong dự án thì nó làm luôn, không hỏi gì, nhưng sửa một file hay chạy một lệnh shell thì nó hiện đúng nội dung sửa hoặc đúng câu lệnh đó ra trước và chờ bạn đồng ý. Bạn có thể duyệt một hành động, hoặc duyệt cả loại hành động đó cho hết session. Những phê duyệt này chỉ có hiệu lực trong session: thoát CLI ra, session sau lại cẩn thận từ đầu. Với các quy tắc bạn muốn giữ lâu dài, file settings giữ các danh sách allow, ask và deny có hiệu lực lâu dài. Ví dụ: allow git status, ask khi git push, deny việc đọc .env. Quy tắc deny luôn thắng.
Thiết kế này giả định có một người đang ngồi nhìn terminal, và trên laptop thì đúng là vậy. Trên máy chủ, mục đích thường lại là không ai phải ngồi canh. Bạn khởi động một tác vụ dài trong tmux rồi đi ngủ, và một agent dừng lại để hỏi lúc 2 giờ đêm thì không nhúc nhích thêm được bước nào cho tới sáng. Việc dừng đó tốn cả tiền lẫn thời gian, vì một session Claude Code nằm không sẽ mất prompt cache đang ấm và lượt sau phải trả tiền để dựng lại. Đó là lý do thật sự khiến người ta phải dùng tới cờ bỏ qua phân quyền trên máy chủ, và vấn đề nó giải quyết là có thật. Phần còn lại của hướng dẫn này nói về cách giải quyết nó mà không vứt bỏ hết hàng rào.
--dangerously-skip-permissions thay đổi điều gì
claude --dangerously-skip-permissions tắt bước phê duyệt. Sửa file không hỏi. Chạy lệnh shell không hỏi. Các bước kiểm tra dành cho những đường dẫn được bảo vệ, vốn canh các vị trí nhạy cảm, cũng bị bỏ qua luôn. Các quy tắc deny bạn viết rõ ràng thì vẫn có hiệu lực, và vài hành động cực đoan vẫn dừng lại để hỏi, nhưng tóm tắt cho dễ hình dung: model quyết định chạy gì thì cái đó chạy.
Có hai điều về cờ này đáng lưu ý trên máy chủ. Thứ nhất, nó bị chặn khi Claude Code chạy dưới quyền root hoặc qua sudo trên Linux và macOS, vì root mà không hỏi gì thì sửa được mọi file và mọi service trên máy. Dù sao agent cũng cần tài khoản không đặc quyền của riêng nó, và cờ này buộc bạn làm vậy. Thứ hai, cờ này không thay đổi hành vi của model một chút nào. Nó chỉ bỏ con người ra khỏi vòng lặp và không đổi gì khác, nên mọi sai lầm mà một câu hỏi xác nhận lẽ ra chặn được thì nay chạy thẳng.
Vậy nên phép tính thành thật là thế này. Nếu bạn bỏ qua phân quyền, câu hỏi bảo mật đổi từ "liệu agent có làm gì tệ không" thành "một hành động tệ gây được bao nhiêu thiệt hại". Bạn thôi cố kiểm soát từng quyết định và bắt đầu kiểm soát phạm vi thiệt hại. Câu trả lời là ngăn chặn, và ngăn chặn thì chia thành nhiều bậc.
Sandbox tích hợp sẵn của Claude Code
Trước khi tới các bậc đó, cần biết rằng Claude Code nay có sẵn một sandbox ở mức hệ điều hành cho những lệnh nó chạy, và nó xóa đi phần lớn lý do khiến người ta phải dùng tới cờ bỏ qua phân quyền. Trên Linux, nó dùng bubblewrap để cô lập filesystem, cộng thêm socat để đẩy lưu lượng mạng qua một proxy. Bên trong sandbox, một câu lệnh chỉ ghi được vào thư mục dự án và một thư mục tạm của session, và chỉ ra ngoài mạng được qua một proxy đối chiếu từng domain với một danh sách cho phép. Lần đầu một câu lệnh muốn tới một domain mới, Claude Code sẽ hỏi bạn.
Bật nó bằng lệnh /sandbox ngay trong session. Trên Ubuntu và Debian, cài trước hai gói mà nó cần:
sudo apt install bubblewrap socatTrên Ubuntu 24.04 trở lên, chính sách AppArmor mặc định chặn bubblewrap tạo các user namespace mà nó cần. Bảng trạng thái sandbox sẽ báo cho bạn khi thiếu thứ gì, và tài liệu sandboxing của Claude Code có sẵn đoạn profile AppArmor ngắn để sửa việc này.
Sandbox có một chế độ tự động cho phép: lệnh chạy trong sandbox thì chạy thẳng, không hỏi gì, vì ranh giới do hệ điều hành áp đặt nay làm thay phần việc mà câu hỏi xác nhận từng làm. Những lệnh không chạy được trong sandbox thì quay về luồng phân quyền bình thường, nên các hành động thực sự bất thường vẫn hỏi. Với hầu hết quy trình làm việc trên máy chủ, đây là phương án thay thế đúng cho cờ bỏ qua phân quyền, vì bạn bị hỏi ít hơn hẳn mà vẫn có một ranh giới do hệ điều hành áp đặt, thay vì chẳng có ranh giới nào.
Cũng phải thành thật về giới hạn của nó. Mặc định, một lệnh trong sandbox vẫn đọc được gần hết filesystem, kể cả các file chứa thông tin đăng nhập, trừ khi bạn chặn những đường dẫn đó; thiết lập sandbox.credentials sinh ra chính là để làm việc đó. Proxy mạng chỉ kiểm tra tên domain chứ không soi nội dung lưu lượng, nên một mục cho phép rộng như github.com vẫn chừa chỗ để tuồn dữ liệu ra ngoài. Docker không chạy được bên trong nó. Sandbox nâng mức an toàn tối thiểu lên rất nhiều. Nó không phải một ranh giới cô lập hoàn chỉnh, và đó là lý do các bậc dưới đây vẫn cần thiết.
Thang ngăn chặn thiệt hại
Ba bậc, xếp theo mức cô lập tăng dần. Chọn bậc thấp nhất phù hợp với những gì khác đang chạy trên cùng cái máy.
Bậc 1: một tài khoản riêng không đặc quyền. Agent có tài khoản riêng, thư mục home riêng, thư mục dự án riêng, và không có sudo:
sudo adduser --disabled-password --gecos "" agentRanh giới tài khoản giữ agent tránh xa file của bạn: khóa SSH của bạn và mọi dự án khác trên máy. Nó cũng là thứ khiến cờ bỏ qua phân quyền dùng được, vì cờ đó từ chối chạy dưới quyền root. Đây chính là nguyên tắc chạy mọi service bằng một user không đặc quyền, áp dụng cho một agent. Điều bậc 1 không chặn được: mạng, và mọi thứ trên máy mà ai cũng đọc được.
Bậc 2: một container. Anthropic công bố sẵn một devcontainer mẫu chạy Claude Code bằng một user không phải root, kèm các quy tắc firewall giới hạn những host mà agent với tới được, và một container bạn tự dựng cũng làm được đúng việc đó. Filesystem thu lại còn đúng các volume bạn mount, và lưu lượng đi ra thu lại còn đúng những gì quy tắc của container cho phép. Đây là bậc giữa hợp lý khi máy chủ còn chạy các service khác mà bạn quan tâm. Giới hạn của nó là container dùng chung kernel với host, chỉ một lệnh mount bất cẩn là đủ phá vỡ ranh giới; đưa /var/run/docker.sock vào container thì nó với được cả host.
Bậc 3: một VPS riêng. Bậc mạnh nhất cũng là bậc thô sơ nhất: cho agent nguyên một cái máy không chứa thứ gì bạn quan tâm. Một VPS nhỏ tốn vài đô một tháng. Dựng nó theo quy trình mười phút đầu tiên trên một VPS mới, chụp snapshot lúc máy còn sạch, rồi để agent làm việc. Không có gì khác chạy trên đó. Không khóa SSH cá nhân, chỉ một deploy key giới hạn trong đúng một repository. Không thông tin đăng nhập cloud, không dữ liệu production. Khi một lần chạy đi chệch, hoặc đơn giản là khi bạn muốn quay về trạng thái sạch, hãy khôi phục snapshot hoặc xóa rồi dựng lại máy trong vài phút. Toàn bộ thiệt hại gói gọn trong tiền thuê máy. Đây là cấu hình mà --dangerously-skip-permissions không còn đáng sợ nữa, vì kết cục tệ nhất trong thực tế là dựng lại một máy chủ và thu hồi một token.
Các bậc này cộng dồn được. Một agent chạy trong sandbox, dưới một user không đặc quyền, trên một VPS dùng xong bỏ, gần như không tốn thêm gì mà làm cho những câu chuyện hỏng việc trở nên nhàm chán. Nhàm chán mới là mục tiêu.
Bảo vệ thông tin đăng nhập
Quy tắc quan trọng hơn tất cả phần còn lại: user của agent không được đọc bí mật của bất cứ thứ gì khác.
Đưa API key cho agent, và không cho bất cứ thứ gì khác. Đặt nó trong một file thuộc sở hữu của user agent với quyền 600, rồi nạp vào mỗi 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/.bashrcRồi khóa nốt chiều ngược lại. Trên Debian và Ubuntu, thư mục home thường được tạo ra ở chế độ mọi user trên máy đều đọc được, nên hãy siết thư mục của chính bạn lại: chmod 750 /home/youruser. Kiểm tra bằng ls -ld /home/* và sửa mọi thứ mà tài khoản agent liệt kê được.
Giới hạn phạm vi cho từng token. Một fine-grained token của GitHub chỉ dùng cho một repository, hoặc một deploy key riêng cho từng repository, nghĩa là một credential bị lộ thì mất một dự án chứ không mất cả tài khoản. Nếu bạn dùng sandbox, thêm phần thiết lập credentials của nó để ~/.ssh và ~/.aws bị chặn kể cả khi chỉ đọc. Và hãy để thông tin đăng nhập production hoàn toàn nằm ngoài máy này, vì agent không thể làm lộ một bí mật chưa từng có ở đó.
Git là lưới an toàn
Mọi thay đổi agent tạo ra đều phải xem lại được và hoàn tác được, và git cho bạn cả hai miễn phí nếu agent làm việc trên một nhánh:
git switch -c agent/refactor-authXem lại lần chạy đó sau bằng git diff main...agent/refactor-auth, merge phần nào tốt, và xóa nhánh nếu lần chạy chẳng đi tới đâu. Bật bảo vệ nhánh main ở phía dịch vụ Git, để token của agent không push được vào đó và không force-push được ở bất cứ đâu. Lịch sử commit đồng thời là nhật ký ghi lại những gì đã xảy ra trong lúc bạn ngủ, thứ đáng giá hơn nhiều so với việc lục lại scrollback trong terminal.
Mạng cũng nằm trong phạm vi thiệt hại
Agent chạy được curl. Câu đó là toàn bộ vấn đề lưu lượng đi ra: thứ gì agent đọc được thì nó cũng gửi đi đâu đó được, và một agent bị prompt injection có thể làm đúng vậy. Một user không đặc quyền thuần túy không chặn được chuyện này chút nào, vì user nào trên máy cũng kết nối được tới mọi nơi mà máy chủ kết nối được. Sandbox chặn theo domain thông qua proxy của nó. Một container chặn được bằng quy tắc firewall của riêng nó. Một VPS riêng thì ngay từ đầu đã giới hạn những gì có thể bị lộ, và đó là câu trả lời chắc chắn nhất trong ba cách.
Đừng cố giải quyết lưu lượng đi ra chỉ bằng ufw. Mặc định ufw cho phép mọi kết nối đi ra, và viết các rule outbound mà vẫn để apt, npm, git và API của Claude chạy được là việc lắt léo, hỏng thì hỏng lặng lẽ. Hãy chọn ranh giới ở mức sandbox, container hoặc máy, nơi một danh sách domain cho phép hoặc một cái máy trống trơn làm đúng việc đó một cách gọn gàng.
Nếu bạn đang tự dựng agent trên API thay vì chạy Claude Code, cách nghĩ này áp dụng y nguyên. Dựng một AI agent với Claude trên VPS nói về hướng đó, và agent trong đó cũng xứng đáng có user riêng, token giới hạn phạm vi, và một cái máy dùng xong bỏ.
Siết bảo mật cho máy trước đã
Dù bạn chọn bậc nào, bản thân cái máy vẫn cần những thứ cơ bản trước khi agent dọn vào: chỉ dùng khóa SSH, cấm đăng nhập root, một firewall mặc định từ chối, cập nhật bảo mật tự động. Tạo danh sách kiểm tra của bạn ở đây và làm hết một lượt:
FAQ
Dùng --dangerously-skip-permissions trên máy chủ có an toàn không?
Chỉ riêng nó thì không. Cờ này gỡ mọi câu hỏi phê duyệt, nên câu lệnh sai đầu tiên chạy ngay khoảnh khắc model sinh ra nó. Nó chỉ thành một đánh đổi chấp nhận được khi phạm vi thiệt hại đã được khoanh lại: tối thiểu là một tài khoản riêng không đặc quyền, còn với công việc thực sự không có người giám sát thì là một container hoặc một VPS dùng xong bỏ chỉ chứa một dự án và một token giới hạn phạm vi. Đừng bao giờ dùng nó trên máy có thông tin đăng nhập production hoặc dữ liệu bạn không được phép mất.
Claude Code có sandbox không?
Có. Claude Code có sẵn một sandbox cho các lệnh shell, mở bằng lệnh /sandbox. Nó dùng bubblewrap trên Linux và Seatbelt trên macOS, giới hạn việc ghi trong phạm vi thư mục dự án, và đẩy truy cập mạng qua một proxy chỉ cho phép các domain đã được duyệt. Chế độ tự động cho phép của nó chạy các lệnh trong sandbox mà không hỏi, nên nó cắt bớt gián đoạn giống như cờ bỏ qua phân quyền nhưng vẫn giữ một ranh giới do hệ điều hành áp đặt. Nó không phải ranh giới cô lập hoàn chỉnh, nên với các lần chạy không có người giám sát, hãy ghép nó với một user riêng hoặc một máy riêng.
Vì sao cờ bỏ qua phân quyền từ chối chạy dưới quyền root?
Vì root mà không có câu hỏi phân quyền nào thì sửa được mọi file và mọi service trên hệ thống, nên Claude Code chặn --dangerously-skip-permissions khi nó chạy dưới quyền root hoặc qua sudo trên Linux và macOS. Cách xử lý không phải là tìm cách lách kiểm tra đó. Hãy tạo một user không đặc quyền cho agent và chạy nó ở đó; ranh giới tài khoản là lớp ngăn chặn đầu tiên và rẻ nhất.
Claude Code có đọc được khóa SSH và file .env của tôi không?
Nó đọc được mọi thứ mà user đang chạy nó đọc được, và ngay cả chính sách mặc định của sandbox cũng cho phép đọc các đường dẫn chứa thông tin đăng nhập cho tới khi bạn chặn chúng. Vậy nên hãy chạy agent bằng user riêng của nó, giữ thư mục home của bạn ở quyền 750 hoặc chặt hơn, chặn các đường dẫn credential trong thiết lập sandbox, và để bí mật production hoàn toàn ngoài máy. Một bí mật chưa từng nằm trên máy thì không ai đọc hay làm lộ được.
Cách an toàn nhất để chạy Claude Code mà không cần giám sát là gì?
Một VPS riêng giá rẻ chỉ dùng cho việc của agent: siết bảo mật trong mười phút, chụp snapshot lúc còn sạch, chạy Claude Code dưới một user không đặc quyền và có bật sandbox, một file quyền 600 giữ API key, một deploy key riêng cho từng repository, và mọi việc đều làm trên nhánh mà bạn xem lại trước khi merge. Nếu một lần chạy đi chệch, bạn thu hồi một token và khôi phục snapshot, và không thứ gì khác của bạn bị ảnh hưởng.