Allgrow-labo Wordpress Site Security Guideline
Mở đầu
Phần đầu tiên sẽ nói về Rủi ro bảo mật của Wordpress. Tiếp theo đó sẽ là Biện pháp bảo mật khi tạo site Wordpress và Biện pháp bảo mật khi vận hành site Wordpress.
Site Wordpress do công ty chúng tôi tạo và vận hành luôn tuân thủ nghiêm ngặt việc thực hiện các biện pháp bảo mật được mô tả trong tài liệu này.
Nội dung của biện pháp bảo mật trong tài liệu này được giới hạn trong biện pháp bảo mật về Wordpress.
Các phương án bảo mật khác, ví dụ như các thiết bị được sử dụng, mạng được kết nối, Linux, PHP, Apache, MySQL, v.v. không thuộc phạm vi các biện pháp bảo mật được mô tả trong tài liệu này.
Biện pháp bảo mật trong tài liệu này giả định cho site Wordpress được tạo - vận hành bằng các phương pháp thông thường. Do đó, tuy là có trường hợp không thể áp dụng nguyên xi cho site Wordpress đã được customize, nhưng vì tài liệu này dùng cho mục đích tham khảo khi chia sẻ thông tin về các rủi ro bảo mật và thực hiện các biện pháp bảo mật cho site Wordpress nên những site Wordpress đã được customize cũng có các rủi ro bảo mật tương tự và cần được thực hiện các biện pháp bảo mật.
Rủi ro bảo mật của Wordpress
Wordpress là CMS mã nguồn mở đang được sử dụng trên toàn thế giới. Theo như điều tra của W3Techs thì ở thời điểm tháng 8 năm 2022 thì tỷ lệ của Wordpress trong CMS là 64.2%.
Tỷ lệ có sự chênh lệch rất lớn so với CMS xếp vị trí thứ 2, điều này cho thấy nó được rất nhiều người trên thế giới sử dụng.
Nhìn từ góc độ của hacker, nếu nhắm đến hệ thống có nhiều người sử dụng thì khả năng hack thành công sẽ cao hơn. Nếu hacker có thể phát hiện 1 lỗ hổng trong Wordpress (điểm yếu trong hệ thống) thì có thể nhắm mục tiêu đến nhiều Website sử dụng Wordpress và tiến hành hack một cách hiệu quả.
Do đó, Wordpress dễ trở thành mục tiêu của các hacker. Hơn nữa, Wordpress là mã nguồn mở được công khai code để tất cả developer trên toàn thế giới sử dụng.
Không chỉ developer mà cả hacker cũng có thể xem được code, nên có thể dễ phát hiện ra lỗ hổng và suy nghĩ các biện pháp phá vỡ bảo mật hơn.
👉 Nguồn trích dẫn:https://lucy.ne.jp/bazubu/wordpress-security-2-23873.html
Biện pháp bảo mật khi tạo site Wordpress
1. Hạn chế địa chỉ IP có thể truy cập vào URL login
Trường hợp biết trước địa chỉ IP mà user dùng màn hình admin đang sử dụng, bạn có thể ngăn chặn truy cập trái phép bằng cách giới hạn truy cập theo địa chỉ IP.
Phương pháp sử dụng apache
Bố trí file .htaccess như bên dưới vào directory có URL login của Wordpress mặc định, chỉ định địa chỉ IP được cấp phép.
<Files "wp-login.php">
Order Deny,Allow
Deny from All
Allow from xxx.xxx.xxx.xxx
</Files>
Phương pháp sử dụng PHP
Trường hợp quản lý Wordpress bằng tool, ví dụ như composer,... thì không thể bố trí .htaccess trong core file của Wordpress được nên sẽ tiến hành hạn chế IP bằng PHP
add_action('login_form', function () {
if (!in_array($_SERVER["REMOTE_ADDR"], ['xxx.xxx.xxx.xxx'])) {
wp_safe_redirect(home_url());
exit;
}
}, 10);
2. Thay đổi URL login
Phương pháp sử dụng plugin
2 plugin bên dưới thường được sử dụng và chúng cũng được cập nhật thường xuyên.
Phương pháp không sử dụng plugin
Mô tả Sample code cho trường hợp thay đổi thành URL login bên dưới.
https://some-wordpress-site.com/company-login-1234.php
Thêm phần sau vào file company-login-1234.php như bên dưới.
File này load wp-login.php và core file của Wordpress được load từ wp-login.php nên hằng số của LOGIN_CHANGE sẽ được phản ánh
<?php
define('LOGIN_CHANGE', sha1( 'keyword' ));
require_once './wp-login.php';
Tiếp theo, trường hợp phát triển theme của Wordpress thì mô tả nội dung bên dưới vào functions.php.
Trường hợp có truy cập từ wp-login.php bằng add_action đến login_init thì do LOGIN_CHANGE hằng số không tồn tại nên sẽ bị redirect.
Ngoài ra, có thể thay đổi nội dung Wordpress xử lý dưới dạng wp-login.php thành page login cá nhân bằng cách áp dụng filter cho site_url, wp_redirect
$login_page = 'company-login-1234.php';
add_action( 'login_init', function () {
if ( !defined('LOGIN_CHANGE') || sha1('keyword') !== LOGIN_CHANGE ) {
wp_safe_redirect( home_url() );
exit;
}
});
add_filter('site_url', function ($url, $path,) {
if ($path == 'wp-login.php' &&
(is_user_logged_in() || strpos( $_SERVER['REQUEST_URI'], $login_page ) !== false)
) {
$url = str_replace( 'wp-login.php', $login_page, $url );
return $url;
}
}
, 10, 2);
add_filter('wp_redirect', function login_change_wp_redirect( $location, $status ) {
if (strpos( $_SERVER['REQUEST_URI'], $login_page ) !== false) {
$location = str_replace( 'wp-login.php', $login_page, $location );
return $location;
}
}, 10, 2);
3. Thiết lập tên user và password khó đoán
Về tên user
Tên user khởi tạo thường xuyên được sử dụng mặc định là admin thì khá là dễ đoán, vậy nên cần thay đổi.
Về password
Brute-force attack được sử dụng như là một cách phá password của Wordpress.
Password 6 ký tự bao gồm chữ cái la tinh, chữ in hoa, chữ in thường sẽ bị phá giải trong khoảng 5 ngày. Tuy nhiên, nếu tăng số lượng ký tự lên 10 thì cần tới 10 triệu năm. Tóm lại, có thể chống bị hack chỉ bằng cách thay đổi password thành từ 10 ký tự trở lên, bao gồm cả chữ cái la tinh, chữ in hoa, chữ in thường.
Do đó, nếu được thì nên set password 10 ký tự trở lên bao gồm chữ cái la tinh, chữ in hoa, chữ in thường.
Ngoài ra, dù có password mạnh nhưng nếu có phát sinh rò rỉ thông tin thì hacker vẫn có thể sử dụng password đó. Vậy nên hãy thay đổi password định kỳ.
4. Thiết lập permission thích hợp - xóa file không cần thiết
Về permission
Wordpress về cơ bản thiết lập permission như sau:
| Tên file | Permission |
|---|---|
| .htaccess | 644 |
| wp-config.php | 600 or 400 |
| directory | 755 or 705 |
| file | 644 or 604 |
| | |
| Dưới đây là ví dụ thao tác hàng loạt bằng command line | |
| |
$ find /var/www/html -type f -print | xargs chmod 664
$ find /var/www/html -type d -print | xargs chmod 775
Về xóa file
Sau đó, cần xóa file không cần thiết cho việc hiển thị site
- readme.html (có thông tin version Wordpress)
- license.txt (có thông tin version Wordpress)
- wp-config-sample.php (khi kết nối thì bị error)
- install.php (file không cần thiết sau khi đã install Wordpress)
5. Xử lý thích hợp đối với file wp-config.php
Viết code như bên dưới vào .htaccess để hạn chế truy cập đến wp-config.php.
Ngoài ra, hãy thiết lập permission phù hợp, 400 là chỉ để admin mới có thể truy cập.
<Files wp-config.php>
Order Deny,Allow
Deny from All
</files>
Ngoài ra, việc bố trí file wp-config.php ở ngoài phạm vi công khai của website giống như Bedrock của roots.io thì cũng có hiệu quả.
6. Hạn chế sử dụng plugin
Wordpress Plugin có ưu điểm là dù không có nhiều kinh nghiệm vẫn có thể dễ dàng sử dụng, nhưng nó sẽ làm giảm performance của site xuống, và tùy theo trường hợp có khả năng dẫn đến lỗ hổng bảo mật. Trường hợp cần sử dụng plugin để tạo site Wordpress thì cần cân nhắc thực hiện các bước sau:
- Cân nhắc xem có thật sự cần plugin hay không (Nếu là nội dung có thể tự code được thì nên tự code, người code sẽ có thể nắm rõ các rủi ro).
- Trường hợp sử dụng plugin thì kiểm tra site công khai của plugin, nếu plugin không được update từ 1 năm trở lên thì không sử dụng.
- Sử dụng Database thông tin biện pháp chống lỗ hổng bảo mật để kiểm tra xem plugin muốn sử dụng có lỗ hổng bảo mật hay không。
7. Ẩn thông tin version Wordpress
Có thể phòng tránh việc hacker xác định version Wordpress bằng cách ẩn version đi. Viết code bên dưới vào functions.php
remove_action('wp_head','wp_generator');
8. Vô hiệu hóa PHP XML parser (trình phân tích cú pháp)
Viết code bên dưới vào .htaccess để hạn chế truy cập đến xmlrpc.php
<Files xmlrpc.php>
Order Deny,Allow
Deny from All
</Files>
Security note trên website chính thức của Wordpress
Ở link bên trên có viết là vấn đề này đã được giải quyết ở WordPress 3.9.2 nhưng vẫn nên tạo thói quen làm điều này. Nhất là những trường hợp version Wordpress cũ hơn 3.9.2 thì bắt buộc phải thực hiện.
9. Ngăn chặn việc tên user bị đoán
Khi truy cập vào URL bên dưới thì có thể xác định được tên user đang sử dụng trong Wordpress (chỉ cần thử theo thứ tự từ 1 trở đi là có thể xác định tất cả user). Nếu không thực hiện các biện pháp bảo mật có hiệu quả đối với màn hình admin, khi tên người dùng được xác định, nguy cơ bị hacker tấn công sẽ tăng lên vì chỉ cần xác định mật khẩu nữa thôi.
https://some-wordpress-site.com?author=1
Do Wordpress tự động tạo author archive nên nếu page author archive không cần thiết thì viết vào function.php như bên dưới để inactive page author archive.
add_filter( 'author_rewrite_rules', '__return_empty_array' );
Trường hợp có sử dụng page author archive, khi URL (ví dụ: ?author=1 ) như đã được input thì cần thực hiện xử lý redirect với status 404 để tránh tiết lộ rằng đó là tên người dùng đang được sử dụng trong Wordpress.
add_action('init', function () {
if( preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING']) ){
wp_safe_redirect(home_url('/404.php'));
exit;
}
});
Ngoài ra, cũng có thể lấy thông tin user từ REST API (có thể truy cập từ URL của /wp-json/wp/v2/users). Nếu URL này cũng không cần thiết thì nên edit như bên dưới để không thể sử dụng nó được nữa.
add_filter('rest_endpoints', function ($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P[\d]+)']);
}
return $endpoints;
}, 10, 1);
10. Quản lý user bằng cách phân chia user role
Trường hợp page author archive được active và tồn tại nhiều user thì sẽ có thể truy cập vào page author archive của user administrator và editor có quyền hạn cao. Trường hợp này, nên hạn chế user role được sử dụng ở page author archive sao cho không hiển thị user có quyền hạn cao.
define('ROLES_THAT_CAN_DISPLAY_AUTHOR_ARCHIVES', [
'author',
]);
define('USER_NAMES_THAT_CAN_DISPLAY_AUTHOR_ARCHIVES', [
'user01',
]);
function can_display_user($user)
{
return in_array($user->user_login, USER_NAMES_THAT_CAN_DISPLAY_AUTHOR_ARCHIVES, true)
|| count(array_diff(ROLES_THAT_CAN_DISPLAY_AUTHOR_ARCHIVES, $user->roles)) < count(ROLES_THAT_CAN_DISPLAY_AUTHOR_ARCHIVES);
}
add_action('template_redirect', function () {
if (!is_author()) {
return;
}
$user = get_queried_object();
if (can_display_user($user)) {
return;
}
wp_safe_redirect(home_url('/404.php'));
exit;
});
Biện pháp bảo mật khi vận hành site Wordpress
1. Thực hiện backup Database định kỳ
Trường hợp có thể thao tác bằng command line thì có thể lấy backup của Database bằng command
$ mysqldump -u [user_name] -p [database] > [backup_file_name.sql]
Có thể thực hiện backup Database bằng cách chạy cái này định kỳ bằng cron chẳng hạn.
Trường hợp không thể thao tác bằng command line thì có thể lấy backup của Database từ màn hình admin bằng cách sử dụng plugin BackWPup.
Dù trong trường hợp nào đi nữa thì nơi lưu backup phải là server khác chứ không phải trong cùng server đang chứa site.
2. Source code được quản lý bằng quản lý version
Source code được quản lý bằng cách sử dụng tool quản lý version, nên có thể quản lý được lịch sử thay đổi của source code. Trường hợp source code bị cải biến do có access bất chính thì vẫn có thể xác định được nội dung access bất chính bằng cách kiểm tra lịch sử thay đổi.
git status
3. Bảo đảm Wordpress ở trạng thái mới nhất
Khi kiểm tra Security sheet trên website chính thức của Wordpress thì sẽ hiểu được là: Trong core development của Wordpress đang chạy minor update để fix lỗ hổng security và chạy major update để thêm tính năng mới. (Nếu có bất kỳ security update nào thì sẽ được thông báo trên Thông tin security trên website chính thức của Wordpress).
Về việc cài đặt update tự động của Wordpress
Wordpress chính thức khuyến khích việc cài đặt update tự động cho toàn bộ các site Wordpress và việc cài đặt update tự động cho core file đang là cài đặt mặc định.
Tác hại của việc cài đặt update tự động là các xử lý mà đang dùng trong theme và plugin có khả năng sẽ không thể xử lý chính xác được nữa ở 1 thời điểm nào đó sau khi chạy update tự động xong. Nếu theme và plugin của bạn đang thực hiện xử lý phức tạp và bạn quan ngại về nguy cơ phát sinh vấn đề từ việc update tự động, bạn cũng có thể vô hiệu hóa việc update tự động trong Wordpress bằng code bên dưới.
define('WP_AUTO_UPDATE_CORE', false);
Trong những trường hợp cần phải cân bằng giữa nguy cơ phát sinh lỗi hoạt động của theme hoặc plugin và việc đối phó với nguy cơ bảo mật đến từ việc update Wordpress, mình còn 1 sự lựa chọn nữa là cài đặt chỉ cho phép minor update mà thôi.
define('WP_AUTO_UPDATE_CORE', 'minor');
Trường hợp project có Wordpress version đang được quản lý bằng composer, nếu mình kích hoạt cài đặt update tự động của Wordpress thì sẽ xuất hiện chênh lệch giữa version quản lý bằng composer và version thực tế. Đây là tình huống không nên có. Vì vậy, tốt hơn hết là hãy dùng github dependabot để lấy thông tin update của Wordpress và cài đặt sao cho update version của composer.json.
Vì cách thức xử lý sẽ khác nhau tùy theo tính chất của project, nên hãy cân nhắc tính chất của project trước rồi mới tiến hành xử lý theo mức độ ưu tiên như bên dưới.
- Tiến hành cài đặt update tự động (Dùng kết hợp github dependabot, github-action cũng được)
- Chỉ cài đặt update tự động với minor update mà thôi, còn major update thì thực hiện thủ công
- Không cài đặt update tự động mà hãy kiểm tra release note rồi tiến hành update thủ công.
4. Bảo đảm Plugin ở trạng thái mới nhất - Xóa đi những những cái không sử dụng
Về việc xóa plugin
Nếu không sử dụng plugin, việc xóa plugin từ màn hình quản lý Wordpress sẽ làm giảm nguy cơ bảo mật kém. Những plugin nào đã không sử dụng từ 1 tháng trở lên thì xóa đi.
Về cách cài đặt cập nhật tự động cho Wordpress Plugin
Plugin được phát triển bởi những developer khác không phải core development của Wordpress, nên plugin sẽ được update ở những thời điểm khác với core development của Wordpress.
Wordpress chính thức cũng hay khuyến khích cài đặt sẵn update tự động cho plugin, theme, file dịch và cài đặt update tự động đang là cài đặt mặc định.
Plugin và Theme không thể định nghĩa được việc dừng update tự động, nhưng code dưới đây có thể vô hiệu hóa toàn bộ update tự động (bao gồm cả cài đặt update tự động của core file).
define( 'AUTOMATIC_UPDATER_DISABLED', true );
Phương châm của việc update plugin cũng tương tự với việc update core file của Wordpress. Nếu không áp dụng cập nhật tự động vào plugin và theme, hãy lưu ý đến những khả năng phát sinh nguy cơ về bảo mật trong tương lai khi vận hành site
- Tiến hành cài đặt update tự động (dùng kết hợp github dependabot, github-action cũng được).
- Không tiến hành cài đặt update tự động, mà thay vào đó sẽ check release note và tiến hành update thủ công.
Tài liệu tham khảo:
OWASP Wordpress Security Implementation Guideline
Security note (Wordpress official):
- https://wordpress.org/about/security/
- https://ja.wordpress.org/about/security/
- https://wordpress.org/documentation/article/configuring-automatic-background-updates/
OWASP Top 10 2021:
- https://www.synopsys.com/glossary/what-is-owasp-top-10.html
- https://www.synopsys.com/ja-jp/glossary/what-is-owasp-top-10.html
wpscan.com
Khác