ติดตั้ง vsftpd บน ubuntu 16.04 server

จาก Wiki Opensource

ปรับปรุงครั้งล่าสุดวันที่ 22-08-2560
เขียนโดย วิบูลย์


1. ติดตั้งโปรแกรม

mama@ubuntu:~$ sudo apt install vsftpd
After this operation, 336 kB of additional disk space will be used.


2. ตรวจสอบ ค่า default ตอนติดตั้งโปรแกรมนี้

mama@ubuntu:~$ grep -v ^# /etc/vsftpd.conf
listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

อธิบายความหมาย:
listen=NO
listen_ipv6=YES
หมายความว่า vsftpd อยู่ใน mode listen สำหรับทุก Address ทั้ง IPv4 และ IPv6 นั่นคือ เปิด port 21 รอ

3. หากต้องการให้ user สามารถ upload แฟ้มได้ ให้ใช้ editor เช่น vi เข้าไปแก้ไขไฟล์ /etc/vsftpd.conf

mama@ubuntu:~$ sudo vi /etc/vsftpd.conf

จะต้องมีบรรทัดข้อความว่า

local_enable=YES
write_enable=YES


4. สั่ง restart และ ตรวจสอบสถานะ ftp service

mama@ubuntu:~$ sudo systemctl restart vsftpd.service
mama@ubuntu:~$ sudo systemctl status vsftpd.service
- vsftpd.service - vsftpd FTP server
   Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: e
   Active: active (running) since Thu 2016-08-25 13:12:15 ICT; 6s ago
Aug 25 13:12:15 ubuntu systemd[1]: Starting vsftpd FTP server...
Aug 25 13:12:15 ubuntu systemd[1]: Started vsftpd FTP server.


5. ทดสอบสร้าง user ชื่อ bob ในไดเรกทอรี /home และ ใช้ shell /bin/bash

mama@ubuntu:~$ sudo useradd -m -b /home -s /bin/bash bob
mama@ubuntu:~$ sudo passwd bob


6. ทดสอบใช้งานด้วยคำสั่ง ftp localhost

mama@ubuntu:~$ ftp localhost
Connected to localhost
220 Welcome to blah FTP service.
Name (localhost:mama): bob
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit


อาจจะไปลองใช้ FileZilla for Windows ทดสอบ ftp เข้ามาก็ได้

7. หากไม่ต้องการให้ user change directory ออกไปนอก /home ของตนเอง (เช่น bob ให้เห็นเฉพาะ /home/bob เท่านั้น)
ให้แก้ไขไฟล์ /etc/vsftpd.conf จะต้องมีบรรทัดข้อความว่า
allow_writeable_chroot=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

8. และในไฟล์ vsftpd.chroot_list ใส่ชื่อ user ที่จะมีสิทธิเท่านั้น (ตัวอย่างนี้คือ mama)

9. หากจะเปิด anonymous ftp server
ให้แก้ไขไฟล์ /etc/vsftpd.conf จะต้องมีบรรทัดข้อความว่า
anonymous_enable=YES

การให้แฟ้มข้อมูลสามารถเปิดอ่านได้โดยผู้ใช้แบบสาธารณะชื่อ anonymous
ต้องสร้าง directory เพิ่มด้วยคำสั่ง sudo mkdir -p /srv/ftp/pub

10. หากต้องการกำหนดให้เข้าใช้งานที่ตำแหน่งไดเรกทอรีอื่น มิใช่ /home
ให้แก้ไขไฟล์ /etc/vsftpd.conf จะต้องมีบรรทัดข้อความว่า
local_root=ชื่อไดเรกทอรีตามต้องการ

11. และทุกครั้งที่แก้ไขไฟล์ /etc/vsftpd.conf จะต้อง restart vsftpd ทุกครั้ง

หมายเหตุ 1:
ถ้าจะให้ user ใช้ ftp อย่างเดียว และไม่ให้ ssh เข้าเครื่อง ให้ใช้ shell nologin ในคำสั่ง useradd
ตรวจสอบว่ามี shell ชื่อ nologin อยู่ที่ไหน

