Thi thoảng mình nhận được một số câu hỏi từ anh em, bạn bè về việc bảo mật website WordPress hoặc thậm chí là người quen của mình bị hack website WordPress và họ nhờ mình xử lý. Web thì đa dạng từ tin tức cho đến bán hàng, giới thiệu doanh nghiệp ….
Các hình thức hack website thì cũng vô vàn, từ việc bị chèn post (bài viết) để lấy backlink cho đến việc bị redirect sang website khác hoặc bị thay đổi nội dung trên web …
Thông thường, sau khi xử lý sự cố thì mình cũng chia sẻ với các bạn ấy một số kinh nghiệm để bảo mật website WordPress. Nhân tiện đây tổng hợp và chia sẻ lại với các bạn độc giả của vpsvietnam.com
Website WordPress có an toàn không?
Thực ra là có và không. Website nào cũng vậy, nó phụ thuộc vào người code và người quản trị khá nhiều. Bản thân WordPress không có tội, những lỗ hổng ở website phần lớn do ông code không cẩn thận hoặc do sử dụng các plugin/theme trôi nổi trên mạng đã bị chèn backdoor/shell. Một góc khác đến từ người quản trị như không đặt các mật khẩu phức tạp hoặc không thường xuyên cập nhật các bản update mới của Wordpres hay theme/plugin.
Kinh nghiệm bảo mật website WordPress
1. Đặt mật khẩu phức tạp
Mình thấy, 99.999% website WP bị chèn các bài post linh tinh là do admin đặt mật khẩu quá đơn giản. Một số lưu ý với trường hợp này
Không nên đặt user với tên phổ biến như admin, administrator … Hãy đặt theo tên cá nhân hoặc nickname riêng của bạn. Ví dụ: haodeptrai
Không đặt mật khẩu đơn giản kiểu 123456a@ … Hãy sử dụng mật khẩu phức tạp với chữ cái thường, chữ viết HOA, số và ký tự đặc biệt. Hoặc làm như mình đây, mật khẩu random, mình không thể nhớ nổi vì nó không có quy tắc gì cả ^_^
2. Khóa update plugin và theme
Đây là việc cần làm tiếp theo, đơn giản là mở wp-config.php lên và thêm vào 2 dòng này
define('DISALLOW_FILE_EDIT', true); define('DISALLOW_FILE_MODS', true);
Sau khi thêm lệnh này, bạn sẽ không cài plugin hoặc sửa theme được. Khi nào muốn cài mới plugin hoặc sửa file thì bạn phải tắt nó đi bằng cách thêm // ở đầu. Dĩ nhiên với cách này, bạn vẫn có thể thêm/sửa file/plugin qua FTP được bình thường, chỉ không sửa trực tiếp trên web được thôi.
3. Tắt XML-RPC
XML-RPC là sử dụng giao thức WebService (soap) dùng XML để mã hóa và trao đổi dữ liệu (Remote Procedure Call XML) và có thể hỗ trợ các API của các CMS như WordPress API, Blogger API, Movable API, Pingback API, MetaWeblog API. Vì WordPress không phải là hệ thống đóng hoàn toàn nên tính năng này được tạo ra để khi WordPress cần giao tiếp với các hệ thống bên ngoài. Ví dụ, khi người dùng muốn chỉnh sửa hoặc đăng tải một bài viết lên WordPress không bằng máy tính mà thông qua điện thoại. Khi đó, XML-RPC sẽ kích hoạt trạng thái liên kết giữa máy tính và điện thoại, cho phép người dùng thực hiện các chỉnh sửa.
Tuy nhiên hiện tại XML-RPC là không cần thiết, các hacker có thể lợi dụng giao thức này để chèn nội dung vào website hoặc thậm chí lấy quyền admin. Để đảm bảo an toàn bạn nên tắt nó đi.
Có nhiều cách để tắt XML-RPC trên WordPress như dùng Plugin hoặc tắt từ web server. Mình hay chọn cách thứ 2, tắt từ web server. Hướng dẫn dưới đây cho NGINX và Apache
Tắt XML-RPC trên Nginx
Bạn thêm đoạn code sau vào file config của domain
location = /xmlrpc.php { deny all; access_log off; log_not_found off; }
Tắt XML-RPC trên Apache
Với Apache, bạn thêm đoạn code sau vào .htaccess của domain
# DISABLE XML RPC <Files xmlrpc.php> Order Deny,Allow Deny from all </Files> #END
4. Đổi link đăng nhập admin
Mình thì không hay làm cái này lắm, nhưng thấy anh em bạn bè cũng hay làm. Đơn giản là dùng plugin WPS Hide Login thôi. Cài xong bạn sửa nó đi là được, cũng là 1 cách để mấy anh tò mò đỡ đi dò dẫm link đăng nhập
5. Tắt thông báo update Plugin
Cái này nó không liên quan lắm đến bảo mật website wordpress, nhưng đôi khi mình khá khó chịu với cái thông báo này nên cần thì có thể tắt nó đi. Như thường lệ, thêm đoạn code sau vào function.php của theme.
// Disable Update Notifications function hide_update_notice_to_all_but_admin_users() { if (!current_user_can('update_core')) { remove_action( 'admin_notices', 'update_nag', 3 ); } } add_action( 'admin_head', 'hide_update_notice_to_all_but_admin_users', 1 ); function remove_core_updates(){ global $wp_version;return(object) array('last_checked'=> time(),'version_checked'=> $wp_version,); } add_filter('pre_site_transient_update_core','remove_core_updates'); add_filter('pre_site_transient_update_plugins','remove_core_updates'); add_filter('pre_site_transient_update_themes','remove_core_updates');
Sau khi thêm vào, bạn sẽ không thấy cái thông báo update như dưới đây nữa
6. Tắt thông báo của admin
Cái này cũng không liên quan đến bảo mật, chỉ là nhìn ngứa mắt thôi
Đoạn code dưới đây sẽ ẩn các thông báo này đi. Bạn cũng thêm vào function.php nhé
//Disable Admin Notices function pr_disable_admin_notices() { global $wp_filter; if ( is_user_admin() ) { if ( isset( $wp_filter['user_admin_notices'] ) ) { unset( $wp_filter['user_admin_notices'] ); } } elseif ( isset( $wp_filter['admin_notices'] ) ) { unset( $wp_filter['admin_notices'] ); } if ( isset( $wp_filter['all_admin_notices'] ) ) { unset( $wp_filter['all_admin_notices'] ); } } add_action( 'admin_print_scripts', 'pr_disable_admin_notices' ); add_action( 'admin_menu', 'remove_menus', 999 );
7. Ẩn bớt các menu không cần thiết
Tiếp tục là 1 mục không liên quan đến bảo mật mà chỉ là tinh chỉnh wp-admin nhìn cho gọn gàng
// Xoa menu add_action( 'admin_menu', 'remove_menus', 999 ); function remove_menus() { global $menu; global $submenu; // echo '<pre>'; // print_r($menu); // print_r($submenu); // echo '</pre>'; // If you're not the site creator // Hide some menus unset($menu[25]); // Removes 'Comments'. unset($menu[65]); // Removes 'Plugins'. // unset($menu[75]); // Removes 'Tools'. unset($submenu['index.php'][10]); // Removes 'Updates'. unset($submenu['themes.php'][11]); // Removes 'Editor'. //WPML unset($submenu['sitepress-multilingual-cms/menu/languages.php'][0]); unset($submenu['sitepress-multilingual-cms/menu/languages.php'][1]); unset($submenu['sitepress-multilingual-cms/menu/languages.php'][3]); unset($submenu['sitepress-multilingual-cms/menu/languages.php'][4]); unset($submenu['sitepress-multilingual-cms/menu/languages.php'][5]); unset($submenu['sitepress-multilingual-cms/menu/languages.php'][7]); unset($submenu['sitepress-multilingual-cms/menu/languages.php'][8]); unset($submenu['sitepress-multilingual-cms/menu/languages.php'][9]); unset($submenu['sitepress-multilingual-cms/menu/languages.php'][10]); remove_menu_page( 'edit.php?post_type=acf-field-group' ); // ACF }
Đoạn code trên ở trong function.php sẽ ẩn bớt các menu như Plugins, Comments, Tools hoặc menu liên quan WPML, ACF Field
8. Tìm một số ký tự trong các file PHP
Lệnh này được áp dụng khi bạn cần tìm một chuỗi ký tự, từ khóa nào đó trong các file .PHP nằm bên trong thư mục của wordpress. Thông thường, kẻ tấn công sẽ chèn các đoạn mã độc hại vào các file .php hoặc thậm chí là up các file .php lên thư mục code của wordpress. Chúng ta cần tìm xem có đoạn mã nào lạ hay không.
Ngoài ra, các đoạn mã này thường được mã hóa, nên chúng ta có thể dựa vào đó để tìm theo một số keyword như eval() assert() base64() gzdeflate() str_rot13()
Lệnh tìm kiếm sẽ là
grep -r --include=*.php "search string" /path/to/dir
9. Hiển thị các file mới được chỉnh sửa gần đây.
Nếu xác định được khoảng thời gian bị tấn công. Bạn có thể tìm kiếm trong khoảng thời gian đó để biết xem file nào đã bị chỉnh sửa qua lệnh sau
find ./ -type f -mtime -15