FTP Server ถือเป็นเซิร์ฟเวอร์ที่ติดตั้งและคอนฟิกค่อนข้างง่ายมาก ดีฟอลต์คอนฟิกหลังจากติดตั้งไม่ว่าจาก rpm หรือ yum ก็สามาถใช้งานได้เลย
แต่ถ้าเปิดเป็น FTP Server ที่ให้บริการบนอินเตอร์เน็ต แนะนำให้เปลี่ยนคอนฟิกบ้าง ไม่งั้นเซิร์ฟเวอร์คุณอาจตกเป็นที่โจมตีจากผู้ไม่ประสงค์ดีทั้งหลาย
ในที่นี้เลือกใช้ vsftpd ด้วยเหตุผล เรื่องความปลอดภัย ความเร็ว คอนฟิกง่าย และ FTP Server ขนาดใหญ่ๆ ก็ใช้กัน
เครื่องทดสอบ
ในบทความนี้ทดสอบบน Fedora 15 (i386) โดยปิดคุณสมบัติ firewall และปิด SELinux
[root@ftp-server ~]# iptables -L -v -n Chain INPUT (policy ACCEPT 111K packets, 53M bytes) pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 36761 packets, 119M bytes) pkts bytes target prot opt in out source destination
[root@ftp-server ~]# sestatus SELinux status: disabled
ติดตั้ง vsftpd
สำหรับ Fedora ไฟล์ rpm ของ vsftpd อยู่ในแผ่นดีวีดีติดตั้งอยู่แล้ว
[root@ftp-server ~]# rpm -ivh vsftpd-2.3.4-1.fc15.i686.rpm Preparing... ########################################### [100%] 1:vsftpd ########################################### [100%]
ไฟล์คอนฟิกของ vsftpd อยู่ใน /etc/vsftpd/ โดยไฟล์หลักคือ vsftpd.conf
[root@ftp-server ~]# ls -l /etc/vsftpd/ total 20 -rw------- 1 root root 125 Mar 4 2011 ftpusers -rw------- 1 root root 361 Mar 4 2011 user_list -rw------- 1 root root 4645 Mar 4 2011 vsftpd.conf -rwxr--r-- 1 root root 338 Mar 4 2011 vsftpd_conf_migrate.sh
สตาร์ตเซอร์วิส โดยใช้คอนฟิกดีฟอลต์ที่มาจากการติดตั้ง
[root@ftp-server ~]# service vsftpd start Starting vsftpd (via systemctl): [ OK ]
ใช้คำสั่ง ps เพื่อดู process ของ vsftpd
[root@ftp-server ~]# ps -ef | grep vsftpd root 2982 1 0 05:30 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
ใช้คำสั่ง netstat เพื่อดูพอร์ตที่เปิดของ vsftpd
[root@ftp-server ~]# netstat -a | grep ftp tcp 0 0 *:ftp *:* LISTEN
หมายเหตุ ทุกครั้งที่เปลี่ยนคอนฟิกของ vsftpd ต้องรีสตาร์ตเซอร์วิส เพื่อจะให้คอนฟิกมีผล
สำหรับ Fedora ใช้คำสั่ง service เพื่อ รีสตาร์ตเซอร์วิส
[root@ftp-server ~]# service vsftpd restart Restarting vsftpd (via systemctl): [ OK ]
คอนฟิก anonymous FTP Server
ทดลอง ftp ด้วย anonymous หรือ ftp
[root@ftp-server ~]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 2.3.4) Name (127.0.0.1:user1): ftp 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.
ftp> dir 227 Entering Passive Mode (127,0,0,1,228,121). 150 Here comes the directory listing. drwxr-xr-x 2 0 0 4096 Mar 03 2011 pub 226 Directory send OK.
ftp> bye 221 Goodbye.
ไฟล์ของ anonymous FTP จะอยู่ใน /var/ftp/ เป็นไดเรคทอรี home ของผู้ใช้ ftp
[root@ftp-server ~]# grep ftp /etc/passwd ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
หากต้องการเปลี่ยนไดเรคทอรีที่เก็บไฟล์สำหรับ anonymous ต้องเปลี่ยน home ของ ftp ในไฟล์ /etc/passwd
[root@ftp-server ~]# ls -l /var/ftp/ total 4 drwxr-xr-x 2 root root 4096 Mar 4 2011 pub [root@ftp-server ~]# ls -l /var/ftp/pub/ total 0
ปิดการใช้ anonymous FTP Server
หากไม่ต้องการให้บริการ FTP แบบ anonymous หรือเปิดให้ใครก็ได้ สามารถเข้ามาดาวน์โหลดไฟล์ได้จาก FTP Server ของเรา แนะนำให้ปิดคุณสมบัตินี้
ในไฟล์ /etc/vsftpd/vsftpd.conf แก้ออปชั่น anonymous_enable จาก YES เป็น NO
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO
# Uncomment this to allow local users to log in. # When SELinux is enforcing check for SE bool ftp_home_dir local_enable=YES
ทดลอง ftp ด้วย anonymous หรือ ftp อีกครั้ง หลังจากเปลี่ยนออปชั่น (อย่าลืมรีสตาร์ตเซอร์วิสหลังเปลี่ยนคอนฟิก)
[root@ftp-server ~]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 2.3.4)
Name (127.0.0.1:user1): ftp
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> bye
221 Goodbye.
FTP ด้วย user
ทดสอบการ ftp ด้วย user ชื่อ user1
[root@ftp-server ~]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 2.3.4)
Name (127.0.0.1:user1): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (127,0,0,1,151,235).
150 Here comes the directory listing.
226 Directory send OK.
ftp> pwd
257 "/home/user1"
ftp> cd /
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (127,0,0,1,200,144).
150 Here comes the directory listing.
dr-xr-xr-x 2 0 0 4096 Jul 15 23:15 bin
dr-xr-xr-x 5 0 0 1024 Jul 15 22:54 boot
drwxr-xr-x 17 0 0 3700 Sep 16 04:04 dev
drwxr-xr-x 88 0 0 4096 Sep 16 22:29 etc
drwxr-xr-x 5 0 0 4096 Sep 16 22:29 home
dr-xr-xr-x 18 0 0 12288 Sep 16 20:12 lib
drwx------ 2 0 0 16384 Jul 15 22:43 lost+found
drwxr-xr-x 2 0 0 40 Sep 16 11:04 media
drwxr-xr-x 2 0 0 4096 Apr 05 10:47 mnt
drwxr-xr-x 2 0 0 4096 Apr 05 10:47 opt
dr-xr-xr-x 98 0 0 0 Sep 16 11:04 proc
dr-xr-x--- 4 0 0 4096 Sep 16 22:28 root
drwxr-xr-x 20 0 0 740 Sep 16 04:04 run
dr-xr-xr-x 2 0 0 12288 Jul 15 23:15 sbin
drwxr-xr-x 2 0 0 4096 Jul 15 22:43 selinux
drwxr-xr-x 2 0 0 4096 Apr 05 10:47 srv
drwxr-xr-x 13 0 0 0 Sep 16 11:04 sys
drwxrwxrwt 8 0 0 4096 Sep 16 20:32 tmp
drwxr-xr-x 12 0 0 4096 Jul 15 22:45 usr
drwxr-xr-x 20 0 0 4096 Sep 16 22:24 var
226 Directory send OK.
ftp> bye 226 Directory send OK.
ปิดการใช้ FTP ด้วย user
แก้ไขไฟล์ /etc/vsftpd/vsftpd.conf โดยเปลี่ยนออปชั่น local_enable จาก YES เป็น NO
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES
#
# Uncomment this to allow local users to log in.
# When SELinux is enforcing check for SE bool ftp_home_dir
local_enable=NO
ทดลอง ftp ด้วย user หลังจากเปลี่ยนออปชั่น
[root@ftp-server ~]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 2.3.4)
Name (127.0.0.1:user1): user1 530 This FTP server is anonymous only.
Login failed.
ftp> bye
221 Goodbye.
ปิดทั้ง anonymous และ ftp ด้วย user
หากตั้งค่าออปชั่นทั้ง anonymous_enable และ local_enable เป็น NO ทั้งคู่
# Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=NO # # Uncomment this to allow local users to log in. # When SELinux is enforcing check for SE bool ftp_home_dir local_enable=NO
หลังจากแก้คอนฟิกแบบนี้ ก็ไม่สามารถ ftp ได้เลย
[root@ftp-server ~]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1).
500 OOPS: vsftpd: both local and anonymous access disabled! ftp> bye
แก้ไข banner ของ FTP Server
ด้วยเหตุผลทางด้านความปลอดภัย แนะนำให้เปลี่ยน banner จากที่ขึ้นเป็นชื่อโปรแกรมและเวอร์ชั่นของ FTP Server เช่น vsFTPd 2.3.4
สามารถเปลี่ยนได้ในไฟล์ /etc/vsftpd/vsftpd.conf ชื่อออปชั่น ftpd_banner
# You may fully customise the login banner string:
ftpd_banner=*** My FTP Server ***
ทดลอง ftp จะเห็นว่า banner เปลี่ยนไป
[root@ftp-server ~]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 *** My FTP Server ***
คอนฟิก chroot สำหรับ ftp ด้วย user
เพื่อความปลอดภัยแนะนำให้คอนฟิก chroot สำหรับ ftp ด้วย user หมายความว่า เมื่อ ftp ด้วย user จะสามารถเห็นไฟล์ได้เฉพาะที่อยู่ใน home ของ user นั้นๆ เท่านั้น
เปิดออปชั่น (Uncomment) chroot_local_user และตั้งค่าเป็น YES
chroot_local_user=YES
ทดลอง ftp ด้วย user
[root@ftp-server ~]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 *** My FTP Server *** Name (127.0.0.1:user1): user1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls 227 Entering Passive Mode (127,0,0,1,199,125). 150 Here comes the directory listing. 226 Directory send OK.
ftp> ls -a 227 Entering Passive Mode (127,0,0,1,29,123). 150 Here comes the directory listing. drwx------ 2 501 100 4096 Sep 16 22:29 . drwx------ 2 501 100 4096 Sep 16 22:29 .. -rw-r--r-- 1 501 100 18 May 05 15:54 .bash_logout -rw-r--r-- 1 501 100 176 May 05 15:54 .bash_profile -rw-r--r-- 1 501 100 124 May 05 15:54 .bashrc 226 Directory send OK.
ftp> cd /etc 550 Failed to change directory.
ftp> pwd 257 "/"
ftp> bye 221 Goodbye.
บล็อก user บางคนด้วยการ deny ใน user_list
โดยดีฟอลต์ user ที่มีชื่ออยู่ในไฟล์ ftpusers หรือ user_list จะไม่สามารถ ftp ได้
ตัวอย่างเช่น จะไม่สามารถ ftp ด้วย root ได้
[root@ftp-server vsftpd]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1).
220 *** My FTP Server ***
Name (127.0.0.1:user1): root
530 Permission denied. Login failed.
ftp> bye
221 Goodbye.
ทดลองเพิ่ม user1 เข้าไปในไฟล์ /etc/vsftpd/ftpusers
[root@ftp-server ~]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1).
220 *** My FTP Server ***
Name (127.0.0.1:user1): user1
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> bye
221 Goodbye.
จะมีการถาม Password แต่ถ้ามีชื่ออยู่ในไฟล์ ftpusers ถึงแม้จะใส่ password ได้ถูกต้อง ก็ไม่สามารถเข้าได้
แต่ถ้าเพิ่ม user1 เข้าไปในไฟล์ /etc/vsftpd/user_list
[root@ftp-server ~]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1).
220 *** My FTP Server ***
Name (127.0.0.1:user1): user1
530 Permission denied. Login failed. ftp> bye
221 Goodbye.
ถ้าเข้าด้วย user1 จะไม่มีแม้กระทั่งถาม Password
แนะนำให้ใส่ชื่อ user ที่ต้องการ deny ทั้งสองไฟล์
หมายเหตุ การเพิ่ม ลบ ชื่อ user ในไฟล์ /etc/vsftpd/ftpusers หรือ /etc/vsftpd/user_list จะมีผลต่อการ ftp ครั้งต่อไปทันที ไม่จำเป็นต้องรีสตาร์ตเซอร์วิส vsftpd
ไฟล์ xferlog
ไฟล์ที่เก็บข้อมูลการ Download, Upload ไฟล์ผ่าน ftp จะอยู่ใน /var/log/xferlog
ตัวอย่างไฟล์
[root@ftp-server ~]# tail /var/log/xferlog Sat Sep 17 06:35:15 2011 1 192.168.1.2 1760 /test.txt b _ o r user1 ftp 0 * c