Xây dựng và bảo mật cho WordPress với OpenLiteSpeed và Cloudflare

Đối với những người sở hữu trang WordPress như mình, vấn đề về hiệu suất và bảo mật cho WordPress luôn được quan tâm hàng đầu. Bản thân mình khi lập trang blog này, dù đã xem rất nhiều lời khuyên trên Google nhưng cũng đã phải khổ sở cài đặt và cấu hình rất nhiều lần mới có được một combo ưng ý. Sau nhiều lần thử nghiệm, cuối cùng mình đã đúc kết được một số kinh nghiệm để có thể xây dựng được một trang WordPress ổn định về cả hiệu suất lẫn bảo mật.

Ngoài hiệu suất và bảo mật thì mình cũng có bài viết cách tối ưu SEO cho WordPress nhằm giúp trang WordPress được hiển thị trên các kết quả tìm kiếm.

Tại sao mình chọn OpenLiteSpeed?

Khi bắt đầu tạo trang web này, mình đã trực tiếp thử qua 2 web server phổ biến được nhiều người sử dụng là LEMP (Nginx với FastCGI Cache+W3 Total Cache) và OpenLiteSpeed+LiteSpeed Cache và mình kết luận OpenLiteSpeed+LiteSpeed Cache cho tốc độ nhanh nhất. Tốc độ của trang WordPress mình đã đo bằng PageSpeed Insights và máy chủ web OpenLiteSpeed kết hợp với LiteSpeed Cache đã cho kết quả khiến mình hài lòng nhất. Trong khi với LEMP mình chỉ đạt được điểm hiệu suất hơn 70 thì với OpenLiteSpeed mình đạt được gần 100 điểm hiệu suất.

Sử dụng Cloudflare để làm gi?

Ngoài tốc độ của máy chủ web thì việc bổ sung dịch vụ của Cloudflare cũng đã giúp mình tối ưu tốc độ truy cập của người dùng ở mọi nơi trên thế giới thông qua dịch vụ CDN (Content Delivery Network) khi mà hiện nay Cloudflare đều đã có máy chủ ở hầu hết mọi quốc gia. Hơn nữa, việc để Cloudflare quản lý tên miền của mình cũng đã giúp tăng cường tính bảo mật của máy chủ WordPress nhờ những tiện ích của tường lửa (firewall), chống tấn công DDoS hay tính năng ẩn địa chỉ IP thật của máy chủ server nhằm ngăn chặn sự xâm nhập của hacker.

1. Điều kiện tiên quyết

Để có thể thực hiện các bước bên dưới, yêu cầu phải thoả các điều kiện sau:

2. Quản lý và cấu hình tên miền với Cloudflare

Nếu trước đây bạn đã từng trỏ tên miền về server IP mà không sử dụng proxy thì nhiều khả năng IP máy chủ của bạn đã bị lộ. Do đó nếu bạn thực sự muốn giấu IP máy chủ thì mình khuyến cáo bạn nên chuyển hẳn qua 1 server mới với IP mới sau đó mới thực hiện bước này đầu tiên trước khi tiến hành cài đặt trang WordPress.

  • Tạo 2 “A record” để trỏ domain & www về IP của server. Lưu ý bật chế độ “Proxied” để ẩn IP. Sau bước này nếu bạn ping tên miền mà không thấy IP của server là đúng.
  • (Tùy chọn) Thiết lập Web Application Firewall (WAF) để chặn truy cập vào trang /xmlrpc.php của WordPress. Xmlrpc là một tính năng cho phép trang WordPress có thể giao tiếp với các nhà cung cấp dịch vụ khác. Tuy nhiên đây cũng là nơi mà các bot và hacker ưa thích khi hack trang WordPress của bạn. Nếu trang WordPress của bạn dùng các plugin có sử dụng dịch vụ này hoặc bạn dùng ứng dụng WordPress trên điện thoại để quản lý thì bạn có thể bỏ qua bước này.
  • Thay đổi thông số SSL/TLS thành Full
  • (Tùy chọn) Tạo “custom rule” trong WAF để ngăn bot truy cập vào trang “/wp-login.php” nhăm tìm cách hack tài khoản của trang web. Phần này mình chọn action là “Managed Challenge” bắt giải câu đố (kiểu như CAPTCHA) để chứng minh không phải là bot thì mới được đăng nhập.

3. Cài đặt OpenLiteSpeed+Wordpress trên máy chủ ảo (VPS)

