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

Thông báo tiếp thị liên kết Ver 3.1
Thông báo tiếp thị liên kết Ver 3.2 (chỉ trên di động)

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ỉ.

Hai lối vào đăng nhập WordPress
Truy cập bằng trình duyệt
/wp-admin/
Nếu chưa đăng nhập thì chuyển đến màn hình đăng nhập (302)
wp-login.php
Màn hình đăng nhập · nhập tên người dùng và mật khẩu
Ứng dụng · yêu cầu tự động
xmlrpc.php
Gửi tên người dùng và mật khẩu bằng yêu cầu POST, không qua màn hình đăng nhập
Không qua màn hình đăng nhập
system.multicall thử nhiều mật khẩu trong một yêu cầu · đổi địa chỉ đăng nhập thì địa chỉ này vẫn y nguyên
Cùng một bước kiểm tra tên người dùng·mật khẩu
Cả hai lối vào đều kiểm tra tài khoản bằng cùng hàm xác thực của WordPress
Tấn công dò mật khẩu đi vào qua lối nào trong hai lối đang mở. Đổi địa chỉ đăng nhập chỉ áp dụng cho lối phía trên, nên xmlrpc.php phải đóng riêng hoặc giới hạn số yêu cầu.

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ị.

🧭 Lối vào đăng nhập WordPress
Sơ đồ giải thích
⬜ Không có plugin
🛡️ Hide My WP
🚪 Lối vào đăng nhập
/wp-login.php · /wp-admin/Cùng địa chỉ trên mọi WordPress
Màn hình đăng nhập404
/newloginĐịa chỉ đã đổi · chỉ quản trị viên biết
Màn hình đăng nhập
POST /xmlrpc.phpKiểm tra mật khẩu không cần màn hình đăng nhập
Trả lời kiểm tra mật khẩuVô hiệu 405
Đo trên site thử nghiệm · yêu cầu khi chưa đăng nhập
→
🤖 Tấn công tự động
Lối vào có thể thử mật khẩu ở địa chỉ ai cũng biết
2
1
Không có
Không có plugin thì có thể thử mật khẩu ở hai nơi: [wp-login.php] giống nhau trên mọi website WordPress, và [xmlrpc.php] kiểm tra mật khẩu không cần màn hình đăng nhập.
Đổi địa chỉ đăng nhập thì [wp-login.php] và /wp-admin/ trả về 404, nhưng [xmlrpc.php] vẫn trả lời tên người dùng và mật khẩu có đúng hay không.
Tắt cả XML-RPC thì yêu cầu đăng nhập vào [xmlrpc.php] kết thúc bằng câu trả lời rằng dịch vụ XML-RPC đã bị vô hiệu, nên không thể thử mật khẩu ở địa chỉ ai cũng biết.

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.

🧭 Giới hạn số lần đăng nhập và xác thực hai bước
Sơ đồ giải thích
⬜ Không có plugin
🛡️ Plugin bảo mật
🔑 Đăng nhập từ cùng IP
Lần 1Sai mật khẩu
Lại màn hình đăng nhậpCòn 3 lần
Lần 2Sai mật khẩu
Lại màn hình đăng nhậpCòn 2 lần
Lần 3Sai mật khẩu
Lại màn hình đăng nhậpCòn 1 lần
Lần 4Sai mật khẩu
Lại màn hình đăng nhậpChặn 20 phút
Lần 5Đang bị chặnSai mật khẩuYêu cầu đăng nhập · XML-RPC
Lại màn hình đăng nhậpxmlrpc.php cũng 403
Nhập mật khẩuĐúng mật khẩu
Màn hình nhập mã
Authentication Code6 chữ số từ ứng dụng xác thực · đổi mỗi 30 giây
Màn hình quản trị
Kẻ tấn công chỉ biết mật khẩuKhông biết mã
Dừng ở màn hình mã
Đo trên site thử nghiệm · yêu cầu liên tiếp từ cùng IP
→
🤖 Tấn công tự động
Có thử mật khẩu liên tục được không?
Không giới hạn
Bị chặn ở lần 4
Dừng ở mã
Không có plugin thì dù nhập sai mật khẩu sáu lần từ cùng IP, màn hình đăng nhập cũ vẫn mở lại mỗi lần.
Bật giới hạn số lần đăng nhập thì mỗi lần sai sẽ hiện số lần còn lại, và sai lần thứ 4 thì IP đó không đăng nhập được trong 20 phút. Trong lúc bị chặn, yêu cầu xmlrpc.php cũng kết thúc bằng 403.
Bật xác thực hai bước thì dù đúng mật khẩu, phải nhập [Authentication Code] 6 chữ số do ứng dụng xác thực tạo mới mỗi 30 giây thì màn hình quản trị mới mở.

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.

ℹ️ 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á.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 9   +   9   =