An toàn & best practices

Bài 11 — An toàn & best practices

#Vấn đề: agent có quyền phá hủy dự án của bạn

Khi bạn chạy Claude Code trên dự án thật, nó có quyền truy cập filesystemkhả năng chạy terminal command. Nghĩa là nó có thể:

  • Xóa file quan trọng
  • Ghi đè file cấu hình
  • Chạy lệnh xóa database
  • Push code lỗi lên production
  • Rò rỉ credentials trong git history

Đây không phải lý thuyết suông. Mỗi tuần đều có người chia sẻ trên Reddit, Twitter: "AI agent đã xóa sạch migration của tôi", "nó force push lên main lúc 3 giờ sáng". Nguyên nhân không phải AI "ngu" — mà là người dùng không có rào chắn an toàn.

Bài này là bài quan trọng nhất khóa học. Nếu chỉ nhớ một bài, hãy nhớ bài này.

#Rủi ro cụ thể khi dùng agent

#1. Agent có quyền filesystem

Claude Code đọc và ghi file trực tiếp trên disk. Không có thùng rác, không có undo system nào ngoài git.

> Refactor toàn bộ src/ sang module pattern mới

Agent bắt đầu sửa. Nếu bạn không review, nó có thể:

  • Xóa file mà nó nghĩ là "không cần thiết"
  • Ghi đè file config bạn đã tùy chỉnh
  • Tạo file mới ở sai vị trí

#2. Agent chạy terminal command

Nếu bạn cho phép, agent có thể chạy bất kỳ lệnh nào:

rm -rf node_modules          # Có thể xảy ra
git push --force origin main # Có thể xảy ra
DROP TABLE users;            # Nếu có kết nối DB

#3. Autonomous mode (tự động hoàn toàn)

Ở chế độ bình thường, agent hỏi trước mỗi lần sửa file hoặc chạy lệnh. Nhưng ở autonomous mode (--dangerously-skip-permissions), nó không hỏi gì cả — cứ thế làm.

Đây là lúc rủi ro cao nhất. Agent có thể chạy hàng chục lệnh liên tiếp mà bạn không kịp can thiệp.

⚠️ Cẩn thận: KHÔNG BAO GIỜ dùng --dangerously-skip-permissions trên production

Flag này bỏ qua toàn bộ cơ chế xác nhận. Agent có thể force push, xóa file, chạy lệnh nguy hiểm — tất cả trong một session. Chỉ dùng khi:

  • Bạn đang ở nhánh riêng (không phải main/production)
  • Dự án đã commit sạch sẽ (có thể revert)
  • Bạn chấp nhận rủi ro mất dữ liệu

Nếu bạn cần autonomous mode cho CI/CD, hãy dùng sandbox/VM cách ly hoàn toàn.

#Best practices: lớp bảo vệ

#Lớp 1: Luôn làm việc trên nhánh riêng

Đây là quy tắc số một. Không có ngoại lệ.

# TRƯỚC KHI mở Claude Code
git checkout -b feat/add-user-api
git add -A && git commit -m "checkpoint: before agent session"

Tại sao commit trước? Vì nếu agent phá code, bạn có thể:

git diff          # Xem agent đã thay đổi gì
git checkout .    # Hoàn tác toàn bộ
git reset --hard HEAD  # Quay về checkpoint

Nếu bạn đang ở nhánh main mà agent phá, bạn mất sạch. Nhánh riêng cho bạn một-click revert.

#Lớp 2: Review diff trước khi commit

Sau khi agent sửa xong, luôn luôn kiểm tra:

git diff                    # Xem từng dòng thay đổi
git diff --stat             # Xem tổng quan: file nào, bao nhiêu dòng
git diff --name-only        # Chỉ xem tên file thay đổi

Nếu agent sửa file bạn không mong đợi — hỏi tại sao. Nếu nó xóa file — hỏi tại sao. Đừng commit mù.

Quy trình chuẩn:

1. Agent sửa xong → bạn thấy "Done"
2. Chạy git diff → đọc kỹ
3. Nếu ổn → git add + commit
4. Nếu không ổn → git checkout . và yêu cầu agent làm lại

#Lớp 3: Sandbox và VM cho task nguy hiểm

Khi task liên quan đến:

  • Database migration
  • Infrastructure change
  • Chạy script trên production data
  • Thử nghiệm cách refactor lớn

Hãy dùng môi trường cô lập:

Môi trườngCách dùng
Docker containerMount code vào container, chạy agent bên trong
Git worktreegit worktree add ../hotfix-branch — copy code riêng biệt
VMCodespaces, dev container, hoặc VM local
Branch + backupTối thiểu: nhánh riêng + push lên remote trước khi agent chạy

#Lớp 4: Permission modes

Claude Code có 3 chế độ quyền:

