FTP服务器之vsftpd
一、说明
因公司产品部运营需要,搭建一台FTP服务器。之前研究过server-u、FileZillaServer等软件,server-u为收费版,几年前装过一次破解版,网上下载的安软包被植入了病毒程序,整个服务器所有文件被锁死,人都傻了,自此不在相信破解、、、、。FileZillaServer虽是开源,使用界面和配置也都简洁易用,但底层同样需要Windows操作系统,在虚拟机上跑windows着实慢的要命,近期好像也出现了linux版本,但是官网下载的安装包没有安装程序(也许是我看不懂),也没有找到安装说明,就放弃了。本来不打算用vsftpd,主要是因为配置过程不亲民,维护起来也麻烦,但是考虑到linux的各种优点,一时间也懒得找其他的FTP软件,还是选择了这款牛批的服务器软件,等大概研究明白后,发现也没有多么复杂,真香。在此做个简单记录,后续研究。
使用vsftpd搭建FTP服务器一般3种模式
1)匿名开放模式:不安全的认证模式,无需密码验证直接登录到FTP服务器
2)本地用户模式:通过Linux系统本地的账号密码进行认证,如果被黑客破解了账户信息,可以畅通无阻登录FTP服务器,从而控制整台服务器
3)虚拟用户模式:需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息(需要借助系统pam.d模块),这些账户信息在服务器系统中实际是不存在的,只是供FTP服务程序进行认证使用,所有虚拟用户均映射为同一个系统账户
考虑到长期使用的安全性,这里使用虚拟用户模式进行配置(此模式也是最常用的模式,配置并不复杂)
二、安装和配置
1、vsftpd安装,万能的yum,注意自己去调本机防火墙端口,或者干脆关掉。
[root@server ~]# yum -y install vsftpd
[root@server ~]# systemctl start vsftpd.service
[root@server ~]# systemctl stop vsftpd.service
[root@server ~]# systemctl status vsftpd.service
2、主配置文件
[root@server]# vim /etc/vsftpd/vsftpd.conf
#禁止匿名开放模式
anonymous_enable=NO
#是否以独立运行的方式监听服务
listen=YES
##主服务端口和被动模式端口范围(被动模式数据端口1024以上)
listen_port=21
pasv_min_port=2121
pasv_max_port=2130
##被动模式开关及配置
pasv_enable=YES
pasv_addr_resolve=YES
## 是否屏蔽对pasv进行安全检查,为YES时,取消PORT安全检查。该检查确保外出的数据只能连接到客户端上(当有安全隧道时可禁用)
pasv_promiscuous=YES
##交互过程中服务器返回给客户端的数据下载地址,客户端连接此地址下载数据
pasv_address=192.168.100.240
## 注意:如果服务器需要发布到公网,此处应该填写公网服务器地址,并在防火墙上将对应的主端口和数据端口都发布到公网,否则默认返回服务器的私网地址,公网访问私网地址你懂的
## pasv_address=10.10.10.10
#IPv6是否监听
listen_ipv6=NO
#允许ascii文件上传和下载
ascii_upload_enable=YES
ascii_download_enable=YES
##全局ftp禁锢目录,即设定的FTP服务数据主目录
local_root=/ftp
#将用户限制在为其配置的主目录
chroot_local_user=YES
#允许本地用户登录FTP
local_enable=YES
#开启虚拟用户模式
guest_enable=YES
#指定虚拟用户映射的本地用户,此用户需手动创建
guest_username=ftpvirtual
#指定 PAM 文件,即虚拟用户账户密码库文件
pam_service_name=vsftpd.vu
#允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求
allow_writeable_chroot=YES
##虚拟用户权限配置文件目录,该目录下每个虚拟用户对应一个配置文件
user_config_dir=/etc/vsftpd/vusers_cfg
##本地用户最大传输速率(字节/秒),0为不限制
local_max_rate=0
## 最大客户端连接数,0为不限制
max_clients=0
##本地用户上传文件默认权限反掩码
local_umask=022
##虚拟用户上传文件默认权限反掩码,虚拟用户模式必须加入此参数
anon_umask=022
3、创建数据目录,创建宿主账户,并将此目录指定为宿主用户家目录(所有虚拟用户均映射为此本地用户)
mkdir /ftp useradd -d /ftp -s /bin/false ftpvirtual chown -R ftpvirtual:ftpvirtual /ftp
chmod -R 755 /ftp
3、pam.d认证文件配置
虚拟用户认证需要借助pam.d模块,vuser_list为虚拟用的账户-密码配置文件。
cat /etc/pam.d/vsftpd auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_list account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_list
4、创建虚拟用户列表文件,即上面pam.d需要调用的文件,FTP账号和密码文件
vim /etc/vsftpd/vuser_list
user1
user1_passwd
user2
user2_passwd
文件填写格式:奇数行为用户名,偶数行为密码。
pam.d模块需要读取db格式的库文件,使用如下命令将密码文件进行db格式的转化,
注意:如果需要修改ftp用户密码或者新增用户,需要重新执行该命令格式化此文件,并重启FTP服务
db_load -T -t hash -f /etc/vsftpd/vuser_list /etc/vsftpd/vuser_list.db chmod 600 /etc/vsftpd/vuser_list.db
5、编写user1的配置文件,允许user1上传、创建、修改、查看、删除文件
vim /etc/vsftpd/vusers_dir/user1
##是否允许写入
write_enable=YES
##是否只可读
anon_world_readable_only=NO
##是否允许上传
anon_upload_enable=YES
##是否允许新建目录
anon_mkdir_write_enable=YES
##是否允许修改目录/文件名称,删除
anon_other_write_enable=YES
##禁锢家目录,家目录映射,需手动创建目录并设置权限
##mkdir -p /ftp/user1
##chown -R ftpvirtual:ftpvirtual /ftp/user1
local_root=/ftp/user1
##匿名用户的最大传输速率(字节/秒),0为不限制
anon_max_rate=0
6、编写user2的配置文件,只允许user2查看,下载文件
vim /etc/vsftpd/vusers_dir/user2 ##是否允许写入 write_enable=NO ##是否只可读 anon_world_readable_only=YES ##是否允许上传 anon_upload_enable=NO ##是否允许新建目录 anon_mkdir_write_enable=NO ##是否允许修改目录/文件名称,删除 anon_other_write_enable=NO ##禁锢家目录,家目录映射,需手动创建目录并设置权限 ##mkdir -p /ftp/user2 ##chown -R ftpvirtual:ftpvirtual /ftp/user2 local_root=/ftp/user2 ##匿名用户的最大传输速率(字节/秒),0为不限制 anon_max_rate=0
7、注意事项
1)本次服务器采用虚拟用户模式,ftp用户均为虚拟用户,访问时会统一映射为本地用户ftpvirtual,因此ftp目录权限属主为ftpvirtual
2)虚拟用户列表保存在/etc/vsftpd/vuser_list文件中,此文件为明文临时文件,需要转换为pam的db格式,pam.d模块自动调用的db格式文件
3)如果用户列表文件/etc/vsftpd/vuser_list文件发生更改,需要使用db_load命令重新更新db文件并重启ftp服务才可生效
4)如果FTP需要发布到公网,请注意在网络出口防火墙上面映射FTP服务器相关端口,FTP被动模式数据端口可以指定一个动态范围(1024以上),该范围内的端口需要全部映射出去。另外说明一下为什么不用主动模式,因为主动模式下,数据传输端口由客户端定义,在交互过程中,客户端将本机开启的端口信息发给服务器21端口,数据由FTP服务器端推送到客户端的指定端口,局域网内传输是没问题的,但是如果发布到公网,对于客户端来讲,现在基本上都是NAT上网,客户端开启的随机端口,服务器端无法穿透客户端的路由器进行访问。