- Dấu hiệu nhận biết và nguyên nhân website bị hack
- Lời nói đầu: Xử lý website bị hack
- Phục hồi website bị hack
- Bảo mật website sau khi bị hack
- Tăng cường bảo mật website
Website sau khi bị hack các bạn đã tiến hành phục hồi để chạy trở lại thì vẫn chưa hẳn đã an toàn vì có thể bạn vẫn để những lỗ hổng bảo mật, các thông tin đã bị khai thác từ lần trước mà bị lại. Làm theo những điều bên dưới để giảm thiểu tới thấp nhất:
Mục lục
- 1. Cập nhật core, theme, plugins
- 2. Cài đặt plugins có bản quyền, không xài bản null
- 3. Đặt mật khẩu mạnh
- 4. Đổi chuỗi bảo mật
- 5. Thay đổi table prefix
- 6. Phân quyền lại các file và thư mục
- 7. Chặn việc xem index file
- 8. Chặn xml-rpc.php
- 9. Chặn edit file trên giao diện admin
- 10. Chặn cài themes, plugins
- 11. Xóa hết các file php trong wp-content/uploads
- 12. Chép đè .htaccess cũ
- 13. Chặn truy cập wp-admin, wp-login
- 14. Thường xuyên tạo bản backup
- Kết luận
1. Cập nhật core, theme, plugins
Tiến hành cập nhật phần core wordpress, các plugins, themes lên bản mới nhất. Để được sử dụng các code mới, các lỗi bảo mật tồn tại trên code cũ nếu có.
Thường xuyên đọc tin tức về các lỗi bảo mật wordpress để từ đó mà update kịp thời các lỗi nếu có.
2. Cài đặt plugins có bản quyền, không xài bản null
Tránh cài các plugins, themes không rõ nguồn gốc, các bản null vì dễ dính virus, shell đính kèm. Trường hợp không tìm được bản chính thì có thể quét source, và xem các file để xem có sạch không.
3. Đặt mật khẩu mạnh
Đặt mật khẩu mạnh, gồm nhiều loại kí tự kết hợp, không xài các mật khẩu dễ đoán hoặc quá đơn giản. Ngoài ra còn có thể kèm thêm:
- Đổi đường dẫn đăng nhập
- Giới hạn số lần đăng nhập sai
- Đặt captcha để tránh các tool quét mật khẩu
- Chặn xml_rpc bằng cách xóa đi, hoặc cài đặt firewall
4. Đổi chuỗi bảo mật
Salt là chuỗi mà wordpress sử dụng để mã hóa khi người dùng đăng nhập, một khi chuỗi bị đổi bạn sẽ bị đăng xuất ra. Việc đổi salt đảm bảo chuỗi mã hóa cũ bị tấn công không còn sử dụng được nữa. Xem thêm về Salt: https://kinsta.com/knowledgebase/wordpress-salts/
Có thể dùng plugins hay truy cập vào, link bên dưới để lấy chuỗi mới sử dụng thay thế trong file wp-config.php
https://api.wordpress.org/secret-key/1.1/salt/
5. Thay đổi table prefix
Thay đổi table prefix để tránh trường hợp nếu như hacker biết được prefix có thể dựa vào đó call SQL. Làm theo hướng dẫn sau để thay đổi:
https://help.one.com/hc/en-us/articles/360002107438-Change-the-table-prefix-for-WordPress-
Quá trình gồm 3 bước:
- Đổi table prefix trong wp-config.php
- Đổi tên table trong phpmyadmin
- Cập nhật các config tên table cũ sang table mới.
6. Phân quyền lại các file và thư mục
Việc phân quyền lại file và thư mục nhằm đảm bảo file hay folder bị truy cập trái phép. Thường thì phân quyền trên linux sẽ là 755
cho folder, 644
cho file. Với một số file như wp-config.php bạn nên đặt quyền 444, 440, 400
.
Thường thì các website bị hack sau khi fix xong, bạn nên kiểm tra lại 1 lần phân quyền và owner user, owner group.
7. Chặn việc xem index file
Chặn việc truy cập dạng index file, ngăn chặn việc xem được cấu trúc file và file thực thi.
Với .htaccess (Apache sever)
Thêm options Options -Indexes
vào .htaccess.
Với nginx config
Thêm vào file nginx config đoạn mã sau:
server { location / { autoindex on; } }
Xem thêm ở: https://preventdirectaccess.com/docs/disable-directory-listing/
8. Chặn xml-rpc.php
xml-rpc.php cho phép bên ngoài gọi vào thực thi một số hành động, tiện dụng nhưng lại khá kém bảo mật nên thường dễ bị các hacker sử dụng để tấn công vào, ví dụ như dò mật khẩu. Vì vậy thường thì sẽ đổi tên, xóa file này đi hoặc chặn truy cập từ bên ngoài bằng firewall hay cho phép một số bên truy cập mà thôi.
Việc xóa xml-rpc.php thì khá dễ, chặn xml-rpc.php thì có thể cài một số plugins. Thường thì mình sẽ không chặn, vì có cài plugins Jetpack, nó cần truy cập vào file này nên mình sẽ cấu hình firewall cho nó:
Ở sever chứa website thường là apache thì chúng ta sẽ cấu hình trên .htaccess, nginx config với websever chạy nginx, kết hợp kèm với firewall.
Xem thêm:
- https://esc.sh/blog/how-to-block-xmlrpc-and-allow-only-jetpack/
- https://jetpack.com/support/how-to-add-jetpack-ips-allowlist/
Tương tự cấu hình mở access cho dãy IP trên cloudflare.
9. Chặn edit file trên giao diện admin
Thêm define('DISALLOW_FILE_EDIT',true);
vào wp-config.php
10. Chặn cài themes, plugins
Thêm define('DISALLOW_FILE_MODS',true);
vào wp-config.php, disable khi muốn cài plugins hay themes.
11. Xóa hết các file php trong wp-content/uploads
Thường thì folder wp-content/uploads
sẽ không chứa file php, trừ một số ngoại lệ một số file do các plugins editor v.v. tạo ra. Đối với các folder khác, ngoại trừ file index.php chứa đoạn code:
<?php // Silence is golden.
Các file còn lại các bạn nên xóa hết đi để tránh việc có file php bị uploads lên còn sót lại.
Đối với linux bạn có thể dùng đoạn code sau để xóa:
find /wp-content/uploads/{folder name nghi ngờ} -type f -name "*.php" -delete
Cẩn thận hơn thì các bạn bỏ -delete
để xem list file php trước khi thựuc hiện xóa.
12. Chép đè .htaccess cũ
Một vấn đề hay gặp là .htaccess sẽ bị đè lên những nội dung mới cho phép chạy file php, các loại file khác trong thư mục. Vì vậy để an toàn bạn nên chép đè lại nội dung file .htaccess này.
.htaccess trên root folder
Đối với .htaccess trên root folder mình đã soạn sẵn nội dung sau, chỉ cần chép đè là được:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # Blocks all wp-includes folders and files <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule> # Blocks some XSS attacks <IfModule mod_rewrite.c> RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR] RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) RewriteRule .* index.php [F,L] </IfModule> <IfModule mod_rewrite.c> RewriteEngine On # Disable PHP in Uploads - Security > Settings > System Tweaks > PHP in Uploads RewriteRule ^wp\-content/uploads/.*\.(?:php[1-7]?|pht|phtml?|phps|js)$ - [NC,F] # Disable PHP in Plugins - Security > Settings > System Tweaks > PHP in Plugins RewriteRule ^wp\-content/plugins/.*\.(?:php[1-7]?|pht|phtml?|phps)$ - [NC,F] # Disable PHP in Themes - Security > Settings > System Tweaks > PHP in Themes RewriteRule ^wp\-content/themes/.*\.(?:php[1-7]?|pht|phtml?|phps)$ - [NC,F] </IfModule> # Bock access xmlrpc.php <Files xmlrpc.php> Order deny,allow Deny from all </Files> # Bock access wp-config.php <Files wp-config.php> Order deny,allow Deny from all </Files> # Bock access license.txt <Files license.txt> Order deny,allow Deny from all </Files> # Bock access readme.html <Files readme.html> Order deny,allow Deny from all </Files> # Bock access .htaccess <files ~ "^.*\.([Hh][Tt][Aa])"> order allow,deny deny from all satisfy all </files> Options -Indexes
Đối với .htaccess trong wp-content/uploads với các folder file được uploads lên mình sẽ dùng một file .htaccess mới, dùng bash để chép đè:
<FilesMatch ".(php)$"> Order deny,allow Deny from all </FilesMatch>
Sau đó dùng bash sau:
#!/bin/bash for file in $( find /home/{domain}/public_html/wp-content/uploads -name .htaccess); do cp -r /home/{domain}/public_html/wp-content/temp/.htaccess "$file" done
Với /home/{domain}/public_html/wp-content/temp/.htaccess
là đường dẫn file .htaccess cần chép đè.
13. Chặn truy cập wp-admin, wp-login
Thường thì chúng ta sẽ chặn việc người ngoài truy cập vào wp-admin.php hay wp-login.php bằng cách:
- Đổi đường dẫn truy cập, bằng cách cài một số plugins
- Chặn truy cập vào các đường dẫn trên bằng .htaccess chức năng sử dụng thêm 1 lớp mật khẩu bên ngoài.
- Chặn truy cập bằng firewall chỉ cho phép 1 số IP truy cập.
- Cài captcha + giới hạn số lần đăng nhập sai để tránh việc dò mật khẩu.
14. Thường xuyên tạo bản backup
Thường xuyên tạo bản backup để đảm bảo rằng nếu có vấn đề xảy ra có thể phục hồi lại bản trước đó, tránh cho website bị gián đoạn. Có nhiều các để backup:
- VPS backup, chỉ tác động với nhà cung cấp VPS cho bạn, mua gói backup theo ngày, theo tuần, theo tháng tương ứng.
- Websever backup, kiểu backup này sẽ dùng chức năng backup trong websevices, bằng cron job hoặc bằng tay thường thì backup sẽ gồm source, database, config.
- Backup bằng script bash trên vps, loại này các bạn sẽ viết một bash trên linux tiến hành export db, nén source và tạo file backup hoặc uploads sang không gian lưu trữ khác.
- Backup bằng các plugins trên wordpress
Đó là một vài kiểu backup, các bạn nên sử dụng ít nhất một loại để đảm bảo an toàn dữ liệu.
Một cách nữa là sử dụng git
như một bản backup ghi lại version cho source code của bạn để khi dính shell có thể so sánh lại mã nguồn từ đó việc khắc phục dễ dàng hơn rất nhiều. Đồng thời các bạn có thể sử dụng thêm các tool CI/CD như Jenkins, Gitlab CI/CD … để mọi thứ linh hoạt hơn.
Kết luận
Đây là tất cả những gì mình trải nghiệm, ghi lại để giảm thời gian cho mọi người tham khảo làm theo nhằm giải quyết nhanh hơn.