Hướng dẫn cấu hình PHP-FPM Pools để bảo mật nhiều website

7
0

I. Giới thiệu

Khi phần cứng máy chủ trở nên nhanh hơn và hiệu quả hơn, việc lưu trữ nhiều trang web trên máy chủ web Nginx không còn là vấn đề nữa. Tuy nhiên để có hiệu suất tốt hơn, phân bổ quy trình và bảo mật, thì bạn hãy cân nhắc sử dụng các nhóm PHP FastCGI Process Manager (PHP-FPM) riêng biệt cho từng trang web của bạn.

Bài viết này mô tả những điều cơ bản của việc sử dụng nhóm PHP-FPM riêng biệt cho nhiều trang web trên Nginx với PHP 7.4 cấu hình trên Ubuntu 20.04.

Hướng dẫn cấu hình PHP-FPM Pools để bảo mật nhiều website
Mô hình của pools php-fpm

II. Yêu cầu

  • Sử dụng root hoặc sudo root
  • Máy chủ đã cài đặt lemp stack (Linux + Nginx+ MySQL/MariaDB + PHP)
  • Tạo 2 record A tương ứng cho 2 website và trỏ về IP máy chủ
    • wesbite1.dotrungquan.site
    • website2.dotrungquan.site

III. Cấu hình

1. Xoá trang website mặc định

Nginx cài đặt một trang web mặc định không cần thiết vì vậy bạn hãy xoá nó đi. Để xóa trang web mặc định bạn sử dụng lệnh sau.

rm -rf /etc/nginx/sites-enabled/default 

2. Tạo user cho trang web

Mỗi trang web cần chạy với tư cách người dùng khác nhau vì mục đích bảo mật và độc lập. Vì vậy bạn hãy tạo 2 tài khoản người dùng và chỉ định người dùng www-data cho các nhóm tương ứng.

Điều này cho phép máy chủ web tương tác với người dùng và ngược lại. Không cấp cho người dùng website1website2 đặc quyền đăng nhập hoặc liên kết bất kỳ thông tin nào khác với tài khoản. Để tạo người dùng, hãy chạy lệnh sau

useradd website1
useradd website2
usermod -a -G website1 www-data
usermod -a -G website2 www-data

3. Chỉ định quyền cho thư mục web

Tiếp theo bạn hãy tạo 2 thư mục cho 2 web riêng biệt và gán quyền như sau

mkdir /var/www/website1
chown -R website1:website1 /var/www/website1
mkdir /var/www/website2
chown -R website2:website2 /var/www/website2
chmod 770 /var/www/website1
chmod 770 /var/www/website2

Các quyền của Unix là 770. Mỗi người dùng và nhóm liên kết của người dùng có đầy đủ quyền (7) trên thư mục. Cài đặt này hạn chế người dùng website1 xem dữ liệu cho website2 và ngược lại.

4. Tạo PHP-FPM Pools mới

Bạn hãy copy pools php mặc định ra làm 2 bản, tương ứng của 2 web.

cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/fpm-website1.conf
cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/fpm-website2.conf

Xoá bỏ pool cũ không sử dụng đi

rm -rf /etc/php/7.4/fpm/pool.d/www.conf

5. Cấu hình Pool

Mỗi groups sẽ có user liên kết với Unix socket. Vì vậy bạn cần mở từng file và sửa lại tương ứng như sau.

5.1. Cấu hình Pool website1

vi /etc/php/7.4/fpm/pool.d/fpm-website1.conf

Thay đổi các dòng sau:

  • Thay đổi dòng trên cùng, bên trong dấu ngoặc từ [www] sang [website1]
  • Thay đổi dòng user = www-data thành user = website1
  • Thay đổi dòng group = www-data thành group = website1
  • Thay đổi dòng listen = /run/php/php7.4-fpm.sock thành listen = /run/php/php7.4-website1-fpm.sock
Hướng dẫn cấu hình PHP-FPM Pools để bảo mật nhiều website

Sau khi thay đổi hoàn tất, bạn save lại file cấu hình và thực hiện tiếp với Pool ở website2.

5.2. Cấu hình Pool website2

vi /etc/php/7.4/fpm/pool.d/fpm-website2.conf

Thay đổi các dòng sau:

  • Thay đổi dòng trên cùng, bên trong dấu ngoặc từ [www] sang [website2]
  • Thay đổi dòng user = www-data thành user = website2
  • Thay đổi dòng group = www-data thành group = website2
  • Thay đổi dòng listen = /run/php/php7.4-fpm.sock thành listen = /run/php/php7.4-website2-fpm.sock
Hướng dẫn cấu hình PHP-FPM Pools để bảo mật nhiều website

6. Khởi động lại PHP-FPM

Bạn hãy khởi động lại php-fpm để áp dụng thay đổi.

 service php7.4-fpm restart

Kiểm tra pool của PHP-FPM. Nếu cấu hình chính xác bạn sẽ thấy các nhóm như sau với các pool đã tạo.

