ติดตั้งและคอนฟิก vsftpd – FTP Server

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

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.