mama@ubuntu:~$ which nologin
/usr/sbin/nologin


ตรวจสอบดูรายการใน /etc/shells

mama@ubuntu:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen


ถ้าไม่มีรายการ nologin
ใช้คำสั่งเพิ่ม shell nologin เข้าไปใน /etc/shells เพราะว่า vsftpd จะให้ user ftp เข้ามาได้นั้น shell ของ user นั้นต้องอยู่ใน /etc/shells

mama@ubuntu:~$ echo $(which nologin) | sudo tee -a /etc/shells


ตรวจสอบดูรายการใน /etc/shells อีกครั้ง

mama@ubuntu:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen
/usr/sbin/nologin


ตอนนี้สร้าง user ใหม่ ที่จะให้ใช้ ftp อย่างเดียว และ ssh ไม่ได้

mama@ubuntu:~$ sudo useradd -m -b /home -s /usr/sbin/nologin bobby
mama@ubuntu:~$ sudo passwd bobby


ทดสอบใช้งาน ftp

mama@ubuntu:~$ ftp localhost
Connected to localhost
220 Welcome to blah FTP service.
Name (localhost:mama): bobby
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit


ทดสอบ ssh จะพบว่า เข้าไม่ได้

mama@ubuntu:~$ ssh bobby@localhost
bobby@localhost's password:
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-34-generic x86_64)
This account is currently not available.
Connection to localhost closed.


หมายเหตุ 2:
หากต้องการจำกัดจำนวน client ที่เข้ามาใช้บริการ ftp ไม่ให้เกิน 100 คน
เพิ่ม/แก้ไขบรรทัดข้อความว่า max_clients=100
แต่ถ้าต้องการจำกัดจำนวน client ต่อ 1 เลข IP ที่เข้ามาใช้บริการ ftp ไม่ให้เกิน 50 คนด้วย
เพิ่ม/แก้ไขบรรทัดข้อความว่า max_per_ip=50

หมายเหตุ 3:
เทคนิคในการสร้าง link ให้สามารถเปิดดูได้ทั้ง http และ ftp ตัวอย่างเช่น
http://ftp.psu.ac.th/pub/temp/ และ ftp://ftp.psu.ac.th/pub/temp/
สมมติว่า root directcory ของ http อยู่ที่ /var/www
และ root directcory ของ ftp อยู่ที่ /srv/ftp/pub
ให้ใช้คำสั่งว่า sudo ln -s /srv/ftp/pub /var/www
แล้วทดสอบดูผลงานได้เลย

หมายเหตุ 4:
ตัวอย่างหากต้องการเพิ่ม hard disk ลูกใหม่เข้าไป และต้องการให้ไปเป็นส่วนหนึ่งของพื้นที่ใน /home/ftp/pub
ให้จัดการติดตั้ง hard disk และ mount ให้เรียบร้อยสามารถใช้งานได้ซะก่อน
ตัวอย่างของผมคือเพิ่ม hard disk /dev/hdb1 ไปในพื้นที่ /mnt/data
และต้องการให้ไปโผล่เป็นส่วนหนึ่งของ /home/ftp/pub/newdisk
ทำคำสั่งขั้นตอนดังนี้คือ
sudo mkdir -p /mnt/data
sudo mount /dev/hdb1 /mnt/data
sudo mkdir -p /home/ftp/pub/newdisk
sudo mount --bind /mnt/data /home/ftp/pub/newdisk
แค่นี้ก็เสร็จแล้ว ตรวจสอบดูผลงานได้เลย
ต้องแก้ไขให้ระบบทำงานคำสั่งเหล่านี้โดยอัตโนมัติทุกครั้งที่บูทเครื่อง
ต้องแก้ไขแฟ้ม /etc/rc.local โดยเพิ่มบรรทัดคำสั่งเหล่านั้นเข้าไปด้วย