Tăng cường bảo mật WordPress với Cloudflare (hướng dẫn cài nhanh)
Quan trọng: Hướng dẫn này được thiết kế tập trung cho blog & trang tin tức WordPress. Các dạng trang khác như trang thương mại điện tử cần điều chỉnh lại một số rule.
Gói miễn phí của Cloudflare có tính năng bảo mật mạnh mẽ cho WordPress, tôi rất khuyên dùng nếu bạn sử dụng dịch vụ proxy của nó (bạn cần bật đám mây vàng trong DNS của Cloudflare lên thì các tính năng dưới đây mới có tác dụng).
Lưu ý: Bạn không bắt buộc phải dùng Cloudflare thì mới dùng được wpsila, 2 cái này độc lập với nhau. Tuy nhiên việc bổ sung thêm các tính năng của Cloudflare sẽ giúp trang WordPress của bạn an toàn hơn.
Quan trọng: Khi sử dụng Cloudflare proxy (bật đám mây vàng) kết hợp với Caddy Server thì bạn cần phải để cài đặt SSL/TLS mode là Full (Strict) để tránh vòng lặp vô tận (chuyển hướng quá nhiều). Cách làm như sau:
Bạn truy cập vào tên miền trên Cloudflare, rồi vào SSL/TLS > Overview
- Click nút Configure
- Chọn Full (Strict) rồi nhấn Save để lưu tùy chọn này.
Tiếp theo: Truy cập vào tên miền của bạn trên Cloudflare, nhìn sang cột trái, chọn Security > Security rules > Create rule.
Đây chính là nơi ta tạo ra các quy tắc để chống lại các cuộc tấn công mạng (vốn rất phổ biến hiện nay, ngay cả khi website của bạn không nổi tiếng).
Quy tắc 1: Chặn truy cập các file nhạy cảm
Các file này thường chứa dữ liệu nhạy cảm của website hoặc thực thi nó gây nguy hiểm, và do vậy cũng nên chặn truy cập chúng luôn. Danh sách này khá dài:
- /xmlrpc.php
- /wp-config.php
- .htaccess
- /.env
- /.git/
- /wp-includes/wlwmanifest.xml
- .log, .sql, .bak, .old...
- php trong thư mục upload
Để triển khai rule này bạn làm như sau:
- Tạo một rule mới bằng cách chọn Create rule > Custom rules
- Rule name (required) nhập tùy ý, ví dụ Chặn truy cập các file nhạy cảm
- Kéo xuống dưới một chút, bạn click vào link màu xanh Edit expression
Một ô nhập liệu mở ra, bạn paste mã dưới đây vào (nhấn nút Sao chép ở góc trên bên phải để tiện copy mã này):
(http.request.uri.path contains "/xmlrpc.php") or (http.request.uri.path contains "/wp-config.php") or (http.request.uri.path contains ".htaccess") or (http.request.uri.path contains "/.env") or (http.request.uri.path contains "/.git/") or (http.request.uri.path contains "/wp-includes/wlwmanifest.xml") or (ends_with(http.request.uri.path, ".log")) or (ends_with(http.request.uri.path, ".sql")) or (ends_with(http.request.uri.path, ".bak")) or (ends_with(http.request.uri.path, ".old")) or (ends_with(http.request.uri.path, "readme.html")) or (ends_with(http.request.uri.path, "license.txt")) or (ends_with(http.request.uri.path, ".git")) or (http.request.uri.path contains "/wp-content/uploads/" and http.request.uri.path contains ".php")
Kéo tiếp xuống dưới, ở phần Choose action bạn chọn Block.
Cuối cùng bạn nhấn Deploy để triển khai.
Lưu ý về file xmlrpc.php
Nói riêng về trường hợp chặn /xmlrpc.php: Nó là file cần dùng nếu bạn sử dụng plugin Jetpack hoặc phải đăng nhập WordPress qua app trên di động. Cả hai cái này đều không có quá nhiều người cần, và vì rủi ro cao của xmlrpc.php nên giải pháp chặn thường được ưu tiên hơn.
Tuy nhiên nếu bạn bắt buộc cần nó, ví dụ bạn phải dùng plugin Jetpack chẳng hạn, thì bạn cần bỏ chặn file này đi, khi đó bạn dùng mã này (đã loại bỏ xmlrpc.php ra khỏi danh sách chặn):
(http.request.uri.path contains "/wp-config.php") or (http.request.uri.path contains ".htaccess") or (http.request.uri.path contains "/.env") or (http.request.uri.path contains "/.git/") or (http.request.uri.path contains "/wp-includes/wlwmanifest.xml") or (ends_with(http.request.uri.path, ".log")) or (ends_with(http.request.uri.path, ".sql")) or (ends_with(http.request.uri.path, ".bak")) or (ends_with(http.request.uri.path, ".old")) or (ends_with(http.request.uri.path, "readme.html")) or (ends_with(http.request.uri.path, "license.txt")) or (ends_with(http.request.uri.path, ".git")) or (http.request.uri.path contains "/wp-content/uploads/" and http.request.uri.path contains ".php")
Quy tắc 2: Bảo vệ trang đăng nhập & trang admin
Trang đăng nhập của WordPress nằm ở địa chỉ: ten-mien-cua-ban.com/wp-login.php
Còn trang admin của bạn nằm ở địa chỉ: ten-mien-cua-ban.com/wp-admin
Kẻ tấn công rất thường xuyên tấn công trang đăng nhập và trang quản trị này. Chúng ta sẽ thiết lập rule để chống lại các bot tự động truy cập vào hai địa chỉ trên.
Chọn Create rule > Custom rules
Chỗ Rule name (required) đặt tên tùy ý, nhưng nên là gợi ý để bạn biết ý nghĩa của nó, ví dụ: Hạn chế bot vào trang login và admin.
Bên dưới bạn click vào Edit expression để thêm mã.
(http.request.uri.path contains "/wp-login.php") or (http.request.uri.path contains "/wp-admin" and not http.request.uri.path contains "/wp-admin/admin-ajax.php" and not http.request.uri.path contains "/wp-admin/css/" and not http.request.uri.path contains "/wp-admin/js/" and not http.request.uri.path contains "/wp-admin/images/")
Kéo xuống dưới, ở phần Choose action bạn chọn Managed Challenge.
Cuối cùng nhấn nút Deploy để triển khai chính thức.
Ý nghĩa: Nếu có truy cập trang đăng nhập hoặc admin, Cloudflare sẽ thử thách xem nó có phải là bot không, nếu là bot thì chặn luôn.
Nếu bạn làm đúng, lúc bạn vào trang đăng nhập WordPress thì Cloudflare sẽ kiểm tra trước khi cho vào (khoảng 2 – 3 giây):
Quy tắc 3: Hạn chế bot rác
Các bot rác thường gây tốn tài nguyên không cần thiết, việc hạn chế chúng giúp máy chủ của bạn nhàn nhã hơn, và chỉ phục vụ người dùng thay vì phải chia sẻ tài nguyên cho các bot không hữu ích này.
Bạn thêm một rule mới đặt tên tùy ý (ví dụ: Hạn chế bot rác), rồi nhập mã bên dưới vào phần Edit expression.
(http.user_agent eq "") or (http.user_agent contains "go-http") or (http.user_agent contains "axios") or (http.user_agent contains "wpscan") or (http.user_agent contains "sqlmap") or (http.user_agent contains "nmap") or (http.user_agent contains "headless") or (http.user_agent contains "selenium") or (http.request.method eq "POST" and http.referer eq "" and not cf.client.bot)
Kéo xuống dưới, ở phần Choose action bạn chọn Managed Challenge.
Cuối cùng nhấn nút Deploy để triển khai.
Quy tắc 4: Hạn chế bình luận spam
Các bot tự động có thể thực hiện bình luận spam liên tục để kiếm link SEO, bổ sung rule đơn giản dưới đây sẽ bạn hạn chế chúng.
Bạn thêm một rule mới (Create rule > Custom rules) đặt tên tùy ý (ví dụ: Hạn chế spam bình luận), rồi nhập mã bên dưới vào phần Edit expression.
(http.request.uri.path eq "/wp-comments-post.php" and http.request.method eq "POST" and not http.referer contains "ten-mien-cua-ban.com")
Rất quan trọng: Phải thay ten-mien-cua-ban.com trong dấu nháy kép của mã bằng tên miền thực tế của bạn, nếu không nó sẽ không phát huy tác dụng.
Kéo xuống dưới, ở phần Choose action bạn chọn Managed Challenge.
Tiếp theo nhấn nút Deploy để triển khai.
Quy tắc 5: Không chặn chính mình
VPS đôi khi cần thực hiện các nhiệm vụ đến chính bản thân nó, và vì các rule trước đó ta triển khai khá chặt (đặc biệt là rule thuộc quy tắc 3) nên chúng ta cần ngoại lệ: nếu yêu cầu từ chính VPS thì không cần thử thách.
Bạn thêm một rule mới (Create rule > Custom rules) đặt tên tùy ý (ví dụ: Không chặn chính mình), rồi nhập mã bên dưới vào phần Edit expression.
(ip.src eq IP_cua_VPS)
Rất quan trọng: Phải thay IP_cua_VPS trong mã bằng IP thật của VPS (ví dụ một chuỗi IP của một VPS: 198.11.37.214 - chú ý là IP VPS của bạn sẽ khác!), nếu không nó sẽ không phát huy tác dụng.
Kéo xuống dưới, ở phần Choose action bạn chọn Skip. Và bên dưới một chút ở phần WAF components to skip thì tick chọn All remaining custom rules.
Phần trên có nghĩa là nếu các yêu cầu xuất phát từ chính VPS thì nó sẽ bỏ qua các rule còn lại, không chặn (Block) hay thử thách (Managed Challenge) gì cả.
Ở phần này, bạn cần để ý thêm Select order, và chọn First để quy tắc này là quy tắc đầu tiên.
Cuối cùng nhấn nút Deploy để triển khai.
Vậy là xong, mặc dù phần này hơi kỹ thuật, nhưng bạn chỉ cần bỏ ra 10 phút là website của bạn an toàn hơn rất nhiều, và bạn cũng hiếm khi phải quay lại điều chỉnh phần này. Rất đáng để làm.
Thứ tự các cài đặt bảo mật nên như sau:
- Không chặn chính mình.
- Chặn truy cập các file nhạy cảm.
- Hạn chế bot vào trang login, admin.
- Hạn chế bot rác.
- Hạn chế spam bình luận.
Bạn làm theo thứ tự như hướng dẫn trên thì nó tự động sẽ theo sắp xếp này, thứ tự này cần tuân thủ, vì theo nguyên tắc, rule quan trọng hơn sẽ để làm vòng thử thách/chặn sớm hơn.
Nếu không đúng thứ tự bạn chỉ cần ra mục security-rules, lấy chuột bấm để kéo lên xuống đúng như thứ tự mong muốn:
Lưu ý cuối: Hãy đặt mật khẩu cho trang WordPress đủ khó, nên có cả chữ, số & ký tự đặc biệt nhưng vẫn đủ dễ nhớ với bạn.
Bổ sung: Giới hạn tần suất đăng nhập trang login
Một bot xịn có thể vượt qua các rule thử thách mà chúng ta thiết lập ở trên để vào trang login, khi vào được đây chúng có khả năng tấn công trang đăng nhập này.
Trong phần này chúng ta sẽ giới hạn tần số của nó, vì đặc điểm của các bot là tốc độ tấn công rất cao. Cách làm:
Create rule > rate limiting rule. Phần Rule name đặt tên tùy ý, ví dụ: Giới hạn số lần vào trang đăng nhập. Bạn click Edit expression rồi nhập mã bên dưới vào:
(http.request.uri.path contains "/wp-login.php")
Kéo tiếp xuống dưới đến phần When rate exceeds…Nhập Requests (required) giá trị 3, còn Period (required) chọn 10s (cố định, không có chọn lựa khác).
Tiếp bên dưới Choose action chọn Block, Duration (required) chọn 10s. Cuối cùng nhấn Deploy để triển khai rule.
Ý nghĩa của các con số trên là, nó chỉ cho phép truy cập trang đăng nhập (wp-login.php) tối đa 3 lần trong 10s, nếu vi phạm nó sẽ block trong 10s mới truy cập lại được.
Nó sẽ hạn chế rất nhiều tốc độ của các bot xịn, cũng như khi người thật muốn chủ động dò pass của bạn (đấy là lý do bạn nên đặt pass có độ khó cao).
Ví dụ về việc một ai đó bị block 10s nếu vi phạm tốc độ: