Tài liệuBảo mật

Bảo mật

Cách ZoPanel bảo vệ server và khách hàng: panel không chạy bằng root, sandbox từng tài khoản, tường lửa, WAF, quét mã độc, 2FA và nhật ký hoạt động.

ZoPanel được thiết kế cho shared hosting, nơi bạn phải tính trước rằng sớm muộn gì website của một khách cũng sẽ bị xâm nhập. Nhiều lớp bảo vệ giữ sự cố đó trong phạm vi một tài khoản: tách quyền trong panel, sandbox cho từng tài khoản, lọc mạng, và các công cụ báo cho bạn biết khi có gì bất thường. Trang này mô tả từng lớp và các thiết lập điều khiển chúng.

Kiến trúc: panel không chạy bằng root

ZoPanel chạy hai tiến trình với quyền khác nhau:

Tiến trình Chạy bằng Nhiệm vụ
zopanel serve user không đặc quyền zopanel, có hardening systemd (NoNewPrivileges, ProtectSystem=strict, ProtectHome, không capability) Giao diện web, API, database, job chạy nền
zopanel agent root Thực hiện một danh sách cố định các thao tác hệ thống qua socket nội bộ

Tiến trình web không bao giờ có quyền root. Nó chỉ có thể nhờ agent làm các thao tác trong danh sách cho phép (allowlist), và agent kiểm tra lại mọi tham số thay vì tin vào panel. Agent chỉ nhận kết nối từ user của panel hoặc root. Dữ liệu người dùng không bao giờ được đưa vào shell: mọi lệnh chạy bằng một chương trình cố định với danh sách tham số riêng.

Root cũng tránh đụng vào file trong thư mục home của khách. Thao tác file trong home chạy bằng chính user Linux của tài khoản đó, nên kernel tự kiểm soát quyền, và symlink do khách cài vào không thể lừa root đọc file của tài khoản khác.

Sandbox cho từng tài khoản

Mỗi tài khoản hosting là một user Linux riêng với tài nguyên riêng:

  • Giới hạn tài nguyên: mỗi tài khoản chạy trong slice systemd riêng (zp-<user>.slice) với giới hạn CPU, RAM và số tiến trình lấy từ gói hosting. PHP-FPM, cron job và ứng dụng của tài khoản đều chạy trong slice này.
  • PHP riêng: mỗi tài khoản có pool PHP-FPM riêng chạy bằng user của mình, có áp dụng open_basedir và disable_functions.
  • Cô lập file: khách không đọc được thư mục domains của nhau. nginx không đi theo symlink trỏ tới file của người khác, và SFTP bị chroot trong thư mục home.
  • Hạn mức ổ đĩa: trong Cài đặt → Hệ thống → Hạn mức ổ đĩa (quota), nút Bật quota để kernel áp dụng giới hạn dung lượng và số file (inode) của từng gói. Không có quota thì chỉ đo được mức dùng, và một tài khoản có thể làm đầy cả ổ đĩa.
  • Ẩn tiến trình: Trung tâm bảo mật có thể mount /proc với hidepid, để mỗi tài khoản chỉ thấy tiến trình của mình, không thấy dòng lệnh của khách khác.
  • Shell trong sandbox: terminal trên trình duyệt của khách chỉ truy cập được thư mục home.

Ứng dụng Docker

Ứng dụng từ Kho ứng dụng chạy trong Docker với user namespace remapping, do ZoPanel tự bật. Tiến trình chạy bằng root hay uid 1000 trong container được ánh xạ sang một dải uid trên host mà không tài khoản hosting nào sở hữu, nên khách không thể đọc biến môi trường hay dữ liệu của container qua uid trùng nhau.

Tường lửa và Fail2ban

Trình cài đặt bật UFW, mở cổng SSH của bạn cùng các cổng 80, 443, 8888, và cho UFW tự bật khi khởi động. Bạn quản lý quy tắc trong Bảo mật → Tường lửa (hành động, cổng, giao thức, nguồn).

