FTP(File transfer Protocl),文件传输协议,用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式,属于网络传输协议的应用层。FTP服务运行在TCP/21和20端口,一般来讲21端口是链接端口,20端口是数据端口。数据库
FTP有两种工做模式,主动模式和被动模式:vim
客户端发起请求:
Client:50000(大于1023的端口号) –> Server: 21
服务端创建数据传输:
Server: 20/tcp –> Client: 50000+1(客户端请求端口号+1)安全
客户端发起请求:
Client:50000(大于1023的端口号) –> Server: 21
客户端创建数据传输:
Client:50000+1(客户端请求端口号+1) –> Server: 随机端口服务器
[root@server ~]# lsb_release -r
Release: 7.2.1511
[root@server ~]# yum -y install vsftpd
[root@server ~]# rpm -qi vsftpd
Name : vsftpd
Version : 3.0.2
Release : 22.el7
Architecture: x86_64
主程序:/usr/sbin/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
数据根目录:/var/ftp
Systemd Unit File:/usr/lib/systemd/systemd/vsftpd.service
禁止登录用户列表:/etc/vsftpd/ftpusers
用户列表:/etc/vsftpd/user_list网络
anonymous_enable=YES #是否容许匿名用户访问 local_enable=YES #是否容许本地用户登陆FPT write_enable=YES #是否容许写入权限 local_umask=022 #本地用户上传文件的umask值 dirmessage_enable=YES #是否在用户进入某个目录时显示该目录的注意信息 xferlog_enable=YES #是否让FTP服务器记录上传下载的状况 connect_from_port_20=YES #是否使用20端口进行数据传输 xferlog_std_format=YES #是否将记录的上传下载状况写在xferlog_file所指定的文件中 listen=NO #是否以独立运行的方式监听服务 listen_ipv6=YES #是否支持ipv6 pam_service_name=vsftpd #列出与vsftpd相关的pam文件 userlist_enable=YES #是否启用禁止登陆用户名单 tcp_wrappers=YES #是否支持tcp_wrappers
除以上默认使用的参数外,主配置文件还能够设置如下参数: 定义匿名用户的ftp共享权限: anon_world_readable_only =YES #是否全局可读 anon_upload_enable=NO #是否容许上传文件 anon_mkdir_write_enable=NO #是否容许建立目录 anon_other_write_enable=NO #是否删除文件、删除目录 anon_umask=077 #匿名用户的umask 定义系统用户的ftp权限: local_enable=YES #容许本地用户访问(/etc/passwd中的用户) write_enable=YES #容许写入权限,包括修改,删除 local_umask=022 #定义本地用户上传的文件的umask chroot_local_user=YES #是否禁锢全部本地用户于其家目录 chroot_list_enable=YES #是否启用chroot_list_file的名单 chroot_list_file=/etc/vsftpd/chroot_list #是否限制在主目录下的用户名单 注意:当chroot_local_user=YES和chroot_list_enable=YES时,chroot_list中的用户都是不受限制的用户;当chroot_local_user=NO和chroot_list_enable=YES时,chroot_list中的用户都是受限制的用户。 控制可登录vsftpd服务的用户列表: userlist_enable=YES #启用/etc/vsftpd/user_list文件来控制可登录用户; userlist_deny=NO #NO意味着/etc/vsftpd/user_list为白名单,YES为黑名单 上传下载速率: anon_max_rate=0 #匿名用户的最大上传下载速率,0表示无限制 local_max_rate=0 #本地用户的最大上传下载速率,0表示无限制 并发链接数限制: max_clients=2000 #standalone下最大的并发链接数 max_per_ip=50 #设置单个IP的最大链接数
注意:经过 man vsftpd.conf 能够获取更多参数信息。
vsftp服务为ftp提供了3种认证方式,分别是:匿名用户认证、本地用户认证和虚拟用户认证。匿名用户认证是指任何人无需认证便可访问到FTP服务器;本地用户认证在Linux系统中是指/etc/passwd中的用户;虚拟用户认证是指使用vsftp服务独立维护的FTP帐号密码进行登陆访问。从安全性来讲虚拟用户是最安全的,由于就算FTP的帐号密码泄露了,也不会泄露本地的用户帐号密码。并发
vsftp服务默认就开启了匿名用户登陆,此处修改配置文件/etc/vsftpd/vsftpd.conf:app
# 备份配置文件 [root@server ~]# cp /etc/vsftpd/vsftpd.conf{,.bak}
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
[root@server ~]# setenforce 0
[root@server ~]# systemctl stop vsftpd.service
[root@server ~]# systemctl start vsftpd
[root@server ~]# ss -tan
LISTEN 0 32 :::21 :::*
LISTEN 0 128 :::22 :::*
客户端进行测试:tcp
[root@client ~]# lftp 192.168.4.119
lftp 192.168.4.119:~> ls
drwxr-xr-x 2 0 0 6 Aug 03 2017 pub
lftp 192.168.4.119:/> cd pub/
lftp 192.168.4.119:/pub> mkdir test
mkdir: Access failed: 550 Create directory operation failed. (test)
lftp 192.168.4.119:/pub> exit
建立test目录失败。匿名用户的默认路径即为ftp用户的家目录/var/ftp,虽然咱们已经配置了anon_mkdir_write_enable=YES,但ftp用户的真正权限是vsftpd.conf定义的共享权限与访问的目录的权限的交集,所以咱们须要去修改/var/ftp/pub目录的文件权限:ide
[root@server ~]# ll -d /var/ftp/pub
drwxr-xr-x. 2 root root 6 Aug 3 2017 /var/ftp/pub
[root@server ~]# chown ftp:ftp /var/ftp/pub/
[root@server ~]# ll -d /var/ftp/pub
drwxr-xr-x. 2 ftp ftp 6 Aug 3 2017 /var/ftp/pub
注意,不能直接修改/var/ftp的属主属组为ftp,否则客户端从新匿名登陆ftp时,会出现报错:500 OOPS: vsftpd: refusing to run with writable root inside chroot()
从新登陆测试:测试
[root@\client ~]# lftp 192.168.4.119 lftp 192.168.4.119:~> cd pub/ lftp 192.168.4.119:/pub> mkdir test mkdir ok, `test' created lftp 192.168.4.119:/pub> lcd /etc #切换客户端的目录 lcd ok, local cwd=/etc lftp 192.168.4.119:/pub> put passwd 2538 bytes transferred lftp 192.168.4.119:/pub> ls -rw------- 1 14 50 2538 Jun 27 05:44 passwd drwx------ 2 14 50 6 Jun 27 05:43 test lftp 192.168.4.119:/pub> rm passwd rm ok, `passwd' removed lftp 192.168.4.119:/pub> rmdir test rmdir ok, `test' removed lftp 192.168.4.119:/pub> exit
编辑主配置文件/etc/vsftp/vsftp.conf:
[root@server ~]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 userlist_enable=YES userlist_deny=NO 注意:当userlist_enable=YES而userlist_deny=NO时,/etc/vsftpd/user_list为白名单;当userlist_enable=YES和userlist_deny=YES时,/etc/vsftpd/user_list为黑名单
编辑/etc/vsftpd/user_list:
[root@server ~]# vim /etc/vsftpd/user_list testftp [root@server ~]# useradd testftp [root@server ~]# echo 123456 | passwd --stdin testftp [root@server ~]# systemctl restart vsftpd
客户端测试:
[root@\client ~]# lftp 192.168.4.119 -u testftp Password: lftp testftp@192.168.4.119:~> lcd /etc lcd ok, local cwd=/etc lftp testftp@192.168.4.119:~> put passwd 2538 bytes transferred lftp testftp@192.168.4.119:~> mkdir test mkdir ok, `test' created lftp testftp@192.168.4.119:~> ls -rw-r--r-- 1 1001 1001 2538 Jun 27 07:04 passwd drwxr-xr-x 2 1001 1001 6 Jun 27 07:04 test lftp testftp@192.168.4.119:~> rm passwd rm ok, `passwd' removed lftp testftp@192.168.4.119:~> rmdir test rmdir ok, `test' removed lftp testftp@192.168.4.119:~> lcd / lcd ok, local cwd=/ lftp testftp@192.168.4.119:~> cd /etc #切换到服务器的/etc目录 cd ok, cwd=/etc lftp testftp@192.168.4.119:/etc> get passwd #获取服务器的/etc/passwd 2583 bytes transferred lftp testftp@192.168.4.119:/etc> exit
本地用户能切换到/etc目录可以下载passwd文件,存在极大风险,所以咱们须要把本地用户的访问路径限制在其对应的家目录下:
[root@server ~]# vim /etc/vsftpd/vsftpd.conf chroot_local_user=YES allow_writeable_chroot=YES #chroot_list_file=/etc/vsftpd/chroot_list 经过文件指定禁锢的用户 注意:从2.3.5以后,vsftpd加强了安全检查,若是用户被限定在了其主目录下,则该用户的主目录不能再具备写权限了,客户端执行写操做时会出现提示:500 OOPS: vsftpd: refusing to run with writable root inside chroot()。
此时若是还想能在对主目录拥有写权限,可使用allow_writeable_chroot=YES。
客户端测试:
[root@\client ~]# lftp 192.168.4.119 -u testftp
Password:
lftp testftp@192.168.4.119:~> cd /etc cd: Access failed: 550 Failed to change directory. (/etc)
lftp testftp@192.168.4.119:/> lcd /etc
lcd ok, local cwd=/etc
lftp testftp@192.168.4.119:/> put passwd
2538 bytes transferred
lftp testftp@192.168.4.119:/> mkdir test
mkdir ok, `test' created
lftp testftp@192.168.4.119:/> rm passwd
rm ok, `passwd' removed
lftp testftp@192.168.4.119:/> rmdir test
rmdir ok, `test' removed
lftp testftp@192.168.4.119:/> exit
虚拟用户认证所使用的帐号和密码都不是服务器中真实存在的,其安全性比本地用户更好,即便被抓包获取到帐号密码都没法直接登陆到服务器。配置虚拟用户的流程以下:
1)创建虚拟用户数据库文件
2)建立根目录及虚拟用户映射的系统用户
3)创建支持虚拟用户的PAM认证文件
4)在vsftpd.conf中添加支持配置
5)为虚拟用户设置不一样的权限
1)创建虚拟用户数据库文件
[root@ftp ~]# vim /etc/vsftpd/vuser #格式:一行帐号名,一行密码
test1
123456
test2
12345678
[root@ftp ~]# db_load -T -t hash -f /etc/vsftpd/vuser /etc/vsftpd/vuser.db #使用db_load命令生成数据库文件
[root@ftp ~]# chmod 600 /etc/vsftpd/vuser.db
[root@ftp ~]# rm /etc/vsftpd/vuser
2)建立根目录及虚拟用户映射的系统用户
[root@server ~]# useradd -d /var/vftp -s /sbin/nologin vftp [root@server ~]# chmod -R 755 /var/vftphome
3)创建支持虚拟用户的PAM认证文件
[root@server ~]# vim /etc/pam.d/vsftpd.virtual auth required pam_userdb.so db=/etc/vsftpd/vuser #检查帐号及密码,数据库不须要写后缀.db account required pam_userdb.so db=/etc/vsftpd/vuser #检查用户是否在有效期内
4)在vsftpd.conf中添加支持配置
[root@server ~]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=NO #禁止匿名登陆 local_enable=YES #容许本地用户模式,因为映射的系统用户为本地用户,所以此项必须开启 guest_enable=YES #开启虚拟用户模式 guest_username=vftp #指定虚拟用户帐号映射到本地帐号vftp pam_service_name=vsftpd.virtual #指定pam文件 chroot_local_user=YES #禁锢用户在其家目录 allow_writeable_chroot=YES #容许禁锢的FTP根目录可写 user_config_dir=/etc/vsftpd/vuser_profile #指定虚拟用户的权限配置目录 userlist_enable=YES userlist_deny=YES
5)为虚拟用户设置不一样的权限
[root@server ~]# mkdir /etc/vsftpd/vuser_profile [root@server ~]# vim /etc/vsftpd/vuser_profile/test1 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES anon_umask=022 [root@server ~]# vim /etc/vsftpd/vuser_profile/test2 local_root=/vftp/test2 anon_umask=022 anon_mkdir_write_enable=YES anon_upload_enable=YES anon_other_write_enable=YES [root@ftp ~]# mkdir -pv /vftp/test2
[root@ftp ~]# chown vftp:vftp /vftp/test2 [root@ftp ~]# systemctl restart vsftpd
客户端测试:
#用户test1 [root@\client ~]# lftp 192.168.4.119 -u test1 Password: lftp test1@192.168.4.119:~> lcd /etc lcd ok, local cwd=/etc lftp test1@192.168.4.119:~> put passwd 2538 bytes transferred lftp test1@192.168.4.119:/> mkdir test mkdir ok, `test' created lftp test1@192.168.4.119:/> ls -rw-r--r-- 1 1002 1002 2538 Jun 27 09:40 passwd drwxr-xr-x 2 1002 1002 6 Jun 27 09:40 test lftp test1@192.168.4.119:/> rm passwd rm ok, `passwd' removed lftp test1@192.168.4.119:/> rmdir test/ rmdir ok, `test/' removed lftp test1@192.168.4.119:/> cd /etc cd: Access failed: 550 Failed to change directory. (/etc) lftp test1@192.168.4.119:/> exit 注意:test1的目录路径:/var/vftp,即 服务器建立的系统用户vftp家目录。 #用户test2 [root@\client ~]# lftp 192.168.4.119 -u test2 Password: lftp test2@192.168.4.119:~> lcd /etc lcd ok, local cwd=/etc lftp test2@192.168.4.119:~> put passwd 2538 bytes transferred lftp test2@192.168.4.119:/> mkdir test mkdir ok, `test' created lftp test2@192.168.4.119:/> ls -rw-r--r-- 1 1002 1002 2538 Jun 27 09:46 passwd drwxr-xr-x 2 1002 1002 6 Jun 27 09:46 test lftp test2@192.168.4.119:/> rm passwd rm ok, `passwd' removed lftp test2@192.168.4.119:/> rmdir test/ rmdir ok, `test/' removed lftp test2@192.168.4.119:/> put fstab 477 bytes transferred lftp test2@192.168.4.119:/> lcd / lcd ok, local cwd=/ lftp test2@192.168.4.119:/> get fstab 477 bytes transferred lftp test2@192.168.4.119:~> cd /etc cd: Access failed: 550 Failed to change directory. (/etc) lftp test2@192.168.4.119:/> exit