Bảo mật WP: bảo mật wp-admin | đổi địa chỉ đăng nhập·giới hạn đăng nhập·XML-RPC

Bảo mật wp-admin là các cài đặt chặn tấn công dò mật khẩu đi vào qua màn hình quản trị và màn hình đăng nhập WordPress. Qua log truy cập của server Nginx + Apache chạy nhiều website WordPress, các yêu cầu tự động vào xmlrpc.php vẫn tiếp tục dù đã đổi địa chỉ đăng nhập, nên giới hạn tốc độ ở cấp server cũng được áp dụng thêm.
1️⃣ Vì sao wp-admin và wp-login.php bị tấn công
Việc địa chỉ quản trị WordPress ai cũng biết là một điểm yếu, nhưng có thể bù lại bằng cách tăng cường bảo mật. Mọi website WordPress đều dùng chung /wp-admin/ và [wp-login.php], và mở /wp-admin/ khi chưa đăng nhập sẽ chuyển đến màn hình đăng nhập [wp-login.php].
Tấn công đến dưới dạng dò mật khẩu, tức nhập tên người dùng và mật khẩu lặp đi lặp lại trên màn hình đăng nhập này. Vì vậy bảo mật wp-admin trước hết là chặn các lần thử đăng nhập, chứ không phải giấu địa chỉ.
2️⃣ Hiệu quả và giới hạn của việc đổi địa chỉ đăng nhập
Đổi địa chỉ đăng nhập bằng plugin bảo mật thì [wp-login.php] mặc định sẽ trả về lỗi 404, nên tấn công tự động gõ vào địa chỉ mặc định không tới được màn hình đăng nhập. Địa chỉ mới phải báo riêng cho người có tài khoản quản trị.
Cách này ít tốn công, nhưng nếu quên địa chỉ mới sẽ không vào được màn hình quản trị và phải đổi tên thư mục plugin đó qua FTP hoặc trình quản lý file để vô hiệu hóa. Với site nhiều người quản lý, nên ghi địa chỉ ở một chỗ.
3️⃣ Giới hạn số lần đăng nhập và xác thực hai bước
Dù đã đổi địa chỉ đăng nhập, nếu địa chỉ mới bị lộ thì các lần dò mật khẩu vẫn tiếp tục. Lõi WordPress không giới hạn số lần đăng nhập sai, nên nhập sai mật khẩu bao nhiêu lần thì màn hình đăng nhập cũ vẫn mở lại.
Plugin giới hạn số lần đăng nhập chặn IP vượt quá số lần quy định trong một khoảng thời gian, còn xác thực hai bước yêu cầu thêm mã từ ứng dụng xác thực trên điện thoại dù mật khẩu đúng. Khi bật xác thực hai bước, hãy giữ cả mã dự phòng để dùng khi mất điện thoại.
4️⃣ Đóng xmlrpc.php
[xmlrpc.php] là lối vào thứ hai nhận tên người dùng và mật khẩu mà không qua màn hình đăng nhập, và với cách [system.multicall] có thể thử nhiều mật khẩu trong một yêu cầu.
Log truy cập của server Nginx + Apache chạy nhiều website WordPress cho thấy có 2.250 yêu cầu POST vào [xmlrpc.php] từ 0:00 đến 9:50 ngày 13/10. Các yêu cầu đến từ 22 IP, và User-Agent giả danh Jetpack và WordPress.com.
Nếu không dùng ứng dụng di động WordPress hay Jetpack, hãy chặn yêu cầu [xmlrpc.php] trong cấu hình Nginx hoặc dùng cài đặt tắt XML-RPC của plugin bảo mật.
# trong khối server — từ chối yêu cầu xmlrpc.php
location = /xmlrpc.php {
deny all;
}Với cài đặt này, mọi yêu cầu GET và POST vào [xmlrpc.php] đều kết thúc bằng 403 mà không đến PHP. Tắt XML-RPC trong plugin bảo mật chỉ từ chối yêu cầu cần đăng nhập còn file vẫn phản hồi, nên muốn giảm cả số lần chạy PHP thì chặn ở Nginx hợp lý hơn.
5️⃣ Chặn ở server: giới hạn IP truy cập quản trị·giới hạn tốc độ
Nếu chỉ quản lý từ một IP cố định, cách chắc chắn nhất là chỉ cho phép IP đó vào [wp-login.php] và /wp-admin/ trong Nginx. Cách này không hợp với môi trường mà IP nhà hay văn phòng hay thay đổi.
Chặn toàn bộ /wp-admin/ có vẻ là đủ, nhưng các tính năng phía khách như tìm kiếm hay giỏ hàng thường gửi yêu cầu đến [admin-ajax.php], nên phải để mở file đó.
# trong khối server — đặt trên location xử lý PHP
location = /wp-login.php {
allow 203.0.113.10; # IP cố định dùng để quản trị
deny all;
# chép nguyên cài đặt của location xử lý PHP vào dưới đây
}Mở [wp-login.php] từ IP khác IP đã chỉ định sẽ nhận 403, còn IP đã chỉ định thì mở được màn hình đăng nhập. Trong location phải chép nguyên cài đặt xử lý PHP của site (fastcgi_pass v.v.) thì màn hình đăng nhập mới chạy bình thường.
Nếu không thể cố định IP, có cách giới hạn tốc độ các yêu cầu PHP của khách chưa đăng nhập; quá trình giới hạn ở 30 lần mỗi phút để yêu cầu tự động không chiếm tài nguyên server được trình bày trong cảnh báo php-fpm max_children (bài viết riêng).
# khối http — chỉ đếm theo IP các yêu cầu không có cookie đăng nhập
map $http_cookie $php_anon_key {
default $binary_remote_addr;
"~*wordpress_logged_in" "";
}
limit_req_zone $php_anon_key zone=php_anon:10m rate=30r/m;
# trong location xử lý PHP
limit_req zone=php_anon burst=60 nodelay;
limit_req_status 429;Khi một IP chưa đăng nhập gửi yêu cầu PHP liên tiếp, đến yêu cầu thứ 61 vẫn được xử lý, sau đó trả về 429; yêu cầu có cookie đăng nhập không bị tính. Nếu cache trang trả lời mà không qua PHP thì việc xem trang của khách thông thường không bị giới hạn này.
Plugin bảo mật
Plugin bảo mật WordPress Best 5
Tổng hợp năm plugin bảo mật tiêu biểu thành bảng so sánh.
Đăng nhập
Đặt lại mật khẩu quản trị khi quên
Cách đổi mật khẩu trong hồ sơ và cách đặt lại khi quên.
Công cụ
Trình tạo mật khẩu ngẫu nhiên
Công cụ tạo mật khẩu 6–30 ký tự kết hợp chữ hoa, chữ thường, số và ký tự đặc biệt.
ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.