Chế độAgent được phépKhi nào dùng
Ask (mặc định)Hỏi trước mọi hành độngMặc định an toàn, nên giữ
Auto-editTự sửa file, hỏi trước khi chạy commandKhi bạn tin tưởng agent sửa code
Skip permissionsTự làm mọi thứChỉ trong sandbox/CI

Khuyến nghị: giữ chế độ Ask cho日常工作. Nâng lên Auto-edit khi bạn đã quen và đang ở nhánh riêng.

#Permission rules chi tiết

Bạn có thể cấu hình chi tiết những gì agent được phép làm trong settings.json:

{
  "permissions": {
    "allow": [
      "Read(*)",
      "Edit(src/**)",
      "Bash(npm test*)",
      "Bash(npm run lint*)"
    ],
    "deny": [
      "Bash(rm -rf *)",
      "Bash(git push --force*)",
      "Bash(git checkout main*)",
      "Edit(.env*)",
      "Edit(config/production*)"
    ]
  }
}

Ví dụ trên cho phép agent đọc mọi file, sửa code trong src/, chạy test và lint. Nhưng chặn mọi lệnh xóa nguy hiểm, force push, và sửa file config production.

Đây là lớp bảo vệ mạnh nhất — bạn kiểm soát chính xác từng hành động.

#Những việc KHÔNG NÊN để agent làm

Dù ở chế độ nào, có những việc bạn không nên giao cho agent:

ViệcTại sao
git push --forceGhi đè lịch sử, khó hoàn tác
Sửa file .envCó thể lộ credentials
Chạy migration trên production DBSai một dòng = mất dữ liệu
Xóa git history (git rebase -i trên main)Mất commit của người khác
Chạy script với sudoAgent không hiểu hậu quả hệ thống
Tự ý merge vào mainBypass code review

Nếu agent đề xuất làm những việc này — từ chối và yêu cầu cách khác.

#Quy tắc 5 bước cho mỗi session

Đây là checklist bạn nên chạy trong đầu mỗi lần mở Claude Code:

1. MÌNH Ở NHÁNH NÀO?     → git branch (phải là nhánh riêng)
2. ĐÃ COMMIT CHƯA?        → git status (phải sạch)
3. TASK LÀ GÌ?             → Mô tả rõ ràng, cụ thể
4. REVIEW XONG CHƯA?      → git diff trước khi commit
5. ĐÃ PUSH LÊN REMOTE?    → git push (có backup trên server)

Bỏ qua bước nào cũng có thể gây hậu quả. Đặc biệt bước 1 và 2 — đây là nơi mọi thảm họa bắt đầu.

⚠️ Cẩn thận: Agent không hiểu "production"

Agent không biết server nào là production, database nào là thật. Nếu bạn đang ở nhánh main và có kết nối database thật, agent sẽ chạy migration trên database thật — vì nó nghĩ đó là việc cần làm. Bạn là người phải ngăn chặn bằng cách:

  • Làm việc trên nhánh riêng
  • Không kết nối database production khi dùng agent
  • Dùng .env.development thay vì .env

#Anti-pattern: --dangerously-skip-permissions

Tên flag đã cảnh báo: dangerously. Đây là cách nó hoạt động:

# BÌNH THƯỜNG — an toàn
claude                           # Hỏi trước mọi hành động
 
# NGUY HIỂM — không hỏi gì
claude --dangerously-skip-permissions   # Agent tự quyết định mọi thứ

Khi nào dùng flag này hợp lý?

  • CI/CD pipeline trong container cách ly
  • Automated test trên branch riêng, có thể revert
  • Sandbox environment không ảnh hưởng production

Khi nào KHÔNG BAO GIỜ dùng?

  • Trên máy local làm việc hàng ngày
  • Trên nhánh main/production
  • Khi dự án có credentials thật
  • Khi bạn không thể revert

Một session autonomous có thể tạo ra 50 thay đổi trong 2 phút. Nếu 49 cái đúng và 1 cái phá file config — bạn mất hàng giờ debug. Không đáng.

#Tổng kết

An toàn khi dùng agent không phải là "nice to have" — nó là bắt buộc. Năm lớp bảo vệ:

  1. Nhánh riêng — luôn checkout trước khi mở agent
  2. Commit trước — tạo checkpoint để revert
  3. Review diff — đọc kỹ trước khi commit
  4. Sandbox/VM — cô lập cho task nguy hiểm
  5. Permission rules — kiểm soát chính xác từng hành động

Agent là công cụ mạnh. Nhưng giống mọi công cụ mạnh — nó có thể gây hại nếu dùng sai. Bạn là người chịu trách nhiệm cuối cùng, không phải AI.


Bài tiếp theo: Áp dụng tất cả kiến thức vào một workflow hoàn chỉnh — từ setup CLAUDE.md đến commit cuối cùng. Đây là bài tổng hợp, nơi mọi thứ ghép lại thành một quy trình chuyên nghiệp.