Mình đã thử qua các nhà cung cấp VPS giá rẻ được nhiều người sử dụng nhất, từ Digital Ocean đến Vultr rồi Linode nhưng thấy dịch vụ ở Linode là ổn nhất. Server đặt tại Singapore nên có đường truyền đến Việt Nam khá nhanh, gói rẻ nhất $5/tháng xài CPU AMD EPYC có thể chạy tốt 1 trang WordPress với nhu cầu cơ bản.

Nếu bạn tạo server mới từ các nhà cung cấp VPS kể trên thì có thể tuỳ chọn “OpenLiteSpeed WordPress” từ “Marketplace” để không phải tốn công cài đật mà sẽ có ngay một trang WordPress hoàn chỉnh sau khi mua. Trường hợp bạn muốn tự cài đặt OpenLiteSpeed + WordPress lên máy chủ Linux đã có sẵn thì có thể sử dụng lệnh sau từ console:

$ wget https://raw.githubusercontent.com/litespeedtech/ols1clk/master/ols1clk.sh && bash ols1clk.sh --wordpressplus <TEN_MIEN_CUA_BAN>

Bạn chỉ cần thay thế <TEN_MIEN_CUA_BAN> bằng tên miền đã đăng ký với Cloudflare bên trên là được.

Bạn có thể thực hiện việc cài đặt này trên bất kỳ hệ điều hành Linux nào, do mình đã dùng quen hệ Ubuntu/Debian nên mình đã cài đặt trên Ubuntu 22.04. Đối với các hệ Linux khác bạn cũng có thể làm tương tự.

Chi tiết cách cài đặt bạn có thể tham khảo thêm hướng dẫn bằng tiếng Anh tại đây

4. Chỉ cho phép các IP của Cloudflare

Khi người dùng truy cập trang web bằng tên miền đã được chuyển về Cloudflare, Cloudflare sẽ sử dụng các máy chủ reverse proxy để truy cập vào server WordPress lấy dữ liệu sau đó trả dữ liệu này ngược lại người dùng, do đó mình chỉ cho phép server chấp nhận những IP đến từ Cloudflare là đủ. Điều này sẽ giúp ngăn chặn hacker truy cập trực tiếp đến server của mình. Danh sách IP này có thể lấy tại trang web của Cloudflare

Từ SSH Console thực hiện bước sau:

