Cấu hình user riêng cho từng website trên server Nginx, PHP 8.1 trên Ubuntu 22.04 LTS x64

Bài viết https://iztuts.com/cai-nginx-mariadb-php-8-1-tren-ubuntu-22-04-lts-x64/ chưa giải quyết vấn đề phân quyền user _ một giải pháp cần thiết nếu chạy nhiều website trên một máy chủ.

Ví dụ, để chạy thêm example2.com và phân quyền người dùng cho các website khác nhau, nhằm ngăn chặn việc code PHP trên website này có thể truy cập tài nguyên của website kia, chúng ta cần thực hiện các bước sau (các website khác làm tương tự):


Bước 1: Tạo usergroup riêng cho mỗi website

Tạo người dùng và nhóm cho example2.com:

sudo adduser --disabled-login --gecos "" web_example2

Bước 2: Thiết lập thư mục và quyền sở hữu cho mỗi website

Tạo thư mục cho example2.com:

sudo mkdir -p /var/www/example2.com/html

Thiết lập quyền sở hữu cho từng website:

sudo chown -R web_example2:www-data /var/www/example2.com/html

Do Nginx chạy dưới quyền người dùng www-data và cần quyền truy cập vào socket để giao tiếp với PHP-FPM, nên ở đây ta bắt buộc phải dùng group www-data. Thật ra vẫn có thể dùng group web_example2 nhưng ta phải thêm www-data và group web_example2, điều này mở rộng quyền truy cập của Nginx do đó tiềm ẩn vấn đề bảo mật.

Thiết lập quyền truy cập:

sudo chmod -R 750 /var/www/example2.com/html

Bước 3: Cấu hình PHP-FPM với các pool riêng biệt

Tạo pool cho example2.com:

sudo cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/example2.com.conf

Chỉnh sửa file /etc/php/8.1/fpm/pool.d/example2.com.conf:

sudo nano /etc/php/8.1/fpm/pool.d/example2.com.conf
  • Thay [www] bằng [example2.com].

  • Thiết lập usergroup:

    user = web_example2
    group = web_example2
  • Thay đổi socket:

    listen = /run/php/php8.1-fpm-example2.com.sock

Bước 4: Khởi động lại PHP-FPM

sudo systemctl restart php8.1-fpm

Bước 5: Cấu hình Nginx cho từng website

Cấu hình cho example2.com:

Chỉnh sửa file /etc/nginx/sites-available/example2.com:

sudo nano /etc/nginx/sites-available/example2.com
  • Trong phần server, đảm bảo server_nameroot chính xác.
  • Thay đổi fastcgi_pass trong khối location ~ \.php$:

    fastcgi_pass unix:/run/php/php8.1-fpm-example2.com.sock;

Kích hoạt cấu hình cho example2.com:

sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/

Bước 6: Kiểm tra và khởi động lại Nginx

Kiểm tra cấu hình Nginx:

sudo nginx -t

Khởi động lại Nginx nếu không có lỗi:

sudo systemctl restart nginx

Lưu ý về bảo mật

  • Phân quyền người dùng: Bằng cách chạy mỗi PHP-FPM pool dưới một người dùng riêng, chúng ta ngăn chặn được việc code PHP trên một website truy cập vào file của website khác.
  • Quyền truy cập thư mục: Đảm bảo thư mục và file chỉ có quyền truy cập cần thiết. Sử dụng quyền 750 cho thư mục và 640 cho file.
  • Chặn truy cập trực tiếp: Trong cấu hình Nginx, đảm bảo bạn đã chặn truy cập vào các file nhạy cảm, ví dụ:

    location ~* \.(txt|log|ini|htaccess)$ {
        deny all;
    }
    
    # Block to hidden file
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

Mr.Phan

KTS, KSXD, Developer

You may also like...

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