怎样安装vsftp

2017年4月19日 | 分类: 【技术】

【介绍】

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