$ nano /usr/local/lsws/conf/httpd_config.conf
# tìm
accessDenyDir  {
  dir                     /
  dir                     /etc/*
  dir                     /dev/*
  dir                     conf/*
  dir                     admin/conf/*
}

# thêm vào
accessControl  {
  allow                   <<<END_allow
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
104.16.0.0/13
104.24.0.0/14
108.162.192.0/18
131.0.72.0/22
141.101.64.0/18
162.158.0.0/15
172.64.0.0/13
173.245.48.0/20
188.114.96.0/20
190.93.240.0/20
197.234.240.0/22
198.41.128.0/17
  END_allow
  deny                    *
}

Sau đó thực hiện khởi động lại OpenLiteSpeed bằng lệnh:

$ systemctl restart lsws

5. Thay đổi Virtual Host mặc định của OpenLiteSpeed

Mặc định thì bạn có thể truy cập vào trang WordPress bằng địa chỉ IP của máy chủ. Tuy nhiên, mình muốn người dùng chỉ có thể vào trang WordPress thông qua tên miền thay vì IP, như vậy thì việc sử dụng Cloudflare để làm tường lửa sẽ không còn ý nghĩa gì nữa.

Đăng nhập vào server bằng SSH rồi thực hiện các bước sau:

$ nano /usr/local/lsws/conf/httpd_config.conf
# tìm listener wordpress hoặc Default, nếu không có thì thêm vào
listener wordpress {
    address                 *:80
    secure                  0

    # xoá hết những dòng bắt đầu bằng map *
    # thêm vào và thay thế domain băng tên miền của bạn
    map wordpress domain.com, www.domain.com
}

# tìm listener wordpressssl hoặc Defaultssl, nếu không có thì thêm vào
listener wordpressssl {
    address                 *:443
    secure                  1
    keyFile                 /usr/local/lsws/conf/example.key
    certFile                /usr/local/lsws/conf/example.crt
    certChain               0

    # xoá hết những dòng bắt đầu bằng map *
    # thêm vào và thay thế domain băng tên miền của bạn
    map wordpress domain.com, www.domain.com
}

Cuối cùng thực hiện khởi động lại OpenLiteSpeed bằng lệnh sau:

$ systemctl restart lsws

6. Cài đặt CertBot để đăng ký chứng chỉ SSL

Lưu ý: Nếu bạn đã cài đặt OpenLiteSpeed WordPress trọn gói bằng Marketplace của các nhà cung cấp VPS thì có thể bạn sẽ không cần làm bước này.

Để trang WordPress có thể sử dụng HTTPS cho tên miền của ban, bạn cần phải đăng ký tên miền với Let:s Encrypt để được cấp chứng chỉ SSL. Để tiện cho việc đăng ký và gia hạn chứng chỉ này, mình sẽ cài đặt công cụ CertBot bằng lệnh sau:

$ sudo apt-get update 
$ sudo apt-get install certbot -y

Sau khi cài đặt thành công, thực hiện tiếp lệnh:

certbot certonly --non-interactive --agree-tos -m <EMAIL_ADDRESS> --webroot -w <EXAMPLE_DOC_PATH> -d <DOMAIN> -d <www.DOMAIN>

Phần này bạn sẽ phải thay thế các biến số sau:

  • <EMAIL_ADDRESS> là địa chỉ email của bạn
  • <EXAMPLE_DOC_PATH> là ‘/var/www/vhosts/workleast.com/html/’ hoặc ‘/var/www/wordpress/html’ (folder có chứa file wp-config.php, tuỳ vào phương pháp bạn đã sử dụng để thiết lập máy chủ OpenLiteSpeed)
  • <DOMAIN> là tên miền của bạn VD: workleast.com
  • <www.DOMAIN> là tên miền phụ VD: www.workleast.com

Sau đó bạn sẽ cần thiết lập chứng chỉ này cho trang WordPress như sau:

$ nano /usr/local/lsws/conf/vhost/wordpress/vhost.conf
# thêm vào cuối
vhssl  {
  keyFile                 /etc/letsencrypt/live/<DOMAIN>/privkey.pem
  certFile                /etc/letsencrypt/live/<DOMAIN>/fullchain.pem
  certChain               1
}

Để CerBot có thể tự gia hạn chứng chỉ SSL trên Ubuntu mình cần phải cập nhật lại cronjob như sau:

$ nano /etc/cron.d/certbot
# tìm
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

# thay bằng
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --deploy-hook "systemctl restart lsws"

Cuối cùng thực hiện khởi động lại OpenLiteSpeed bằng lệnh sau:

$ systemctl restart lsws

Chi tiết bạn có thể tham khảo thêm tại đây và tại đây

7. Cài đặt plugin Wordfence

Plugin Wordfence cung cấp các tính năng bảo mật nhằm chống lại sự xâm nhập bất hợp pháp của các bot hoặc hacker. Sau khi cài đặt Wordfence từ trang quản lý của WordPress, tiến hành các bước sau:

a. Bật tính năng bảo mật 2 lớp (2FA) để ngăn ngừa bot/hacker đăng nhập trái phép

Từ trang WP Admin, vào mục Thành viên, rơ chuột vào tên người dùng của bạn thì bên dưới sẽ xuất hiện mục ‘2FA’, tiếp tục nhấn vào đó để tiến hành cài đặt bảo mật 2 lớp cho người dùng đó.

Bạn cũng sẽ phải cài đặt phần mềm ‘Authenticator’ của Google để quét mã QR và hoàn tất thủ tục cài đặt.

b. Giới hạn số lần đăng nhập thất bại từ một thiết bị

Bạn vào menu Wordfence, chọn mục ‘All options’ sau đó tìm phần ‘Brute Force Protection’ và giới hạn lại số lần đăng nhập thất bại như bên dưới.

c. Bật chế độ tường lửa mở rộng cho Wordfence

Từ giao diện wp-admin nhấp vào nút “CLICK HERE TO CONFIGURE” để tiến hành cài đặt tường lửa cho Wordfence

Sau đó nhấn vào nút ‘DOWNLOAD .htaccess’ và chọn ‘INSTALL’

Sau khi thực hiện bước này, Wordfence sẽ tạo ra 2 file có tên wordfence-waf.php và .user.ini đồng thời sẽ bổ sung thêm một vài thông số vào file .htaccess tại /var/www/html. Tuy nhiên OpenLiteSpeed mặc định không đọc file .user.ini trên từng VHost. Bạn có thể bật tính năng cho PHP phép đọc file .user.ini trên từng VHost riêng biệt theo hướng dẫn của trang này. Tuy nhiên do mình chỉ sử dụng 1 VHost cho trang WordPress nên mình chỉnh sửa trực tiếp vô file conf của VHost luôn. Có 2 cách để làm việc này:

Cách 1: Sửa file vhost.conf trực tiếp

Đăng nhập vào server bằng SSH rồi chạy lệnh:

$  nano /usr/local/lsws/conf/vhosts/wordpress/vhconf.conf
# thêm vào cuối file
phpIniOverride {
php_value auto_prepend_file /var/www/vhosts/workleast.com/html/wordfence-waf.php
}

Sau đó khởi động lại OpenLiteSpeed và PHP bằng lệnh:

$ systemctl restart lsws
Cách 2: sử dụng WebAdmin Console

Đăng nhập vào server bằng SSH rồi chạy lệnh sau để mở cổng cho WebAdmin Console:

ufw allow 7080

Vào trang https://server_ip:7080/index.php#view/confMgr.php?m=vh_wordpress&p=g thêm dòng sau vào mục “php.ini Override”

php_value auto_prepend_file /var/www/vhosts/workleast.com/html/wordfence-waf.php

Sau khi lưu lại, nhấn vào nút “gentle restart” để cập nhật lại cấu hình.

Cuối cùng từ SSH console thực hiện lệnh sau để đóng cổng truy cập vào WebAdmin:

ufw delete allow 7080

d. Bật tính năng tự cập nhật của Wordfence

Từ SSH console, thực hiện các bước sau:

$ nano /var/www/vhosts/workleast.com/html/.htaccess (hoặc /var/www/html/.htaccess)
# thêm vào đầu file
# BEGIN LiteSpeed noabort
<IfModule Litespeed>
RewriteEngine On
RewriteRule .* - [E=noabort:1]
</IfModule>
# END liteSpeed noabort

Cuối cùng thực hiện khởi động lại OpenLiteSpeed bằng lệnh sau:

$ systemctl restart lsws

8. Cài đặt LiteSpeed Memcached

LiteSpeed Memcached là một phần mềm bổ sung cho LiteSpeed Cache cung cấp khả năng làm bộ nhớ đệm cho các đối tượng dữ liệu giúp việc truy xuất dữ liệu nhanh chóng hơn đồng thời giúp giảm tải cho máy chủ database cửa bạn.

Vì phần này hơi dài nên mình đã tách ra viết một bài hướng dẫn riêng, bạn có thể tham khảo bài tăng tốc cho WordPress với LiteSpeed Memcached để thực hiện.

9. Cài đặt các extensions tùy chọn khác

Để cài đặt thêm các extentions khác, bạn có thể thực hiện lệnh:

$ apt install lsphp<PHP-VER>*
Ví dụ:
$ apt install lsphp81*

Lệnh này sẽ liệt kê tất cả các extensions mà OpenLiteSpeed đang hỗ trợ cho phiên bản PHP đã chỉ định, muốn cài đặt extension nào bạn chỉ việc thực hiện lệnh:

$ apt install -Y lsphp<PHP-VER>-<EXT-NAME>

Có 2 extensions mà WordPress sẽ đề nghị bạn cài đặt là “imagick” ̣̣̣̣̣̣̣dùng để chuyển đổi các định dạng hình ảnh và “intl” dùng trong việc hỗ trợ đa ngôn ngữ. Bạn có thể cài đặt 2 extensions này bằng lệnh sau từ Ubuntu:

̀$ apt install -Y lsphp<PHP-VER>-imagick lsphp<PHP-VER>-intl
Ví dụ:
$ apt install -Y lsphp81-imagick lsphp81-intl

Sau đó khởi động lại OpenLiteSpeed và PHP bằng lệnh:

$ systemctl restart lsws
$ pkill lsphp

10. Sao lưu dự phòng với plugin UpdraftPlus

UpdraftPlus là plugin phổ biến nhất hiện nay cung cấp khả năng sao lưu toàn bộ trang web, từ database, hình ảnh, plugins… và toàn bộ các file của trang WordPress lên các nền tảng lưu trữ trực tuyến như Google Drive, Dropbox… theo định kỳ. Phiên bản miễn phí của UpdraftPlus cho phép sử dụng các tính năng cơ bản, nếu muốn sử dụng các tính năng nâng cao bạn phải nâng cấp lên phiên bản Pro có tính phí. Cá nhân mình thấy bản miễn phí của UpdraftPlus cũng đã quá đủ cho nhu cầu cơ bản.

Vui lòng tham khảo bài hướng dẫn sao lưu và khôi phục trang WordPress bằng UpdraftPlus

Chúc bạn thành công!

Để 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 *