【介绍】
Vsftp(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器。
官网:https://security.appspot.com/vsftpd.html
【端口】
20 ftp-data File Transfer [Default Data] 文件传输协议(默认数据口) ,用来在链接建立后,传输数据用。
21 ftp File Transfer [Control] 文件传输协议(控制) ,用来传输控制信息
【安装】
文档:https://security.appspot.com/vsftpd/vsftpd_conf.html
查看是否已经安装vsftpd:
rpm -qa | grep vsftpd
yum安装3.0.2:
yum install vsftpd
设置开机启动:
chkconfig vsftpd on
输出:
Note: Forwarding request to 'systemctl enable vsftpd.service'. Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
卸载:
yum remove vsftpd
【配置】
参考:http://www.ilanni.com/?p=5341
参考:http://www.cnblogs.com/JemBai/archive/2009/02/05/1384413.html
参考:http://www.linuxidc.com/Linux/2014-11/109233.htm
参考:http://webjx.com/server/linux-32984.html
参考:http://www.cnblogs.com/yjken/p/3917937.html
vsftpd.conf 是vsftpd的配置文件,用来控制vsftpd的各项功能。默认位置是 /etc/vsftpd/vsftpd.conf 。
Vsftpd的实现有三种方式:
1. 匿名用户形式:在默认安装的情况下,系统只提供匿名用户访问
2. 本地用户形式:以/etc/passwd中的用户名为认证方式
3. 虚拟用户形式:支持将用户名和口令保存在数据库文件或数据库服务器中。
相对于FTP的本地用户形式来说,虚拟用户只是FTP服务器的专有用户,虚拟用户只能访问FTP服务器所提供的资源,需要用户名和密码才能获取FTP服务器中的文件。
最高权限的系统用户不能用root为用户名,因为vsftpd从安全角度考虑,拒绝root。
基于虚拟用户的配置:所谓虚拟用户就是没有使用真实的帐户,只是通过映射到真实帐户和设置权限的目的。虚拟用户不能登录CentOS系统。
Vsftp虚拟用户的原理是:把虚拟用户的权限映射到系统用户上。而虚拟用户的权限是有系统用户对目录的控制达到的。
如果安装上述要求的话,我们的思路是这样的:在系统中新建用户ailanni,使其对/www目录具有所有权。而修改其用户组,使其用户组对/www目录只具有查看、浏览权限。即可。
【方案1】
创建用户/用户组:
建立所需要的用户(注意该系统用户一定要建立家目录,否则在后边无法登陆FTP服务器。):
useradd ftpuser1 useradd ftpuser2
查看用户所属的用户组:
id ftpuser1 id ftpuser2
输出:
uid=1003(ftpuser1) gid=1003(ftpuser1) groups=1003(ftpuser1) uid=1004(ftpuser2) gid=1004(ftpuser2) groups=1004(ftpuser2)
可以看到目前ftpuser1用户属于ftpuser1用户组,ftpuser2用户属于ftpuser2用户组。要达到ftpuser2对www目录具有浏览、上传权限。我们需要把该用户加入到ftpuser1用户组,通过这样控制相关权限:
usermod -G ftpuser1 ftpuser2
用户建立完毕,我们现在来创建/www目录,并修改其相关的属性。
实际FTP目录形如:/usr/local/apache2/htdocs/goldgeese.com/zzba.com/uploads
mkdir /www
查看目录权限:
ls -la /www/
输出:
total 8 drwxr-xr-x 2 root root 4096 May 11 01:07 . dr-xr-xr-x 20 root root 4096 May 11 01:07 ..
查看目录权限:
cd .. && ll
输出:
total 2097448 ... drwxr-xr-x 2 root root 4096 May 11 01:07 www
目前www目录,所属的用户及用户组为root。现在来进行修改,修改ftpuser1用户具有所有权限,ftpuser1用户组具有浏览、权限,其他用户组没有任何权限。把www目录的权限修改为750如下图:
chown -R ftpuser1:ftpuser1 /www chmod -R 750 /www
相关系统用户及其相关权限设置完毕。
配置vsftpd
切换到vsftpd的安装目录,编辑配置文件 /etc/vsftpd/vsftpd.conf :
pasv_enable=YES pasv_min_port=30000 pasv_max_port=31000 chroot_local_user=YES chroot_list_enable=NO guest_enable=YES user_config_dir=/etc/vsftpd/vu pam_service_name=vsftpd.virtual
创建vsftpd虚拟用户账号的配置目录:
mkdir /etc/vsftpd/vu
创建Vsftpd的虚拟用户,把这些用户名和密码存放在一个文件 /etc/vsftpd/login.txt 。该文件内容格式是:奇行是用户名,偶行是密码,末尾空一行:
vuser1 123456 vuser2 123456
安装Berkeley DB工具,找不到db_load的问题就是没有安装这个包:
yum install db4 db4-utils
生成虚拟用户认证的db文件:
db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
如果报错:
db_load: BDB5090 unexpected end of input data or key/data pair db_load: BDB5079 odd number of key/data pairs
请在login.txt 最后一行添加空行,即回车一下。重新执行命令即正常。
为了使服务器能够使用上述生成的数据库文件,对客户端进行身份验证,需要调用系统的PAM模块。PAM(Plugable Authentication Module)为可插拔认证模块,不必重新安装应用系统,通过修改指定的配置文件,调整对该程序的认证方式。PAM模块配置文件路径为/etc/pam.d/目录,此目录下保存着大量与认证有关的配置文件,并以服务名称命名。
编辑认证文件/etc/pam.d/vsftpd:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/login account required /lib64/security/pam_userdb.so db=/etc/vsftpd/login
db=/etc/vsftpd/login 指定了验证库函数将到这个指定的数据库中调用数据进行验证。其实该文件指的是 /etc/vsftpd/login.db 文件,需要去掉.db后缀。
PAM配置完毕后,创建虚拟用户与系统用户对应的文件。切换到 /etc/vsftpd/vu 目录下,并创建 vuser1 文件。注意该文件名称一定要与 login.txt 中的虚拟用户要对应。
guest_username=vuser1 local_root=/www/ virtual_use_local_privs=YES anon_umask=133
anon_umask表示文件上传的默认掩码。计算方式是777减去anon_umask就是上传文件的权限。在此我们设置的是133,也就是说上传后文件的权限是644。即上传的文件对所属用户来说只有读写权限,没有执行权限。
启动vsftpd服务:
service vsftpd start
问题来了:
ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): uploader 331 Please specify the password. Password: 530 Login incorrect. Login failed. ftp>
尝试配置多次,依然是“530 Login incorrect.”。怎解?
【方案2】
做如下配置:
anonymous_enable=NO //设定不允许匿名访问 local_enable=YES //设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问 chroot_list_enable=YES //使用户不能离开主目录 ascii_upload_enable=YES ascii_download_enable=YES //设定支持ASCII模式的上传和下载功能 pam_service_name=vsftpd //PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证
以下这些是关于vsftpd虚拟用户支持的重要配置项,默认vsftpd.conf中不包含这些设定项目,需要自己手动添加
guest_enable=YES //设定启用虚拟用户功能 guest_username=ftp //指定虚拟用户的宿主用户,CentOS中已经有内置的ftp用户了 user_config_dir=/etc/vsftpd/vuser_conf //设定虚拟用户个人vsftp的CentOS FTP服务文件存放路径。存放虚拟用户个性的CentOS FTP服务文件(配置文件名=虚拟用户名
进行认证:
安装Berkeley DB工具,很多人找不到db_load的问题就是没有安装这个包:
yum install db4 db4-utils
创建用户密码文本 /etc/vsftpd/vuser_passwd.txt ,注意奇行是用户名,偶行是密码:
uploader 123456
生成虚拟用户认证的db文件:
db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db
如果报错:
db_load: BDB5090 unexpected end of input data or key/data pair db_load: BDB5079 odd number of key/data pairs
请在 vuser_passwd.txt 最后一行添加空行,即回车一下。重新执行命令即正常。
编辑认证文件/etc/pam.d/vsftpd:
全部注释掉原来语句,再增加以下两句:
auth required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd account required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd
参考:http://blog.itpub.net/751371/viewspace-1079151/
参考:https://linux.die.net/man/8/pam_userdb
创建虚拟用户配置文件:
mkdir /etc/vsftpd/vuser_conf/ vi /etc/vsftpd/vuser_conf/uploader //文件名等于vuser_passwd.txt里面的账户名,否则下面设置无效
内容如下:
local_root=/ftp/www //虚拟用户根目录,根据实际情况修改 write_enable=YES //可写 anon_umask=022 //掩码 anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
设置Selinux:
setsebool -P ftp_home_dir=1 //设置ftp可以使用home目录 sersebool -P allow_ftpd_full_access=1 //设置ftp用户可以有所有权限
设置FTP根目录权限
mkdir /ftp && mkdir /ftp/www && chmod -R 755 /ftp && chmod -R 777 /ftp/www
最新的vsftpd要求对主目录不能有写的权限所以ftp为755,主目录下面的子目录再设置777权限。
配置PASV模式:
vsftpd默认没有开启PASV模式,现在FTP只能通过PORT模式连接,要开启PASV默认需要通过下面的配置
打开/etc/vsftpd/vsftpd.conf,在末尾添加
pasv_enable=YES //开启PASV模式
pasv_min_port=40000 //最小端口号
pasv_max_port=40080 //最大端口号
pasv_promiscuous=YES
在防火墙配置内开启40000到40080端口
设置防火墙:
CentOS 7中默认使用Firewalld做防火墙。
参考:http://jingyan.baidu.com/article/5552ef47f509bd518ffbc933.html
参考:https://segmentfault.com/a/1190000003931716
Firewalld中添加端口方法如下:
firewall-cmd --zone=public --add-port=21/tcp --permanent firewall-cmd --reload
启动FTP服务器:
service vsftpd start
就可以访问你的FTP服务器了。
【为FTP绑定域名】
1. DNS设置
参考:https://superuser.com/questions/566934/add-ftp-server-to-a-subdomain
例如:ftp://192.168.10.10,想要换成域名 ftp://ftp.abc.com访问
把对应的地址 ftp.abc.com 设置A记录解析到 192.168.10.10 即可。
Create a Host A record in DNS manager with name ftp to your IP of FTP server. OR
Assign a CNAME to www.domain.com with name ftp
2. 服务器端设置
应该在vsftp的配置文件 vsftpd.conf 中指定?还是不需要设置?
【为FTP绑定证书】
参考:https://www.digitalocean.com/community/tutorials/how-to-configure-vsftpd-to-use-ssl-tls-on-a-centos-vps
参考:https://wordpress.youran.me/%e9%85%8d%e7%bd%aevsftpd%e4%bd%bf%e7%94%a8ssl%e5%8a%a0%e5%af%86/
参考:https://bbs.aliyun.com/read/261025.html
1. 生成密钥和证书
参考:https://amon.org/letsencrypt
生成 server.key 密钥和 server.crt 证书。
2. 将密钥和证书加在一起生成vsftpd需要的pem文件
cat server.key > /etc/vsftpd/server.pem cat server.crt >> /etc/vsftpd/server.pem
3. 配置SSL
ssl_enable=YES force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=YES rsa_cert_file=/etc/vsftpd/server.pem
这里只强制本地用户使用SSL登录,没有强制匿名用户使用SSL登录。
4. 重启vsftpd,如果没有出错的话,那么就可以测试用户SSL连接了。
通过源码编译安装3.0.3:
参考:http://blog.csdn.net/webdesman/article/details/1913496
没有configure这个东西,貌似不能指定安装路径。
wget https://security.appspot.com/downloads/vsftpd-3.0.3.tar.gz && tar -xzvf vsftpd-3.0.3.tar.gz && cd vsftpd-3.0.3 make make install cp vsftpd.conf /etc/ cp RedHat/vsftpd.pam /etc/pam.d/ftp
在 make 时 报错:
/usr/bin/ld: cannot find -lcap
然而系统中已经安装有libcap:
Package libcap-2.22-8.el7.x86_64 already installed and latest version
再想想。
【参考资料】
参考:http://www.sudu.cn/info/html/edu/network/20070101/296435.html
参考:http://www.sudu.cn/service/detail.php?id=11656
参考:http://www.cnblogs.com/hhuai/archive/2011/02/12/1952647.html
参考:http://www.cnblogs.com/itech/archive/2012/09/16/2687378.html
参考:http://fantasy0707.iteye.com/blog/865228
参考:http://www.linuxidc.com/Linux/2014-11/109233.htm
参考:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/3/html/Reference_Guide/s1-ftp-vsftpd-conf.html
参考:https://www.digitalocean.com/community/tutorials/how-to-set-up-vsftpd-on-ubuntu-12-04