Hầu hết mọi người thích tiện ích như FileZilla, WinSCP hoặc chương trình FTP khác khi cần truyền file đến/từ máy chủ Linux. SFTP là giải pháp bảo mật thay thế giao thức FTP gốc. Nó thực hiện hầu hết các chức năng giống phiên bản không bảo mật, nhưng với lớp mã hóa bổ sung. Để làm được điều này, nó dùng giao thức SSH cung cấp khả năng mã hóa. Thiết lập máy chủ SFTP trên hệ thống Linux bao gồm nhiều bước, bài viết trình bày chi tiết.
SFTP là gì?
SFTP (Secure File Transfer Protocol) là giao thức mạng truyền file từ client đến server. Khác với FTP (File Transfer Protocol), SFTP dùng giao thức SSH (Secure Shell) mã hóa dữ liệu gửi. Được phát triển bởi nhà khoa học máy tính Tatu Ylönen và Sami Lehtinen, cũng là người phát triển giao thức SSH thập niên 1990. Tuy nhiên, phiên bản hiện đại do IETF (Internet Engineering Task Force) phát triển.
Có thể mô tả như giao thức hệ thống file từ xa, dù tên gợi ý chỉ thực hiện truyền file. Khi gửi file dùng SFTP từ client đến server nhận, dữ liệu được mã hóa trước khi gửi đến đích. Nếu dữ liệu gửi bị chặn bởi "man-in-the-middle", bên thứ ba không dễ dàng giải mã.
Cài đặt SSH và OpenSSH Server
Bắt đầu quá trình thiết lập máy chủ SFTP bằng cài SSH và OpenSSH server.
Hầu hết cài Linux đã có SSH mặc định, nhưng nếu hệ thống không có, cài bằng lệnh apt của Advanced Packaging Tool:
sudo apt install ssh
Sau khi cài SSH, kiểm tra phiên bản bằng lệnh ssh với cờ -V:
ssh -V
Cài OpenSSH Server trên Debian và Ubuntu, ví dụ, bằng lệnh apt:
sudo apt install openssh-server
Làm tương tự trên Arch Linux bằng lệnh pacman:
sudo pacman -S openssh
Tạo người dùng, nhóm và thư mục cho SFTP
Khuyến nghị phổ biến: các dịch vụ khác nhau trên Linux nên dùng người dùng, nhóm, thư mục riêng.
Bắt đầu bằng tạo nhóm cho người dùng SFTP bằng lệnh groupadd:
sudo groupadd sftp_group
Tạo người dùng và thêm vào nhóm vừa tạo bằng lệnh useradd và cờ -g chỉ định nhóm:
sudo useradd -g sftp_group sftp_user
Sau khi tạo user, gán mật khẩu bằng lệnh passwd:
sudo passwd sftp_user
Tạo thư mục mặc định cho user mới tạo:
sudo mkdir -p /data/sftp_user/uploaded_files
Dùng lệnh chown cấp quyền cần thiết cho thư mục:
sudo chown -R root:sftp_group /data/sftp_user sudo chown -R sftp_user:sftp_group /data/sftp_user/uploaded_files
Cấu hình máy chủ SSH
Bước tiếp theo thiết lập máy chủ SFTP là cấu hình máy chủ SSH nó sẽ dùng.
Chỉnh sửa file "sshd_config" trong "/etc/ssh/" để user dùng shell SFTP khi kết nối server thay vì shell SSH.
Dễ dàng chỉnh file bằng trình soạn thảo Nano phổ biến trên nhiều cài Linux mặc định:
sudo nano /etc/ssh/sshd_config
Tìm cuối file và thêm:
Match Group sftp_group ChrootDirectory /data/%u ForceCommand internal-sftp
Khởi động lại dịch vụ SSH:
sudo systemctl restart sshd
(Tùy chọn) Thay đổi cổng SFTP
Nếu muốn đổi cổng máy chủ SFTP từ mặc định 22 sang lựa chọn của bạn, cần chỉnh file "sshd_config" lần nữa.
Lại chỉnh file bằng Nano:
sudo nano /etc/ssh/sshd_config
Tìm dòng với giá trị cổng mặc định 22 bị comment out:
#Port 22
Bỏ dấu hash (#) comment dòng và thêm giá trị cổng lựa chọn. Trong trường hợp tôi, đổi thành 1111:
Port 1111
Lưu file và khởi động lại server:
sudo systemctl restart sshd
Đăng nhập và sử dụng Server
Với server đã cài và cấu hình, sẵn sàng sử dụng. Dễ dàng upload/download file, tất cả với phiên mã hóa do SSH cung cấp.
Trước khi đăng nhập, xem hướng dẫn cung cấp:
sftp -h
Đăng nhập server bằng username và IP hoặc hostname server theo định dạng:
sftp USER@HOST
Bên cạnh đó, chỉ định cổng server SFTP (mặc định 22) bằng cờ -P:
sftp USER@HOST -P <PORT>
Khi đăng nhập, chào đón bằng shell SFTP.
Xem hướng dẫn bằng help.
Tải file xuống (Downloading Files)
Để tải file:
get /path/to/file/on/server
Ví dụ:
get /bin/ls
Sẽ tải về thư mục hiện tại - thư mục bạn ở local trước khi đăng nhập server. Để tải về thư mục local cụ thể:
get /path/to/file/on/server /path/to/local/folder
Để copy thư mục, thêm tham số -r (recursive - đệ quy):
get -r /bin /home/username/Desktop/bin
Nhớ thêm tên thư mục mới muốn tạo local, như "/home/username/Desktop/bin". Nếu dùng get -r /bin /home/username/Desktop, file copy thẳng lên Desktop. Lưu ý là copy file chứ không phải thư mục.
Tải file lên (Uploading Files)
Upload file/thư mục theo nguyên tắc tương tự. Ngoại lệ: đường dẫn đảo ngược, nghĩa là chỉ định file/thư mục local trước, rồi đường dẫn từ xa.
Bắt đầu upload file lên server bằng lệnh put:
put /path/to/local/content /path/to/remote/location
Khi upload thư mục (đệ quy), quy tắc phần trước áp dụng: thực tế copy file trong thư mục chứ không phải thư mục. Chỉ định tên mới cho thư mục muốn copy file đó.
put -r /home/username/Desktop/bin bin
Tạo thư mục mới tên "bin" phía remote.
Tiếp tục truyền (Resume Transfers) và dùng đường dẫn chứa khoảng trắng
Khi truyền file lớn bị gián đoạn, tiếp tục bằng cách thay lệnh trước bằng reput và reget. Chắc chắn dùng cùng đường dẫn lần trước để nguồn và đích khớp chính xác.
reget /path/to/file/on/server /path/to/local/file reput /path/to/local/file /path/to/file/on/server
Để tiếp tục truyền thư mục, thêm tham số -r:
reput -r /home/username/Desktop/bin bin
Nếu đường dẫn file chứa khoảng trắng, đặt trong ngoặc kép:
put "/home/username/My Documents/Files"
Cách dùng khác
Liệt kê file và thư mục bằng lệnh ls:
ls -l
Quyền file cũng thay đổi bằng lệnh chmod:
chmod <PERMISSION> <FILE>
Bên cạnh đó, tạo thư mục mới bằng lệnh mkdir:
mkdir <DIRECTORY_NAME>
Câu hỏi thường gặp
1. Cần cài client SFTP không?
Hầu hết trường hợp không, vì hầu hết hệ thống Linux có sẵn client SFTP dựa trên terminal mặc định.
2. Có dùng xác thực khóa công khai (public-key authentication) không?
Có, dùng xác thực khóa công khai thay mật khẩu làm phương thức xác thực. Thiết lập đơn giản, cung cấp bảo mật thêm cho server.
3. Có lưu trữ đồng thời SSH server không?
Có. Tuy nhiên, cần đảm bảo server SFTP không dùng cùng cổng với SSH server.