Chuyên mục
Linux

Phân quyền trên Linux

Phân quyền các thư mục và file của trang web là vấn đề đau đầu mình gặp phải khi phát triển web trên Linux.

  • Web Server (Apache, nginx,…) đòi hỏi được trao quyền sở hữu thư mục và file để có thể đọc và ghi (ví dụ: tải plugin mới, tạo ảnh thumbnail, tạo cache,…)
  • Lập trình viên (Developer) cũng cần có quyền đọc và ghi để có thể chỉnh sửa code, phát triển web.

Vấn đề phân quyền

Vấn đề nảy sinh khi Linux chỉ trao quyền sở hữu file hoặc thư mục cho một user duy nhất: www-data (user của Apache) hoặc username (user của developer).

Ví dụ: Mình đăng nhập vào hệ thống bằng username blntech, và tạo một file mới tên “Update.php” trong thư mục /var/www/website.com/public. File mới này sẽ tự động được phân quyền sở hữu cho user blntech.

  • Mình có thể chỉnh sửa code thoải mái trên file này nhưng Web Server sẽ không thể chỉnh sửa trực tiếp file này được do không có quyền.
  • Nếu mình chuyển quyền quản lý file Update.php cho user www-data, vấn đề bị đảo ngược: Web Server có thể chỉnh sửa file được nhưng user blntech không thể chỉnh sửa được file khi truy cập qua SFTP.

Cách giải quyết: bindfs

Thư mục gốc của ứng dụng web được giả lập làm một thư mục con trong thư mục home của bạn (/home/username).

Do đó, bạn có toàn quyền chỉnh sửa, tạo mới và xoá file, trong khi thực sự nó vẫn thuộc quyền sở hữu của web server (www-data).

Cài đặt

Cách này chỉ áp dụng cho Ubuntu/Debian.

Trong hướng dẫn dưới đây, username của mình sử dụng là blntech, thư mục web nằm ở /var/www/blntech.asia

# Cài Đặt bindfs (chỉ làm 1 lần duy nhất)
blntech@web $ sudo apt-get update  
blntech@web $ sudo apt-get -y install bindfs

# Tạo thư mục giả lập
blntech@web $ sudo mkdir -p /home/blntech/www/blntech.asia
blntech@web $ sudo chown -Rf blntech:blntech /home/blntech/www/blntech.asia  

Sau đó, chỉnh sửa file /etc/fstab và thêm dòng này vào cuối file. Nhớ đổi lại đường dẫn và tên username blntech sang thông tin của bạn

bindfs#/var/www/blntech.asia /home/blntech/www/blntech.asia fuse force-user=blntech,force-group=blntech,create-for-user=www-data,create-for-group=www-data,create-with-perms=0770,chgrp-ignore,chown-ignore,chmod-ignore 0 0 

Lưu file và làm tiếp bước giả lập hệ thống file

blntech@web $ mount /home/blntech/www/blntech.asia

Kiểm tra

Kiểm tra xem hệ thống có hoạt động như mong muốn không.

Tạo file mới trong thư mục /home

blntech@web:~/www/blntech.asia$ su blntech
Password: 
blntech@web:~/www/blntech.asia$ cd /home/blntech/www/blntech.asia
blntech@web:~/www/blntech.asia$ touch hello.txt

Kiểm tra phân quyền file mới tạo trong thư mục giả lập /home/blntech

blntech@web:~/www/blntech.asia$ ls -l hello.txt
-rwxrwx--- 1 blntech blntech 0 Jan  5 05:42 hello.txt

Kiểm tra phân quyền file mới tạo trong thư mục của ứng dụng web /var/www/blntech.asia

blntech@web:~/www/blntech.asia$ cd /var/www/blntech.asia
blntech@web:/var/www$ ls -l hello.txt
-rwxrwx--- 1 www-data www-data 0 Jan  5 05:42 hello.txt
blntech@web:/var/www$ 

File hello.txt được tạo bằng tài khoản blntech, nhưng nó đã được tự động phân quyền sở hữu cho www-data .

Done