Chỉnh lại phân quyền user www-data trong Ubuntu để tiện tạo tài khoản sFTP sau này cho trang WordPress

Đây là cấu trúc phân quyền trước đây tôi cài khi khởi tạo WordPress trên Caddy Web Server:

WP_ROOT="/var/www/$DOMAIN/public_html"
sudo chown -R www-data:www-data $WP_ROOT
sudo find $WP_ROOT -type d -exec chmod 755 {} \;
sudo find $WP_ROOT -type f -exec chmod 644 {} \;

Cấu trúc này website chạy ổn, vì user www-data được di chuyển thoải mái trong toàn bộ website (public_html) mà không vướng gì. Tuy nhiên nó phát sinh vấn đề:

Vì đằng nào cũng phải tạo tài khoản sFTP (nhu cầu truy cập vào thư mục gốc website thông qua sFTP rất thường gặp) nên tôi đã điều chỉnh ngay từ lúc cài WordPress, phân quyền tiện lợi hơn ngay từ đầu để giảm các rắc rối (dù vẫn giải quyết được) của phân quyền lại sau này.

Cách làm:

a. Để user root và group www-data sở hữu thư mục web gốc.

Nghĩa là nó sẽ thế này:

WP_ROOT="/var/www/$DOMAIN/public_html"
sudo chown -R root:www-data $WP_ROOT

Cái này được cho là an toàn hơn vì root khó chiếm quyền.

Vẫn để www-data là group sở hữu để sau nó làm nhóm chung cho cả user www-data & user sFTP cùng hoạt động không tranh chấp.

b. Thay đổi quyền cho group www-data từ 5 lên 7 với thư mục, và từ 4 lên 6 với file, nghĩa là thế này:

sudo find $WP_ROOT -type d -exec chmod 775 {} \;
sudo find $WP_ROOT -type f -exec chmod 664 {} \;

Tức là mặc dù user www-data không sở hữu thư mục web gốc nhưng vì nó nằm trong group www-data nên khi nó thao tác với thư mục web gốc nó vẫn có quyền cần thiết do kế thừa từ group => Nhiệm vụ vẫn đảm bảo như trước đây.

Sau này user sFTP được tạo thêm, được cho vào group www-data và có quyền luôn với thư mục web gốc.

Một điều chỉnh được thực hiện luôn khi cài web (thay vì lúc tạo sFTP mới làm) đó là sGID. Nói cách khác: cài đặt để bất cứ file nào tải lên thư mục web gốc sẽ mặc nhiên thuộc sở hữu của group www-data (chứ không phải group của user tải lên), điều này được làm bằng lệnh:

sudo find $WP_ROOT -type d -exec chmod 2775 {} \;

Một điều chỉnh khác cũng làm luôn là thêm define( 'FS_METHOD', 'direct' ); vào wp-config.php nhằm ngăn cản các cài đặt khó tính của WordPress chặn user www-data thao tác (cái này không do phân quyền Linux mà do cài đặt bảo mật mặc định của WP):

# Kiểm tra: Nếu chưa có FS_METHOD thì mới thực hiện
if ! grep -q "FS_METHOD" "$WP_CONFIG"; then
    # Dùng lệnh sed để chèn ngay sau thẻ mở <?php
    # Dấu ^ đảm bảo chỉ tìm <?php ở đầu dòng (tránh nhầm lẫn nếu có trong comment)
    sudo sed -i "0,/<?php/s/<?php/<?php\n\ndefine( 'FS_METHOD', 'direct' );/" "$WP_CONFIG"
    
    echo "Da them cau hinh FS_METHOD: direct"
else
    echo "Cau hinh FS_METHOD da ton tai."
fi

Với những cài đặt này, và thêm một số tiểu tiết khác, việc thêm tài khoản sFTP sẽ đỡ rối rắm hơn nhiều.

Viết một bình luận