Cách tạo tài khoản SFTP để vào thư mục web trên Caddy Web Server

Tài khoản SFTP để đăng nhập vào thư mục website là một phần quan trọng giúp chúng ta quản trị web dễ dàng hơn, bài này tập trung vào thực hành tạo một tài khoản cho phép bạn làm điều đó.

1. Ở terminal với quyền root, bạn nhập lệnh dưới đây:

sudo adduser webmaster

Cái này sẽ thêm user có tên webmaster vào Ubuntu.

Nó sẽ yêu cầu bạn nhập mật khẩu 2 lần, đây là mật khẩu tùy chọn (chứ không phải mật khẩu của root). Nhập 2 lần để tránh nhầm, vì lúc bạn gõ nó không hiển thị ký tự nào ra ngoài để thấy cả.

Ngoài lề: Một điểm cần lưu ý là khi tạo user mới trên Linux thì mặc định nó sẽ tạo thêm nhóm (group) mới với tên tương ứng, và user đó cũng thuộc nhóm đó. Đấy là lý do bạn thấy dòng này:

info: Adding user `webmaster' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `webmaster' (1002) ...
info: Adding new user `webmaster' (1002) with group `webmaster (1002)' ...

Vì thế có một câu lệnh phân quyền cho user www-data & group www-data rất điển hình mà bạn sẽ thấy mỗi khi cài Caddy Web Server, đó là:

sudo chown -R www-data:www-data /var/www/$DOMAIN/public_html

Không phải ngẫu nhiên trong lệnh lại có đến 2 www-data (www-data:www-data), lý do là vì chúng khác nhau! Một cái là chỉ đến user, một cái là chỉ nhóm (group) mà user đó thuộc về.

Tiếp đến là các thông tin phụ như là Full Name, Phone,… Bạn Enter để bỏ qua không cần nhập.

Changing the user information for webmaster
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y

2. Đặt biến cho tên miền (cho dễ thao tác):

DOMAIN="example.com"

Thay example.com bằng tên miền thực tế của bạn.

3. Đưa user webmaster làm chủ file thư mục web:

sudo chown -R webmaster:www-data /var/www/$DOMAIN/public_html

Với việc thay đổi này giờ user webmaster có quyền 7 (421) với thư mục web gốc, và quyền 6 (42) với các file trong đó. Nói cách khác nó thay thế user www-data để làm chủ.

Lưu ý: user www-data không còn làm chủ thư mục web gốc nữa, nhưng group www-data thì vẫn còn (webmaster:www-data).

4. Nâng quyền cho nhóm sở hữu

Việc để webmaster làm chủ sẽ khiến user www-data cần phải phục hồi quyền thì mới hoạt động được (www-data là user mặc định hoạt động ngầm trong server để thao tác trên toàn bộ thư mục web gốc). Để phục hồi cho user www-data, ta tăng quyền cho nhóm mà user www-data thuộc về. Nói cách khác ta tăng quyền cho group www-data:

sudo find /var/www/$DOMAIN/public_html -type d -exec chmod 775 {} \; && sudo find /var/www/$DOMAIN/public_html -type f -exec chmod 664 {} \;

So với lệnh cũ 755 được chuyển thành 775, còn 644 được chuyển thành 664. Nghĩa là giờ đây user sở hữu (webmaster) & group sở hữu (www-data) đã cùng có quyền 7 với thư mục, và 6 với file. Điều đó giúp cả user webmaser (nay là chủ) & user www-data (không còn là chủ, nhưng thuộc về group có quyền www-data tương đương webmaster).

5. sGID – Điều chỉnh nhóm mặc định cho các file do webmaseter up lên

Các file mới do webmaster up lên mặc định sẽ được thiết lập user sở hữu và group sở hữu lần lượt là webmaster:webmaster

