一、文件传输协议
文件传输协议(FTP)是为进行文件共享而设计的因特网标准协议。为了能够在复杂多样的操作设备之间解决文件传输问题,于是便有了统一的FTP文件传输协议(File Transfer Protocol),这是一种能够让使用者在互联网中上传、下载文件的传输协议。FTP文件传输协议默认占用了20、21两个端口号,20端口号用于进行数据传输,21端口号用于接受客户端执行的相关FTP命令与参数,FTP服务端普遍更多的应用于内网中,具有易于搭建、方便管理的特点,并且可以借助FTP客户端工具还可以轻松实现文件的多点下载和断点续传技术,FTP协议的传输拓扑如下图所示
二、实验环境
服务端:Centos 6.5 (2.6.32-358.el6.x86_64)
ip:192.168.198.141
客户端:Centos 6.5 (2.6.32-431.el6.x86_64)
ip:192.168.198.100
selinux =disable
[root@vsftpdserver ~]# vi /etc/sysconfig/selinux
SELINUX=disabled
iptables防火墙管理工具中默认禁止了ftp传输协议的端口号,因此在正式配置vsftpd服务程序前还需要清空一下iptables防火墙的默认策略,并把当前已经被清理的防火墙策略状态保存下来:
[root@vsftpdserver ~]# iptables -F
[root@vsftpdserver ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
三、安装软件
1)服务端:vsftpd
[root@vsftpdserver ~]# yum -y install vsftpd
[root@vsftpdserver ~]# rpm -aq|grep vsftpd
vsftpd-2.2.2-24.el6.x86_64
2)客户端:ftp
[root@ip-ftp_client ~]# yum -y install ftp
[root@ip-ftp_client ~]# rpm -aq|grep ftp
ftp-0.17-54.el6.x86_64
3)vsftpd服务程序的主配置文件中常用的参数及作用介绍
参数 作用
listen=[YES|NO] 是否以独立运行的方式监听服务。
listen_address=IP地址 设置要监听的IP地址。
listen_port=21 设置FTP服务的监听端口。
download_enable=[YES|NO] 是否允许下载文件。
userlist_enable=[YES|NO] 是否启用“禁止登陆用户名单”。
userlist_deny=[YES|NO] 是否启用“禁止登陆用户名单”。
max_clients=0 最大客户端连接数,0为不限制。
max_per_ip=0 同一IP地址最大连接数,0为不限制。
anonymous_enable=[YES|NO] 是否允许匿名用户访问。
anon_upload_enable=[YES|NO] 是否允许匿名用户上传文件。
anon_umask=022 匿名用户上传文件的umask值。
anon_root=/var/ftp 匿名用户的FTP根目录。
anon_mkdir_write_enable=[YES|NO] 是否允许匿名用户创建目录。
anon_other_write_enable=[YES|NO] 是否开放匿名用户其他写入权限。
anon_max_rate=0 匿名用户最大传输速率(字节),0为不限制。
local_enable=[YES|NO] 是否允许本地用户登陆FTP。
local_umask=022 本地用户上传文件的umask值。
local_root=/var/ftp 本地用户的FTP根目录。
chroot_local_user=[YES|NO] 是否将用户权限禁锢在FTP目录,更加的安全。
local_max_rate=0 本地用户最大传输速率(字节),0为不限制。
四、配置vsftpd
vsftpd作为更加安全的FTP文件传输协议的服务程序,可以让用户分别通过匿名开放、本地用户和虚拟用户三种身份验证方式来登陆到FTP服务器上面。
1) 匿名访问模式
[root@vsftpdserver ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
[root@vsftpdserver ~]# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
[root@vsftpdserver ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
修改vsftpd.conf配置
[root@vsftpdserver ~]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
保存配置后重启服务,并设置服务开机自启动
[root@vsftpdserver ~]# service vsftpd restart
Shutting down vsftpd: [FAILED]
Starting vsftpd for vsftpd: [ OK ]
[root@vsftpdserver ~]# chkconfig vsftpd on
在客户端测试:
[root@ip-ftp_client ~]# ftp 192.168.198.141
Connected to 192.168.198.141 (192.168.198.141).
220 (vsFTPd 2.2.2)
Name (192.168.198.141:root): anonymous (用户名anonymous)
331 Please specify the password.
Password: (此次直接回车)
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
cd到pub目录,创建一个SYS目录
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir SYS
550 Create directory operation failed.
我们看到mkdir SYS 提示550 Create directory operation failed.(???fuck,什么原因??,前面我们设置 了anon_mkdir_write_enable=YES),原来FTP服务的匿名开放模式是默认登陆到了/var/ftp目录中,查看下这个目录的权限后才发现原来只有root管理员用户才有写入权限的,怪不得会提示写入出错呢,只需要把目录的所有者身份改成系统帐户ftp即可,这样就应该可以了~
[root@vsftpdserver ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 6 root root 4096 Mar 22 12:14 /var/ftp/pub
[root@vsftpdserver ~]# chown -Rf ftp /var/ftp/pub
[root@vsftpdserver ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 6 ftp root 4096 Mar 22 12:14 /var/ftp/pub
然后再创建几个目录看看行不行
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir SYS
257 "/pub/SYS" created
ftp> mkdir NET
257 "/pub/NET" created
ftp> mkdir CWB
257 "/pub/CWB" created
ftp>
回到服务端查看目录:
[root@vsftpdserver ~]# cd /var/ftp/pub
[root@vsftpdserver pub]# ll
total 12
drwxr-xr-x 2 ftp ftp 4096 Jul 19 20:35 CWB
drwxr-xr-x 2 ftp ftp 4096 Jul 19 20:35 NET
drwxr-xr-x 2 ftp ftp 4096 Jul 19 20:35 SYS
客户端上传文件:
ftp> cd /pub/SYS
250 Directory successfully changed.
ftp> put sys.text
local: sys.text remote: sys.text
227 Entering Passive Mode (192,168,198,141,95,201).
150 Ok to send data.
226 Transfer complete.
ftp> cd /pub/NET
250 Directory successfully changed.
ftp> put net.text
local: net.text remote: net.text
227 Entering Passive Mode (192,168,198,141,73,52).
150 Ok to send data.
226 Transfer complete.
ftp> cd /pub/CWB
250 Directory successfully changed.
ftp> put cwb.text
local: cwb.text remote: cwb.text
227 Entering Passive Mode (192,168,198,141,121,92).
150 Ok to send data.
226 Transfer complete
服务端查看:
[root@vsftpdserver pub]# cd NET
[root@vsftpdserver NET]# ll
total 0
-rw-r--r-- 1 ftp ftp 0 Jul 19 20:46 net.text
客户端测试下载:
现在服务端创建一个iphone.txt的文件
[root@vsftpdserver ~]# cd /var/ftp/pub
[root@vsftpdserver pub]# touch iphone.txt
[root@vsftpdserver pub]# ll
total 12
drwxr-xr-x 2 ftp ftp 4096 Jul 19 20:46 CWB
-rw-r--r-- 1 root root 0 Jul 19 20:53 iphone.txt
drwxr-xr-x 2 ftp ftp 4096 Jul 19 20:46 NET
drwxr-xr-x 2 ftp ftp 4096 Jul 19 20:45 SYS
客户端下载:
ftp> get iphone.txt
local: iphone.txt remote: iphone.txt
227 Entering Passive Mode (192,168,198,141,213,175).
150 Opening BINARY mode data connection for iphone.txt (0 bytes).
226 Transfer complete.
下载到对应目录
[root@ip-ftp_client iphone]# ll
总用量 0
-rw-r--r-- 1 root root 0 7月 18 16:56 iphone.txt
2)本地用户模式
本地用户模式是通过Linux系统本地的帐号密码信息进行的验证方式,这种模式相比较匿名开放模式来说比较安全,因此推荐既然开启了本地用户模式,就把匿名开放模式给关闭了吧~
a)编辑配置文件vsftpd.conf
[root@vsftpdserver ~]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
b)修改默认端口
默认FTP服务器端口号是21,出于安全目的,有时需修改默认端口号,修改/etc/vsftpd/vsftpd.conf,添加语句(例):listen_port=4449
[root@vsftpdserver ~]# vi /etc/vsftpd/vsftpd.conf
listen_port=4449
c)重启服务,并设置开机自启
[root@vsftpdserver ~]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
d)设置用户组
递归创建新目录
[root@vsftpdserver ~]# mkdir -p /home/SYS
新建组
[root@vsftpdserver ~]# groupadd SYS
新建用户SYS-01、SYS-02、SYS-03并指定家目录和属组
[root@vsftpdserver ~]# useradd -g SYS -d /home/SYS SYS-01
[root@vsftpdserver ~]# useradd -g SYS -d /home/SYS SYS-02
[root@vsftpdserver ~]# useradd -g SYS -d /home/SYS SYS-03
为新用户SYS-01、SYS-02、SYS-03设密码 (baidu.com@ip)
[root@vsftpdserver ~]# passwd SYS-01
Changing password for user SYS-01.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@vsftpdserver ~]# passwd SYS-02
Changing password for user SYS-02.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@vsftpdserver ~]# passwd SYS-03
Changing password for user SYS-03.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
设置目录属主为用户SYS-01
[root@vsftpdserver ~]# chown SYS-01 /home/SYS
设置目录属组为组SYS
[root@vsftpdserver ~]# chown .SYS /home/SYS
设置目录访问权限SYS-01为读,写,执行;SYS-02,SYS-03为读,执行
[root@vsftpdserver ~]# chmod 750 /home/SYS
使用SYS-01登陆到服务端:分别执行创建目录文件、重命名文件以及删除目录文件
[root@ip-ftp_client ~]# ftp 192.168.198.141 4449
Connected to 192.168.198.141 (192.168.198.141).
220 (vsFTPd 2.2.2)
Name (192.168.198.141:root): SYS-01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /home/SYS
250 Directory successfully changed.
ftp> mkdir SYS-01
257 "/home/SYS/SYS-01" created
ftp> rename SYS-01 SYS-01_database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir SYS-01_database
250 Remove directory operation successful.
使用SYS-02登陆到服务端:分别执行创建目录文件、重命名文件以及删除目录文件
[root@ip-ftp_client ~]# ftp 192.168.198.141 4449
Connected to 192.168.198.141 (192.168.198.141).
220 (vsFTPd 2.2.2)
Name (192.168.198.141:root): SYS-02
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,198,141,228,42).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jul 19 22:08 sys_log
226 Directory send OK.
tp> mkdir SYS-02
550 Create directory operation failed.
使用SYS-03登陆到服务端:分别执行创建目录文件、重命名文件以及删除目录文件
root@ip-ftp_client ~]# ftp 192.168.198.141 4449
Connected to 192.168.198.141 (192.168.198.141).
220 (vsFTPd 2.2.2)
Name (192.168.198.141:root): SYS-03
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /home/SYS
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,198,141,178,100).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jul 19 22:08 sys_log
226 Directory send OK.
ftp> mkdir SYS-03
550 Create directory operation failed.
由于本地用户登录FTP服务器后进入自己主目录,而SYS-01,SYS-02 SYS-03对主目录/home/SYS分配的权限不同,所以通过FTP访问的权限也不同,SYS-01访问权限为:上传,下载,建目录;SYS-02,SYS-03访问权限为下载,浏览,不能建目录和上传。实现了群组中用户不同访问级别,加强了对FTP服务器的分级安全管理。
3)虚拟用户模式
虚拟用户模式是一种相比较来说最为安全的验证方式,需要为FTP传输服务单独建立用户数据库文件,虚拟出用来口令验证的帐户信息,这些帐号是在服务器系统中不存在的,仅供FTP传输服务做验证使用,因此这样即便骇客破解出了帐号口令密码后也无法登录到服务器主机上面,有效的降低了破坏范围和影响。所以只要在配置妥当合理的情况下,虚拟用户模式要比前两种验证方式更加的安全,同时配置的流程也稍微会复杂一些。
第一步:创建用于进行FTP验证的帐号密码数据库文件,单数行为账户名,偶数行为密码,例如分别创建出support-01和support-02两个用户,密码均为baidu.com@ip
[root@vsftpdserver SYS]# cd /etc/vsftpd/
[root@vsftpdserver vsftpd]# vi vuser.list
support-01
baidu.com@ip
support-02
baidu.com@ip
明文信息既不安全,也不能让vsftpd服务程序直接读取,因此需要使用db_load命令用HASH算法将这个原始的明文信息文件转换成数据库文件,并且再把数据库文件权限调小一些(避免其他人能看到数据库文件的内容),然后再把原始的明文信息文件删除掉。
[root@vsftpdserver vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@vsftpdserver vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@vsftpdserver vsftpd]# chmod 600 vuser.db
[root@vsftpdserver vsftpd]# rm -f vuser.list
第2步:创建用于FTP服务存储文件的根目录以及虚拟用户映射的系统本地用户,FTP服务存储文件的根目录指的是当虚拟用户登陆后默认所在的位置,但在Linux系统中的每一个文件都是有所有者和所有组属性的,例如用support-01帐户创建了一个新文件,但是support-01这个用户在系统中是找不到的,就会导致Linux系统中这个文件权限出现错误。因此还需要再创建一个用来让虚拟用户映射的系统本地用户,简单来说就是让虚拟用户默认登陆到这个本地用户的家目录中,创建的文件属性也都归属于这个本地用户,避免本地Linux系统无法处理这种虚拟用户创建的文件属性权限。为了方便管理FTP资料,可以把这个用于虚拟用户映射的系统本地用户的家目录设置到/var目录中(因为该目录是用来存放经常发生改变的数据),并且为了安全起见把这个系统本地用户的终端设置成不允许登陆,这不会影响虚拟用户的使用 。
[root@vsftpdserver vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@vsftpdserver vsftpd]# ls -ld /var/ftproot/
drwx------ 4 virtual virtual 4096 Jul 19 22:38 /var/ftproot/
[root@vsftpdserver vsftpd]# chmod -Rf 755 /var/ftproot/
第3步:建立用于支持虚拟用户的PAM认证文件
[root@vsftpdserver vsftpd]# vi /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
第4步:在vsftpd服务程序主配置文件中修改PAM支持文件
[root@vsftpdserver vsftpd]# vi /etc/vsftpd/vsftpd.confanonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_port=4449
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
第5步:为虚拟用户设置不同的权限,虽然support-01和support-02两个帐户都是用于FTP服务验证的虚拟帐户,但也想在他们之间区别对待。比如只允许support-01用户能够上传、创建、修改、查看、删除文件,而support-02只能查看文件,这其实也是可以让vsftpd服务程序实现的,只需要新建一个目录,在里面分别创建两个以support-01和support-02命名的文件,其中在support-01命名的文件中写入相关允许的权限
[root@vsftpdserver vsftpd]# mkdir /etc/vsftpd/vusers_dir/
[root@vsftpdserver vsftpd]# cd /etc/vsftpd/vusers_dir/
[root@vsftpdserver vusers_dir]# touch support-02
[root@vsftpdserver vusers_dir]# vi support-01
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
再次修改下vsftpd主配置文件,添加user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径即可,为了让刚刚配置的服务程序新参数立即生效,需要把vsftpd再来重新启动一下,并加入到开机启动项中。
[root@vsftpdserver vusers_dir]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
pam_service_name=vsftpd.vu
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
user_config_dir=/etc/vsftpd/vusers_dir
listen_port=4449
userlist_enable=YES
tcp_wrappers=YES
[root@vsftpdserver vusers_dir]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@vsftpdserver vusers_dir]# chkconfig vsftpd on
客户端测试登陆support-02:
[root@ip-ftp_client ~]# ftp 192.168.198.141 4449
Connected to 192.168.198.141 (192.168.198.141).
220 (vsFTPd 2.2.2)
Name (192.168.198.141:root): support-02
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir support-02
550 Permission denied.
客户端测试登陆support-01:
[root@ip-ftp_client ~]# ftp 192.168.198.141 4449
Connected to 192.168.198.141 (192.168.198.141).
220 (vsFTPd 2.2.2)
Name (192.168.198.141:root): support-01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir support-01
257 "/support-01" created
ftp> rename support-01 support-01_log
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir support-01_log
250 Remove directory operation successful.