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ự):
Mục lục
Bước 1: Tạo user
và group
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
user
vàgroup
: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ảoserver_name
vàroot
chính xác. -
Thay đổi
fastcgi_pass
trong khốilocation ~ \.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; }
Bình luận gần đây