root@sv:~# service php7.4-fpm status
● php7.4-fpm.service - The PHP 7.4 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php7.4-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-09-05 07:03:35 CEST; 10s ago
       Docs: man:php-fpm7.4(8)
    Process: 15541 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.4/fpm/pool.d/www.conf 74 (code=exited, status=0/SUCCESS)
   Main PID: 15526 (php-fpm7.4)
     Status: "Processes active: 0, idle: 4, Requests: 0, slow: 0, Traffic: 0req/sec"
      Tasks: 5 (limit: 1074)
     Memory: 7.8M
     CGroup: /system.slice/php7.4-fpm.service
             ├─15526 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
             ├─15537 php-fpm: pool website1
             ├─15538 php-fpm: pool website1
             ├─15539 php-fpm: pool website2
             └─15540 php-fpm: pool website2

Vì bạn đang kết nối qua sock, không còn kết nối qua TCP nữa. Vì vậy bạn không thể kiểm tra qua lệnh netstat mà hãy sử dụng ps aux để check tiến trình.

Ví dụ:

root@sv:~# ps aux | grep php
root       15526  0.0  1.9 198484 19452 ?        Ss   07:03   0:00 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
website1      15537  0.0  1.4 198876 14336 ?        S    07:03   0:00 php-fpm: pool website1
website1      15538  0.0  1.2 198876 12404 ?        S    07:03   0:00 php-fpm: pool website1
website2      15539  0.0  0.6 198876  6920 ?        S    07:03   0:00 php-fpm: pool website2
website2      15540  0.0  1.4 198876 14324 ?        S    07:03   0:00 php-fpm: pool website2
root       16993  0.0  0.0   8900   724 pts/1    S+   07:37   0:00 grep --color=auto php

7. Tạo file cấu hình website Nginx

Máy chủ cần hai trang web mới để sử dụng hai nhóm PHP-FPM, một trang được liên kết với mỗi nhóm tương ứng.

1. Tạo website1

Bạn hãy sử dụng lệnh sau để tạo file mới.

vi /etc/nginx/sites-available/website1

Lưu ý: Thay server_name website1.dotrungquan.site; bằng server_name của bạn

server {
    server_name website1.dotrungquan.site;

    access_log /var/log/nginx/website1.access.log;
    error_log /var/log/nginx/website1.error.log;

    root /var/www/website1;

    index index.php;

    try_files $uri $uri/ /index.php?$query_string;

    location ~ .php$ {
            fastcgi_pass unix:/run/php/php7.4-website1-fpm.sock;
            include snippets/fastcgi-php.conf;
    }
}

Trong đó:

  • server_name – Tên domain/sub của site 1
  • access_log – đường dẫn của file access_log
  • error_log – đường dẫn của file error log
  • root – đường dẫn mã nguồn
  • fastcgi_pass – đường dẫn của file sock php-fpm

2. Tạo website2

vi /etc/nginx/sites-available/website2

Lưu ý: Thay server_name website2.dotrungquan.site; bằng server_name của bạn

server {
    server_name website2.dotrungquan.site;

    access_log /var/log/nginx/website2.access.log;
    error_log /var/log/nginx/website2.error.log;

    root /var/www/website2;

    index index.php;

    try_files $uri $uri/ /index.php?$query_string;

    location ~ .php$ {
            fastcgi_pass unix:/run/php/php7.4-website2-fpm.sock;
            include snippets/fastcgi-php.conf;
    }
}

Trong đó:

  • server_name – Tên domain/sub của site 2
  • access_log – đường dẫn của file access_log
  • error_log – đường dẫn của file error log
  • root – đường dẫn mã nguồn
  • fastcgi_pass – đường dẫn của file sock php-fpm

8. Tạo liên kết

ln -s /etc/nginx/sites-available/website1 /etc/nginx/sites-enabled/website1
ln -s /etc/nginx/sites-available/website2 /etc/nginx/sites-enabled/website2

Khởi động lại nginx

service nginx restart

9. Kiểm tra file cấu hình

Bây giờ mình sẽ tạo mới một file php để kiểm tra như sau.

vi /var/www/website1/index.php

Sau đó bạn dán mã bên dưới vào và lưu lại file

<?php
        phpinfo();
?>

Bạn hãy truy cập vào trình duyệt để kiểm tra. Nếu xuất hiện ra thông tin có nghĩa bạn đã cấu hình và đã hoạt động.

Screenshot 2021 09 05 at 15.06.08

Việc tạo các nhóm PHP-FPM riêng biệt cho mỗi trang web được phục vụ trên một máy chủ duy nhất mang lại cho quản trị viên sự bảo mật mạnh mẽ hơn, ranh giới xác định hơn và giúp dễ dàng khắc phục sự cố liên quan đến các trang web riêng lẻ.

Cũng có thể điều chỉnh cài đặt trang web riêng lẻ cho hiệu suất. Các cài đặt này nằm trong tệp cấu hình /etc/php/7.4/fpm/pool.d. Cài đặt chính thường bị thay đổi là cài đặt chiều, kiểm soát quá trình tạo, với các cài đặt dynamic, static hoặc ondemand.

Chúc bạn thực hiện thành công.

Đỗ Trung Quân
WRITTEN BY

Đỗ Trung Quân

Nguồn nội dung này đến từ Website DoTrungQuan.info

Trả lời