Điều này sẽ gây rắc rối cho user www-data, vì Linux thấy rằng user www-data chỉ có quyền 4 với các file này (vì đối với các file có quyền sở hữu được thiết lập là webmaster:webmaster, thì user www-data là other (khác) và chỉ có quyền 4.

Để thay đổi điều này chúng ta sẽ thay đổi nhóm sở hữu mặc định của file do webmaster up lên bằng cách: chuyển nhóm sở hữu mặc định đó thành nhóm sở hữu của thư mục mà file đó up lên (thư mục public_html có nhóm sở hữu là group www-data). Do vậy khi webmaster up lên puplic_html, file đó sẽ được chuyển quyền sở hữu thành:

webmaster:www-data

Cách điều chỉnh: thông qua sGID.

# Chỉ tìm các thư mục (-type d) bên trong và set g+s cho chúng
find /var/www/$DOMAIN/public_html -type d -exec chmod g+s {} +

6. Gán user webmaster vào group www-data

Điều này nhằm tăng quyền webmaster lên tối đa. Dự phòng các trường hợp nó không có quyền sở hữu, thì nó sẽ có quyền nhóm của www-data để thao tác.

sudo usermod -aG www-data webmaster

7. Chỉnh umask

Khi chúng ta gán nhóm sở hữu cho file mới mà user webmaster up lên là www-data, và ta cũng đã phân quyền nhóm www-data là 6 cho file, chúng ta nghĩ đã xong việc!

Nhưng không, quyền mà chúng ta áp cho thư mục & file qua câu lệnh này:

sudo find $WP_ROOT -type d -exec chmod 775 {} \; && sudo find $WP_ROOT -type f -exec chmod 664 {} \; && sudo chmod +x /var/www

Thì nó chỉ áp dụng cho thư mục & file tại thời điểm đó! Các thư mục mới và file mới thì vẫn sẽ được áp quyền mặc định (755 với thư mục, 644 với file).

Nghĩa là các file mới do webmaster up lên mặc dù đã được sGID để có nhóm sở hữu là www-data, nhưng quyền mặc định cho file là 644, cho nên nhóm sở hữu vẫn chỉ có quyền 4.

Việc chúng ta làm là chuyển quyền mặc định này thành 775 cho thư mục và 664 cho các file mới tạo.

Cách làm:

sudo nano /etc/ssh/sshd_config

Kéo xuống cuối, tìm đến dòng này:

Subsystem       sftp    /usr/lib/openssh/sftp-server

Sửa thành:

Subsystem sftp internal-sftp -u 002

8. Chỉnh file wp-config.php

Thêm dòng dưới đây ngay dưới <?php

define('FS_METHOD', 'direct');

Nó sẽ ngăn tình trạng khi chúng ta cài plugin trên WordPress mà nó lại yêu cầu tài khoản FTP (cái này là do WordPress chặt chẽ, chúng ta vừa chuyển quyền sở hữu web cho webmaster, và mặc dù chúng ta phân cho nhóm www-data (mà khi cài plugin ta sẽ dùng nhóm này) quyền số 7 (đọc, ghi, thực thi) nhưng nó vẫn không làm gì được! Lý do là vì từ 1 đến 7 liên quan đến bảo mật trên Linux, cái số 8 liên quan đến bảo mật trên WordPress!).

Đưa câu lệnh trên vào sẽ kết thúc vấn đề khó chịu đó.


Giờ bạn có thể đăng nhập SFTP qua phần mềm như FileZilla:

  • Host: IP của VPS;
  • Username: webmaster;
  • Password: mật khẩu mà bạn nhập ban nãy;
  • Port (cổng): 22

Khi đăng nhập vào, bạn sẽ được đưa tới thư mục webmaster nằm trong thư mục home, bạn phải lên cấp thư mục để thấy thư mục var, vào đó rồi vào thư mục www, từ đó bạn sẽ thấy các website đang cài trên webserver. [Cấu trúc này var > www > domain là do cách chúng ta tạo trang WordPress trên Caddy].

Nếu muốn truy cập nhanh, có thể dùng lệnh sau để tạo shortcut, lệnh này sẽ tạo shortcut tên example trong thư mục webmaster để bạn truy cập luôn mà không cần phải lên thư mục và tìm var:

ln -s /var/www/example.com/public_html /home/webmaster/example

Thay example.comexample tương ứng với tên miền của bạn.


Hai điểm cần lưu ý:

  • webmaster đăng nhập SFTP sẽ vào được tất cả các thư mục web cài trên Caddy Web Server
  • Sau khi chúng ta đã tạo webmaster, và mỗi lần thêm website mới, chúng ta sẽ phải phân quyền lại cho nó (webmaster) bằng cách chạy lại lệnh:
sudo chown -R webmaster:www-data /var/www/$DOMAIN/public_html && sudo find /var/www/$DOMAIN/public_html -type d -exec chmod 775 {} \; && sudo find /var/www/$DOMAIN/public_html -type f -exec chmod 664 {} \;

Nếu không thêm website mới thì không cần chạy lại lệnh!