vsftp服务部署
vsftp简介
VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来,编制者的初衷是代码的安全。
安全性是编写VSFTP的初衷,除了这与生俱来的安全特性以外,高速与高稳定性也是VSFTP的两个重要特点。
在速度方面,使用ASCII代码的模式下载数据时,VSFTP的速度是Wu-FTP的两倍,如果Linux主机使用2.4.*的内核,在千兆以太网上的下载速度可达86MB/S。
在稳定方面,VSFTP就更加的出色,VSFTP在单机(非集群)上支持4000个以上的并发用户同时连接,根据Red Hat的Ftp服务器(ftp.redhat.com)的数据,VSFTP服务器可以支持15000个并发用户
ftp客户端和服务端连接方式如下图所示:

连接说明:ftp客户端和服务端连接方式为:1、命令连接/控制连接 2、数据连接。
只有当客户端和服务端通过服务端的21端口的控制连接建立后才可进行数据连接
相对于服务端数据连接又分为主动模式和数据模式。主动模式是服务端通过20端口去和客户端连接数据连接;被动模式为服务端在和客户端建立完控制连接后会产生一个数据连接的随机端口,然后客户端利用随机端口与这个服务端产生的随机端口建立数据连接。
ftpserver端使用被动模式的安全问题:
ftp server端的防火墙根据连接追踪形式来判断ftp客户端和服务端的控制连接是否已连接,如果已连接那么就可以放行与此控制连接相关联的数据连接,如果没有客户端和服务端没有建立控制连接,那么与之关联的数据建立也就不存在
数据传输模式:二进制和文本模式,那么客户端和服务器端到底用什么传输模式呢,这是由客户端和服务器端自动协商确定的,所以ftp传输模式为自动模式
ftp服务器端程序有:
linux系统的有:wu-ftpd、vsftpd(非常安全的ftp)、proftpd(功能比较多)、pureftpd、filezilla
windows端的有:serv-u、filezilla
ftp客户端程序:
命令格式:ftp、lftp
图形格式GUI:gftpd、FlashFXP、Cuteftp、filezilla(这个是免费的)
vsftpd是基于PAM实现用户认证
ftp的用户分为:
匿名用户--->映射为系统的ftp用户
系统用户--->ftp服务器创建的用户
虚拟用户--->需要映射为系统用户
vsftp部署及实践
安装vsftpd
[root@linux-node2 ~]# yum install -y vsftpd
配置vsftpd使匿名用户具有上传文件、创建文件夹、删除文件的权限并启动ftp服务
[root@linux-node2 ~]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES [root@linux-node2 vsftpd]# systemctl start vsftpd [root@linux-node2 vsftpd]# systemctl enable vsftpd
安装完vsftp后,会生成一个ftp用户,这个用户就是匿名用户,它的家目录默认被禁锢在/var/ftp目录下,这个目录是不允许匿名用户创建文件或文件夹或删除操作,只有进入此目录下的pub路径下才可创建文件或文件夹或删除操作,虽然配置文件中给与了匿名用户的权限,但pub目录还没有给与匿名用户的权限,所以要想让匿名用户有上传文件或创建文件夹或删除文件的权限,还要做如下操作:
[root@linux-node2 ~]# chmod 777 /var/ftp/pub/
这时候通过ftp 192.168.182.171登录ftp服务器,使用匿名用户anonymous或ftp就可在授予的权限内操作了,比如在pub目录下上传文件、删除文件、创建文件夹
启用本地用户并配置其禁锢在自己的家目录下,让其有上传和删除等权限
[root@linux-node2 ~]# vim /etc/vsftpd/vsftpd.conf local_enable=YES write_enable=YES local_umask=022 #设置本地上传的文件权限为644 创建文件夹的权限为755 chroot_local_user=YES #禁锢本地用户登录ftp后禁锢其家目录为跟目录/
配置好本地用户的权限后,重启vsftpd服务,创建两个本地用户用来测试:hadoop,hbase 当用其登录ftp服务器时报如下错误
vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
产生错误的原因:从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
解决错误办法:
1、可以用命令chmod a-w /home/hadoop去除用户主目录的写权限
2、在/etc/vsftpd/vsftpd.conf配置文件中添加一个参数:allow_writeable_chroot=YES
当然除了使用chroot_local_user=YES这个参数可以禁锢本地用户的家目录外,还可以使用下面这个两个参数来禁锢本地用户的家目录
#chroot_list_enable=YES #启用禁锢本地用户家目录 #chroot_list_file=/etc/vsftpd/chroot_list #这个参数必须和上面一个参数配合使用,意思是在chroot_list这个文件中定义的本地用户将被禁锢其家目录
配置文件中其他参数的使用
dirmessage_enable=YES #启用消息功能,意思只要在目录下创建一个.message文件,在这个文件中录入一些消息,那么在用户进入到这个目录后消息就会提示 xferlog_enable=YES #启用用户上传、下载的日志记录 xferlog_file=/var/log/vsftpd.log #用户操作的日志记录将会记录在这个日志文件中 listen=YES #开启ftp的独立守护进程模式,只要有一个用户连接ftp服务器,就会在服务端产生一个ftp进程,这个参数不能喝#listen_ipv6=YES同时使用,不然vsftpd启动不成功 max_clients=5000 #设置ftp服务端能支持的最大连接数 max_per_ip=100 #设置ftp服务端对相同ip地址ftp登录的最大连接数的设定
我们知道vsftpd是通过pam模块来进行用户认证的,那么为什么root本地用户不能登录呢,这就是pam模块定义的
[root@linux-node2 ~]# cat /etc/pam.d/vsftpd auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed [root@linux-node2 ~]# cat /etc/vsftpd/ftpusers # Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
设置本地用户的是否可以登录,可以通过下面的参数设定
#userlist_enable=YES #userlist_deny=YES #参数的值为YES意思在user_list文件中定义的用户将被禁止登录ftp,值为NO的话表示在user_list文件中定义的本地用户可以登录ftp,这个参数设置类似于设置白名单或黑名单的作用
当用户在登录ftp的时候,通过抓包命令可以查看到ftp用户登录的用户名和密码,所以说ftp登录默认是明文传输的,比如用hbase用户、密码hbase登录ftp可以看到用户名和密码。抓包命令入下:
tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 192.168.182.171
那么怎么让ftp传输数据是加密的呢,可以使用ftps的方式,因为ftps的连接方式为:ftp+ssl/tls方式
接下来在vsftpd.conf配置文件中添加下面参数,让ftp提供数据加密传输
[root@linux-node2 ~]# vim /etc/vsftpd/vsftpd.conf ssl_enable=YES ssl_tlsv1=YES ssl_sslv3=YES allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key
然后在服务端生成加密的证书和秘钥
[root@linux-node2 vsftpd]# cd /etc/pki/CA/ [root@linux-node2 CA]# touch index.txt [root@linux-node2 CA]# echo 01 > serial [root@linux-node2 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) [root@linux-node2 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650 Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:SH Locality Name (eg, city) [Default City]:ZZ Organization Name (eg, company) [Default Company Ltd]:goser Organizational Unit Name (eg, section) []:Tech Common Name (eg, your name or your server's hostname) []:ca.goser.com Email Address []: [root@linux-node2 CA]# mkdir /etc/vsftpd/ssl [root@linux-node2 CA]# cd /etc/vsftpd/ssl/ [root@linux-node2 ssl]# (umask 077;openssl genrsa -out vsftpd.key 2048) [root@linux-node2 ssl]# openssl req -new -key vsftpd.key -out vsftpd.csr Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:SH Locality Name (eg, city) [Default City]:ZZ Organization Name (eg, company) [Default Company Ltd]:goser Organizational Unit Name (eg, section) []:Tech Common Name (eg, your name or your server's hostname) []:ftp.goser.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: [root@linux-node2 ssl]# openssl ca -in vsftpd.csr -out vsftpd.crt
这样再用ftp用户登录ftp服务的时候,登录的用户名和密码都是加密的,数据传输也是加密的,可以通过上面的抓包命令再次查看即可
创建虚拟用户
使用虚拟用户登录ftp,这在生产环境中比较常用,虚拟用户通过pam认证并且通过mysql数据库来创建虚拟用户
这样就需要通过一个pam-mysql模块,接下来下载pam-mysql模块并安装:下载地址为:http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
1.安装开发环境及所需要程序
yum groupinstall -y "Development Tools" "Server PlatformDevelopment" yum install -y pam-devel mariadb-devel mariadb-server
2、启动服务:
systemctl start mariadb.service systemctl enable mariadb.service
3、编译安装pam_mysql-0.7RC1
tar xf pam_mysql-0.7RC1.tar.gz cd pam_mysql-0.7RC1 ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security make make install
4、创建虚拟用户账号
准备数据库及相关表
[root@linux-node2 pam_mysql-0.7RC1]# mysql
MariaDB [(none)]> create database vsftpd;
MariaDB [(none)]> use vsftpd;
MariaDB [vsftpd]> create table users( -> id smallint not null auto_increment primary key,
-> name char(20) not null unique key,
-> password char(48) not null);
MariaDB [vsftpd]> desc users;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | smallint(6) | NO | PRI | NULL | auto_increment |
| name | char(20) | NO | UNI | NULL | |
| password | char(48) | NO | | NULL | |
+----------+-------------+------+-----+---------+----------------+
MariaDB [vsftpd]> INSERT INTO vsftpd.users(name,password) VALUES ('tom','123456'),('jerry','123456');
MariaDB [vsftpd]> GRANT select ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'vsftpd';
MariaDB [vsftpd]> GRANT select ON vsftpd.* TO 'vsftpd'@'127.0.0.1' IDENTIFIED BY 'vsftpd';
MariaDB [vsftpd]> flush privileges;
重启mysql: systemctl restart mariadb.service
5、配置vsftpd
建立pam认证所需文件
vim /etc/pam.d/vsftpd.mysql auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0 account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0
建立虚拟用户映射的系统用户及对应的目录
mkdir /var/ftproot useradd -s /sbin/nologin -d /var/ftproot vuser
修改vsftpd的配置文件,使其适应mysql认证
vim /etc/vsftpd/vsftpd.conf pam_service_name=vsftpd.mysql guest_enable=YES guest_username=vuser anon_umask=022 #虚拟用户上传的文件为644权限,创建的文件夹为755权限
6、配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。
配置虚拟用户有单独的权限设定
vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/vusers_conf
创建所需目录,并为虚拟用户提供配置文件
mkdir /etc/vsftpd/vusers_conf cd /etc/vsftpd/vusers_conf #配置虚拟用户具有不同的访问权限: vim tom #写入如下内容 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES vim jerry anon_upload_enable=NO anon_mkdir_write_enable=NO anon_other_write_enable=NO
最后重启vsftpd服务:systemctl restart vsftpd 这样tom、jerry访问ftp的权限就不同了。
浙公网安备 33010602011771号