Tối ưu bảo mật Nginx Proxy Manager: Access List, IP Whitelist và Basic Auth
Nginx Proxy Manager (NPM) giúp đưa service nội bộ ra Internet cực nhanh: vài cú click là có domain, SSL, reverse proxy. Nhưng nhanh cũng đồng nghĩa dễ hở. Một dashboard quản trị, Portainer, Home Assistant, Grafana, NAS, app staging… nếu public thẳng ra mạng chỉ với mật khẩu app gốc thì rủi ro rất cao.
Tin tốt: không cần hệ thống bảo mật phức tạp để giảm phần lớn nguy cơ. NPM đã có sẵn Access List, IP Whitelist và Basic Auth. Dùng đúng, bạn có thể chặn phần lớn bot scan, giảm brute-force, giới hạn truy cập theo vị trí/mạng, thêm một lớp xác thực trước app thật.
Mục tiêu: ít mở nhất có thể, đủ dùng, dễ vận hành.
Vì sao cần bảo vệ thêm ở tầng Nginx Proxy Manager?
Khi expose service qua NPM, Internet thấy domain của bạn. Bot sẽ thử:
– Quét path phổ biến: /admin, /login, /api, /wp-login.php.
– Brute-force form đăng nhập.
– Tìm lỗi CVE của app phía sau.
– Gửi request rác gây log noise, tải CPU.
– Khai thác panel quản trị bị cấu hình yếu.
Nếu chỉ dựa vào app backend, bạn đang để app đó chịu toàn bộ áp lực. Tốt hơn: chặn từ cửa ngoài.
NPM có thể đóng vai trò như lớp “gác cổng”:
– Access List → định nghĩa ai được vào. – IP Whitelist → chỉ IP/mạng cụ thể được truy cập. – Basic Auth → yêu cầu user/pass trước khi chuyển request vào backend. – Access rules → cho phép/chặn theo CIDR.
Không thay thế bảo mật app, nhưng là lớp phòng thủ rẻ, hiệu quả.
Access List trong NPM là gì?
Access List là cấu hình kiểm soát truy cập có thể gắn vào từng Proxy Host. Một Access List thường gồm:– Authorization: bật Basic Auth, tạo user/password. – Access: allow/deny IP hoặc subnet. – Satisfy Any: logic kết hợp giữa auth và IP rule.
Bạn tạo một Access List, rồi áp cho một hoặc nhiều host. Ví dụ:
– internal-only cho app nội bộ.
– admin-basic-auth cho dashboard admin.
– office-whitelist chỉ cho IP công ty.
– vpn-only chỉ cho subnet VPN.
Ưu điểm: quản lý tập trung. Đổi password hoặc IP một nơi, nhiều host hưởng theo.
IP Whitelist: lớp chặn hiệu quả nhất
Nếu service chỉ dành cho bạn, team nhỏ, văn phòng, VPN, thì IP Whitelist thường là lựa chọn mạnh nhất.
Thay vì để cả Internet thấy login page, bạn chỉ cho phép IP cụ thể:
– IP nhà.
– IP văn phòng.
– IP VPS trung gian.
– Dải IP VPN: 10.8.0.0/24, 100.64.0.0/10 với Tailscale/CGNAT tuỳ setup.
– IP reverse proxy/CDN nếu dùng thêm lớp ngoài.
Ví dụ rule:
Allow: 203.0.113.10
Allow: 198.51.100.0/24
Deny: 0.0.0.0/0Ý nghĩa: chỉ IP được allow mới vào, còn lại bị chặn.
Khi nào nên dùng IP Whitelist?
Dùng cho:
– NPM admin panel. – Portainer. – phpMyAdmin/Adminer. – Grafana nội bộ. – Prometheus. – Uptime Kuma private. – Home Assistant nếu không cần public. – API quản trị. – Staging environment.
Không nên chỉ whitelist nếu:
– Người dùng thay đổi IP liên tục. – App phục vụ khách hàng công khai. – Team remote không có VPN. – Mobile network đổi IP thường xuyên.
Trong các trường hợp đó, dùng VPN hoặc Basic Auth bổ sung.
Basic Auth: lớp khóa đơn giản trước ứng dụng
Basic Auth là hộp đăng nhập trình duyệt hiển thị trước khi request đi vào backend. Nó rất đơn giản: user/password lưu trong NPM, Nginx kiểm tra trước.Ưu điểm:
– Dễ bật. – Chặn bot scan cơ bản. – Giảm brute-force vào app thật. – Hữu ích cho staging, preview, admin tool. – Không cần sửa code app.
Nhược điểm:
– UX xấu hơn form login. – Không có MFA. – Khó quản lý nhiều user lớn. – Nếu chia sẻ password lung tung → mất tác dụng. – Với API/mobile app có thể gây bất tiện.
Basic Auth nên chạy qua HTTPS. Không dùng HTTP thường, vì credential có thể bị lộ trên đường truyền.
Mật khẩu Basic Auth nên đặt thế nào?
Tối thiểu:
– Dài 16+ ký tự.
– Không dùng lại mật khẩu app.
– Không dùng kiểu admin/admin, user/password.
– Mỗi nhóm service nên có mật khẩu riêng.
– Đổi khi có người rời team.
Ví dụ tốt:
ops-dashboard / password random 24 ký tự
staging-viewer / password random 24 ký tựĐừng cố nhớ. Dùng password manager.
Satisfy Any: điểm dễ cấu hình sai
Trong NPM Access List có tùy chọn Satisfy Any. Đây là phần cần hiểu kỹ.
Về logic:
– Tắt Satisfy Any: request phải thỏa cả IP rule và Basic Auth. – Bật Satisfy Any: request chỉ cần thỏa một trong hai.
Ví dụ bạn cấu hình:
– Allow IP văn phòng. – Basic Auth cho user ngoài văn phòng. – Bật Satisfy Any.
Kết quả:
– Ở văn phòng → vào thẳng, không cần Basic Auth. – Ngoài văn phòng → cần Basic Auth. – IP không allow nhưng nhập đúng Basic Auth → vẫn vào.
Đây có thể là mong muốn. Nhưng với service nhạy cảm, nó làm yếu whitelist.
Nếu bạn muốn: chỉ IP whitelist được vào và vẫn phải nhập Basic Auth, hãy tắt Satisfy Any.
Quy tắc thực tế
– App cực nhạy cảm → Whitelist + Basic Auth + Satisfy Any OFF. – App staging cho client → Basic Auth, không cần whitelist. – App nội bộ qua VPN → Whitelist subnet VPN, có thể thêm Basic Auth. – Dashboard quản trị → Whitelist trước, Basic Auth sau.
Cách cấu hình Access List an toàn trong NPM
Trong giao diện NPM:
1. Vào Access Lists.
2. Chọn Add Access List.
3. Đặt tên rõ ràng, ví dụ vpn-and-basic-auth.
4. Tab Authorization:
– Thêm user.
– Đặt password mạnh.
5. Tab Access:
– Add rule Allow cho IP/subnet tin cậy.
– Add rule Deny cho 0.0.0.0/0.
6. Kiểm tra Satisfy Any:
– Tắt nếu muốn bắt buộc cả IP và password.
– Bật nếu muốn IP trusted bỏ qua password.
7. Lưu.
8. Vào Proxy Hosts.
9. Edit host cần bảo vệ.
10. Tab Details hoặc Access List.
11. Chọn Access List vừa tạo.
12. Save, test từ IP được phép và IP ngoài.
Cần test bằng 4 tình huống:
– IP allow + đúng password. – IP allow + sai password. – IP không allow + đúng password. – IP không allow + không password.
Đừng chỉ test từ laptop đang được allow rồi kết luận an toàn.
Mẫu cấu hình theo từng use case
NPM admin panel
Khuyến nghị:
– Không expose public nếu không cần. – Chỉ truy cập qua VPN hoặc LAN. – Nếu bắt buộc public: whitelist IP + Basic Auth. – Tắt Satisfy Any.
Rule:
Allow: IP nhà/văn phòng/VPN
Deny: 0.0.0.0/0
Basic Auth: bật
Satisfy Any: offPortainer, phpMyAdmin, Adminer
Đây là nhóm rủi ro cao. Nếu lộ, hậu quả thường nặng.
Khuyến nghị:
– Tốt nhất: không public. – Dùng VPN. – Whitelist subnet VPN. – Basic Auth thêm một lớp. – Backend vẫn phải có password mạnh.
Staging site cho khách xem
Khuyến nghị:
– Basic Auth là đủ trong nhiều trường hợp. – Không dùng credential thật. – Chặn index bởi search engine nếu cần. – Không lưu dữ liệu production.
Rule:
Basic Auth: bật
IP whitelist: tùy chọn
Satisfy Any: không quan trọng nếu không có IP ruleAPI public
Cẩn thận: Basic Auth ở NPM có thể phá client/API nếu client không gửi header đúng.
Khuyến nghị:
– Không dùng Basic Auth tầng NPM cho API public. – Dùng auth của API: token, OAuth, session. – Rate limit/WAF/CDN nếu cần. – Chỉ whitelist cho endpoint admin/internal.
Lỗi cấu hình thường gặp
Chỉ bật Basic Auth rồi nghĩ là đủ
Basic Auth tốt, nhưng không phải MFA, không chống được mọi brute-force. Với admin tool nhạy cảm, thêm IP whitelist.
Bật Satisfy Any sai ý định
Đây là lỗi phổ biến nhất. Muốn “IP whitelist + password” nhưng bật Satisfy Any → người ngoài chỉ cần password là vào.
Quên Deny all
Nếu chỉ add allow nhưng không deny phần còn lại, hãy test kỹ. Cấu hình đúng nên rõ ràng: allow cụ thể, deny tất cả.
Whitelist IP động
IP nhà mạng đổi → tự khóa mình ngoài. Cách xử lý:
– Dùng VPN. – Dùng Tailscale/WireGuard. – Có đường truy cập fallback qua SSH. – Ghi lại cách sửa từ server nếu mất quyền.
Tin tưởng header sai
Nếu phía trước NPM còn có Cloudflare/CDN/LB, IP client thật có thể nằm trong X-Forwarded-For. Cấu hình sai có thể khiến whitelist không như mong muốn. Chỉ tin proxy header từ nguồn đáng tin.
Checklist bảo mật nhanh
– HTTPS bật cho mọi host. – Force SSL bật. – HTTP/2 bật nếu phù hợp. – NPM admin không public nếu tránh được. – Access List cho mọi admin service. – Whitelist IP/VPN cho service nhạy cảm. – Basic Auth cho staging/admin phụ. – Satisfy Any kiểm tra đúng logic. – Password riêng, mạnh, lưu password manager. – Không dùng default credential backend. – Log review định kỳ. – Backup cấu hình NPM. – Có phương án truy cập server khi tự khóa mình.
Kết luận thực tế
Bảo mật Nginx Proxy Manager không cần bắt đầu bằng hệ thống phức tạp. Ba công cụ sẵn có — Access List, IP Whitelist, Basic Auth — đã đủ giảm mạnh bề mặt tấn công nếu dùng đúng.
Công thức ngắn gọn:
– Service public thật → bảo mật ở app, HTTPS, rate limit/CDN nếu cần. – Service staging → Basic Auth. – Service admin → IP whitelist/VPN. – Service cực nhạy cảm → whitelist + Basic Auth, Satisfy Any tắt. – Không chắc → đừng public.
Nguyên tắc cuối: cái gì không cần Internet thấy thì đừng đưa ra Internet. NPM giúp public service dễ hơn; nhiệm vụ của bạn là public ít hơn.
Bình luận (0)
Chưa có bình luận. Hãy là người đầu tiên!