Fail2ban được cấu hình sẵn:

Jail Theo dõi Quy tắc
sshd Đăng nhập SSH Sai 5 lần trong 10 phút thì chặn 1 giờ
zopanel Đăng nhập panel và mã 2FA sai Sai 8 lần trong 15 phút thì chặn 1 giờ

Dịch vụ mail và FTP tự thêm jail riêng khi bạn cài chúng. Các IP bị chặn hiện trên trang Bảo mật, nơi bạn có thể bỏ chặn. Nếu website đứng sau Cloudflare, hãy bật Website đứng sau Cloudflare để log, giới hạn tốc độ và Fail2ban thấy đúng IP thật của khách truy cập.

Tường lửa ứng dụng web (WAF)

Bảo mật → Tường lửa ứng dụng web cài ModSecurity với bộ luật OWASP Core Rule Set, chặn SQL injection, XSS, chèn file, thực thi mã từ xa và công cụ quét lỗ hổng. WAF chỉ được nạp khi có ít nhất một website dùng, tốn khoảng 25 MB RAM mỗi worker nginx.

Mỗi website có ba chế độ trong tab Công cụ: Bật (chặn tấn công), Chỉ phát hiện (ghi log) và Tắt. Nên để Chỉ phát hiện vài ngày, xem các sự kiện, rồi mới chuyển sang chặn. Nếu một luật chặn nhầm request hợp lệ, bấm Cho phép trên sự kiện đó để bỏ qua luật này cho website. Áp dụng cho mọi website đặt cùng một chế độ cho tất cả website.

Quét mã độc và cách ly

Quét mã độc tìm webshell, backdoor, mã bị làm rối, JavaScript bị chèn và file PHP trong thư mục uploads. Mọi tài khoản được quét tự động vào Chủ nhật hằng tuần, và khách có thể bấm Quét ngay cho website của mình.

Với mỗi phát hiện, bạn có thể:

  • Cách ly: file được chuyển vào ~/quarantine và bị xoá mọi quyền nên không chạy được nữa. Website có thể lỗi nếu đây là file hợp lệ.
  • Bỏ qua: đánh dấu là phát hiện nhầm.

Khách có thể nhận email hoặc tin nhắn Telegram khi phát hiện file đáng ngờ.

Xác thực hai lớp (2FA)

Mọi người dùng đều bật được 2FA trong Tài khoản của tôi → Xác thực hai lớp bằng bất kỳ ứng dụng TOTP nào (Google Authenticator, Authy, 1Password):

  1. Bấm Bật 2FA và quét mã QR.
  2. Nhập mã rồi bấm Xác minh & bật.
  3. Lưu 10 mã khôi phục. Mỗi mã đăng nhập được một lần khi bạn mất điện thoại. Tạo mã khôi phục mới sẽ thay bộ mã, và các mã cũ hết hiệu lực.

Để bắt buộc 2FA, vào Cài đặt → Chung → Bắt buộc xác thực hai lớp và chọn Quản trị viên và đại lý hoặc Tất cả. Bạn phải bật 2FA cho chính tài khoản của mình trước. Người dùng chưa có 2FA sẽ phải thiết lập ở lần đăng nhập tới.

Nếu một quản trị viên mất cả điện thoại lẫn mã khôi phục, chạy lệnh sau trên server bằng root:

zopanel ctl disable-2fa USERNAME

Lệnh này cũng đăng xuất người dùng ở mọi nơi và thu hồi các API token của họ.

Giới hạn IP truy cập panel

Cài đặt → Chung → Giới hạn truy cập panel chỉ cho các IP và dải mạng trong danh sách mở được panel (cả giao diện lẫn API). IP hiện tại của bạn phải có trong danh sách khi lưu. Nếu tự khoá mình ở ngoài, chạy trên server:

