ผู้คนส่วนใหญ่ชอบใช้โปรแกรม FTP เช่น FileZilla, WinSCP เมื่อต้องโอนไฟล์ไปมากับเซิร์ฟเวอร์ Linux SFTP เป็นทางเลือกที่ปลอดภัยแทนโปรโตคอล FTP เดิม ทำงานคล้ายกันแต่มีการเข้ารหัสเพิ่มเติม โดยใช้โปรโตคอล SSH ที่ให้ความสามารถด้านการเข้ารหัส การตั้งค่า SFTP server บน Linux มีหลายขั้นตอน ซึ่งเราจะ示範ที่นี่
SFTP คืออะไร?
SFTP (Secure File Transfer Protocol) เป็นโปรโตคอลเครือข่ายสำหรับโอนไฟล์จากไคลเอ็นต์ไปเซิร์ฟเวอร์ แตกต่างจาก FTP (File Transfer Protocol) ที่ SFTP ใช้โปรโตคอล SSH (Secure Shell) เข้ารหัสข้อมูลที่ส่ง พัฒนาโดยนักวิทยาการคอมพิวเตอร์ Tatu Ylönen และ Sami Lehtinen ซึ่งก็คือผู้พัฒนาโปรโตคอล SSH ในทศวรรษ 1990 แต่เวอร์ชันสมัยใหม่พัฒนาโดย IETF (Internet Engineering Task Force)
อธิบายได้ว่าเป็นโปรโตคอลระบบไฟล์ระยะไกล (remote file system protocol) แม้ชื่อจะบ่งชี้ว่าเพียงโอนไฟล์ เมื่อส่งไฟล์ผ่าน SFTP จากไคลเอ็นต์ไปเซิร์ฟเวอร์รับ ข้อมูลจะถูกเข้ารหัสก่อนส่ง หากถูกดักฟังโดย "man-in-the-middle" จะถอดรหัสไม่ได้ง่าย
ติดตั้ง SSH และ OpenSSH Server
เริ่มต้นการตั้งค่า SFTP server ด้วยการติดตั้ง SSH และ OpenSSH server
Linux ส่วนใหญ่ติดตั้ง SSH มาแล้ว แต่ถ้ายังไม่มี ติดตั้งด้วยคำสั่ง apt ของ Advanced Packaging Tool:
sudo apt install ssh
ตรวจสอบเวอร์ชัน SSH ด้วยแฟล็ก -V:
ssh -V
ติดตั้ง OpenSSH Server บน Debian/Ubuntu:
sudo apt install openssh-server
บน Arch Linux ใช้ pacman:
sudo pacman -S openssh
สร้างผู้ใช้ กลุ่ม และไดเรกทอรีสำหรับ SFTP
แนะนำให้บริการต่างๆ บน Linux ใช้ผู้ใช้ กลุ่ม และไดเรกทอรีของตัวเอง
สร้างกลุ่มสำหรับผู้ใช้ SFTP:
sudo groupadd sftp_group
สร้างผู้ใช้และเพิ่มเข้ากลุ่มที่สร้าง:
sudo useradd -g sftp_group sftp_user
กำหนดรหัสผ่านให้ผู้ใช้:
sudo passwd sftp_user
สร้างไดเรกทอรีเริ่มต้นสำหรับผู้ใช้ใหม่:
sudo mkdir -p /data/sftp_user/uploaded_files
ตั้งค่าสิทธิ์ไดเรกทอรีด้วย chown:
sudo chown -R root:sftp_group /data/sftp_user sudo chown -R sftp_user:sftp_group /data/sftp_user/uploaded_files
ตั้งค่า SSH Server
ขั้นตอนต่อไปคือตั้งค่า SSH server ที่ SFTP จะใช้
แก้ไขไฟล์ "sshd_config" ใน "/etc/ssh/" ให้ผู้ใช้ใช้ SFTP shell เมื่อเชื่อมต่อ แทน SSH shell
แก้ไขไฟล์ด้วย Nano editor (มากับ Linux หลาย distro):
sudo nano /etc/ssh/sshd_config
ไปที่ท้ายไฟล์ เพิ่ม:
Match Group sftp_group ChrootDirectory /data/%u ForceCommand internal-sftp
รีสตาร์ทบริการ SSH:
sudo systemctl restart sshd
(ตัวเลือก) เปลี่ยนพอร์ต SFTP
หากต้องการเปลี่ยนพอร์ตจากค่าเริ่มต้น 22 ให้แก้ไข "sshd_config" อีกครั้ง
แก้ไขด้วย Nano:
sudo nano /etc/ssh/sshd_config
หาบรรทัดที่มีพอร์ตเริ่มต้น 22 ถูกคอมเมนต์ไว้:
#Port 22
ลบเครื่องหมาย # และใส่พอร์ตที่ต้องการ (ตัวอย่าง 1111):
Port 1111
บันทึกไฟล์ และรีสตาร์ทเซิร์ฟเวอร์:
sudo systemctl restart sshd
ล็อกอินและใช้งานเซิร์ฟเวอร์
เมื่อติดตั้งและตั้งค่าเสร็จ เซิร์ฟเวอร์พร้อมใช้งาน โอนไฟล์อัปโหลด/ดาวน์โหลดได้ทั้งหมด พร้อมเซสชันเข้ารหัสจาก SSH
ก่อนล็อกอิน ดูคู่มือก่อน:
sftp -h
ล็อกอินเซิร์ฟเวอร์ โดยระบุผู้ใช้และ IP หรือ hostname:
sftp USER@HOST
ระบุพอร์ต SFTP (ค่าเริ่มต้น 22) ด้วยแฟล็ก -P:
sftp USER@HOST -P
เมื่อล็อกอิน จะได้ SFTP shell พิมพ์ help ดูคู่มือ
ดาวน์โหลดไฟล์
ดาวน์โหลดไฟล์:
get /path/to/file/on/server
ตัวอย่าง:
get /bin/ls
จะดาวน์โหลดไปที่ไดเรกทอรีปัจจุบัน (ที่คุณอยู่ก่อนล็อกอิน) หากต้องการดาวน์โหลดไปไดเรกทอรีเฉพาะ:
get /path/to/file/on/server /path/to/local/folder
คัดลอกไดเรกทอรี เพิ่มพารามิเตอร์ -r (recursive):
get -r /bin /home/username/Desktop/bin
จำไว้: ต้องใส่ชื่อไดเรกทอรีใหม่ที่ต้องการสร้างในเครื่องโลคอล เช่น "/home/username/Desktop/bin" หากใช้ get -r /bin /home/username/Desktop ไฟล์จะถูกคัดลอกตรง Desktop ไม่ใช่โฟลเดอร์ bin
อัปโหลดไฟล์
อัปโหลดไฟล์/ไดเรกทอรี หลักการเดียวกัน แต่พาธสลับกัน: ระบุไฟล์/ไดเรกทอรีโลคอลก่อน แล้วพาธระยะไกล
อัปโหลดไฟล์ด้วย put:
put /path/to/local/content /path/to/remote/location
อัปโหลดไดเรกทอรี (recursive) กฎเดียวกัน: คัดลอกไฟล์ในไดเรกทอรี ไม่ใช่ไดเรกทอรีเอง ต้องระบุชื่อไดเรกทอรีใหม่ฝั่งระยะไกล
put -r /home/username/Desktop/bin bin
จะสร้างไดเรกทอรีใหม่ชื่อ "bin" ฝั่งระยะไกล
Resume การโอน และใช้พาธที่มีช่องว่าง
โอนไฟล์ใหญ่ขาดกลางทาง ให้ resume ด้วย reput และ reget ใช้พาธเดียวกับครั้งก่อน
reget /path/to/file/on/server /path/to/local/file reput /path/to/local/file /path/to/file/on/server
Resume ไดเรกทอรี เพิ่ม -r:
reput -r /home/username/Desktop/bin bin
พาธมีช่องว่าง ให้หุ้มคำพูด:
put "/home/username/My Documents/Files"
การใช้งานอื่นๆ
แสดงรายการไฟล์/ไดเรกทอรีด้วย ls:
ls -l
เปลี่ยนสิทธิ์ไฟล์ด้วย chmod:
chmod
สร้างไดเรกทอรีใหม่ด้วย mkdir:
mkdir
คำถามที่พบบ่อย
1. ต้องติดตั้ง SFTP client ไหม?
โดยทั่วไปไม่จำเป็น เพราะ Linux ส่วนใหญ่มี SFTP client แบบเทอร์มินัลมาพร้อมกัน
2. ใช้ public-key authentication ได้ไหม?
ได้ ใช้ public-key authentication แทนรหัสผ่าน ตั้งค่าง่ายและเพิ่มความปลอดภัย
3. โฮสต์ SSH server พร้อมกันได้ไหม?
ได้ แต่ต้องแน่ใจว่า SFTP server ไม่ใช้พอร์ตเดียวกับ SSH server