Thực hành tốt
Bảo mật và phân quyền khi tự host KDIGI CMS
Ba lớp: cấu hình khi triển khai, phân quyền tối thiểu theo vai trò và site, kiểm soát endpoint công khai.
Cập nhật lần cuối:

Cấu hình đúng khi triển khai, cấp quyền tối thiểu theo vai trò và site, rồi kiểm soát endpoint công khai. Checklist dưới đây có căn cứ từ SECURITY.md và tài liệu phân quyền.
Tóm tắt nhanh
- Bốn vai trò:
super-admin›admin›editor›author.- Ranh giới giữa site là access predicate, không phải bộ chọn site.
PAYLOAD_SECRETdưới 32 ký tự: production không khởi động.- Khóa R2 chỉ ghi, không đọc ngược qua API.

Khi triển khai
PAYLOAD_SECRETngẫu nhiên ≥ 32 ký tự (openssl rand -hex 32)PAYLOAD_PUBLIC_SERVER_URLđúng originhttps://của CMS- HTTPS qua reverse proxy (Caddy, nginx, Coolify)
- Cổng 3000 chỉ proxy truy cập được
- PostgreSQL chỉ mở trong mạng nội bộ, đổi mật khẩu mặc định
- Tạo
super-adminngay sau khi triển khai - Không bật
SEED_DEMOở production
Ví dụ Caddy và lệnh Compose xem ở tự host.
Mô hình vai trò
| Vai trò | Phạm vi | Làm được |
|---|---|---|
super-admin |
Mọi site | Duy nhất tạo/xóa người dùng và site, sửa R2, chạy job |
admin |
Site được gán | Quản lý nội dung, đăng, cài đặt site, xóa vĩnh viễn |
editor |
Site được gán | Quản lý nội dung, đăng, duyệt bình luận |
author |
Site được gán | Chỉ sửa bài của mình, không đăng |
- Cộng tác viên là author Biên tập viên duyệt và bấm Đăng.
- Khách hàng là admin Chỉ gán đúng site của họ.
- Super-admin ít người Giữ cho 1–2 người vận hành hạ tầng.
Lưu ý Vai trò là toàn cục: cần editor ở site A nhưng author ở site B thì tạo hai tài khoản. Author vẫn sửa được
taxonomies,menus,faqs,redirects,mediatrong site của mình. Chi tiết: phân quyền người dùng.
Cách ly giữa các site
| Lớp | Vai trò |
|---|---|
| Bộ chọn site trong admin | Tiện ích giao diện, không phải kiểm soát bảo mật |
Access predicate tenantScopedRead/Write |
Ranh giới thật cho mọi thao tác |
Cảnh báo Request ẩn danh đọc nội dung đã xuất bản của mọi site nếu bạn không lọc. Luôn thêm
where[tenant][equals]=<id>. Xem quản lý nhiều website.
API key và bí mật
- Mỗi tích hợp một user riêng, vai trò thấp nhất đủ dùng
- Frontend công khai gọi API không cookie, không Authorization
- Khóa R2 chỉ ghi qua
POST /api/sites/:id/secret(super-admin) - Không đặt bí mật vào trường thường của Sites
- Đổi
PAYLOAD_SECRETđể thu hồi mọi phiên và API key
Phiên admin kéo dài 180 ngày (auth.tokenExpiration).
Endpoint công khai và tải lên
- Bình luận Luôn
pending;RECAPTCHA_SECRETchỉ ghi log điểm thấp. Đặt rate limit ở proxy. - Nhập ảnh từ URL
POST /api/media/from-urlchặn SSRF: từ chối dải IP riêng, tối đa 3 lần chuyển hướng, 25 MB. - Markdown Làm sạch bằng allow-list;
script,iframe,on*bị loại.
Báo lỗi bảo mật
Dự án chỉ hỗ trợ bản 1.x mới nhất. Báo qua GitHub Security Advisories, không mở issue công khai; phản hồi trong 3 ngày làm việc, cập nhật trạng thái trong 10 ngày. Xem mã nguồn mở.
Checklist nhanh
PAYLOAD_SECRET≥ 32 ký tự, đã sao lưu cùng database- HTTPS; cổng 3000 và Postgres không lộ ra internet
- Mỗi người chỉ được gán đúng site; cộng tác viên là
author - Frontend lọc
tenanttrên mọi truy vấn ẩn danh - Rate limit ở proxy nếu mở bình luận
- Có kế hoạch sao lưu và nâng cấp
Câu hỏi thường gặp
Người dùng site A có xem được nội dung site B không?
Vai trò author có thể tự đăng bài không?
Ai cũng tạo được super-admin trên bản cài mới à?
Khóa R2 và API key có lộ qua API không?
Bình luận công khai có bị spam không?
Đọc tiếp
Phân quyền người dùng
Bốn vai trò super-admin, admin, editor, author; gán theo từng website; tác giả gửi bài chờ duyệt. Có tài khoản demo để thử ngay không cần cài đặt.
Tự host
Cài KDIGI CMS trên VPS của bạn bằng Docker Compose hoặc Coolify: yêu cầu hệ thống, biến môi trường, sao lưu, nâng cấp và các bước tăng cường bảo mật.
Sao lưu và nâng cấp
Quy trình sao lưu cơ sở dữ liệu và media, kiểm tra khôi phục, nâng cấp phiên bản bằng Docker, xem release notes và cách quay lui khi nâng cấp gặp sự cố.
Quản lý nhiều website
Một bảng quản trị cho nhiều website: tách dữ liệu theo site, cấu hình tên miền, thương hiệu, SEO riêng. Phù hợp agency và doanh nghiệp nhiều thương hiệu.