zopanel ctl allow-ip --clear       # bỏ giới hạn
zopanel ctl allow-ip 203.0.113.7   # hoặc chỉ cho phép một địa chỉ

API token

API token (zpat_…) được tạo trong Tài khoản của tôi → API token và cần license Pro. Khi tạo token, panel hỏi lại mật khẩu (và mã 2FA). Mỗi token có:

  • Quyền: Toàn quyền (như tài khoản của bạn), hoặc Chỉ cấp phát hosting (WHMCS, CMS), loại này chỉ gọi được API cấp phát /api/v1 (xem API cấp phát).
  • Chỉ cho phép từ IP: tối đa 20 IP hoặc dải mạng. Để trống nghĩa là mọi IP.
  • Hết hạn: 30, 90, 365 ngày, hoặc không hết hạn.

Kể cả token toàn quyền cũng không truy cập được phần bảo mật tài khoản (mật khẩu, 2FA), các token khác, terminal, license, việc kết nối fleet, giới hạn IP và chính sách 2FA, nơi lưu sao lưu, khoá khôi phục hay việc khôi phục cấu hình panel. Các thao tác đó cần một quản trị viên đang đăng nhập. Mỗi token được gọi tối đa 1200 request mỗi phút. Đổi mật khẩu sẽ thu hồi mọi token của bạn.

Nhật ký hoạt động toàn vẹn và syslog từ xa

Nhật ký hoạt động ghi lại các thao tác quan trọng về bảo mật. Mỗi dòng được nối chuỗi với dòng trước, nên nếu một dòng bị sửa hay xoá thì chuỗi bị đứt. Trung tâm bảo mật báo điều này ở mục Nhật ký hoạt động toàn vẹn.

Kẻ xâm nhập có quyền root vẫn có thể xoá toàn bộ nhật ký. Để giữ một bản sao mà không ai trên server sửa được, nhập máy chủ syslog trong Cài đặt → Chung → Gửi nhật ký hoạt động tới, ví dụ udp://logs.example.com:514 hoặc tcp://logs.example.com:514.

Mã hoá dữ liệu bí mật

Các giá trị nhạy cảm trong database của panel được mã hoá bằng AES-256-GCM: thông tin đăng nhập S3 và SMTP, token bot, API key, khoá khôi phục, secret TOTP, mật khẩu database server ngoài, biến môi trường của ứng dụng và container, fleet token. Khoá mã hoá lấy từ file cấu hình của server, chỉ root và panel đọc được, nên một bản sao database đứng riêng không làm lộ các giá trị này.

Trung tâm bảo mật

Trang Bảo mật mở đầu bằng Trung tâm bảo mật. Trung tâm chấm điểm server và panel, và có nút Sửa ngay cho những mục sửa tự động được an toàn. Các mục kiểm tra gồm:

  • Server: tường lửa đang bật và tự bật khi khởi động lại, root đăng nhập SSH bằng mật khẩu, SSH dùng mật khẩu, số lần thử SSH, Fail2ban, tự động cài bản vá bảo mật, bản vá và lần khởi động lại đang chờ, đồng bộ giờ, dịch vụ mở ra cổng công khai, tài khoản UID 0 thừa, mật khẩu rỗng, ẩn tiến trình (hidepid) và tham số kernel (sysctl).
  • Panel: mọi admin bật 2FA, chính sách bắt buộc 2FA, không dùng tên đăng nhập admin, panel có SSL hợp lệ, giới hạn IP truy cập panel, sao lưu ra ngoài server, có bản sao lưu trong 48 giờ, phiên bản panel, API token 90 ngày không dùng, mã độc chưa xử lý và nhật ký hoạt động toàn vẹn.

Các mục sửa SSH đều kiểm tra trước là đã có SSH key, nên việc sửa không thể khoá bạn khỏi server.


← FTP và SFTP Sao lưu →