FTP简介
在介绍vsftp相关内容前,简单描述下FTP。FTP全称File Transfer Protocol,文件传输协议。
它是一个C/S架构的协议,在Linux中其服务端实现主要有vsftpd,pureftpd,proftpd,Filezilla,本文主要介绍的是vsftp。客户端实现主要是ftp和lftp两种工具。
其工作方式:主要分为两个层面的连接:命令连接和数据连接。通过ftp客户端向服务端发送相关指令,然后服务器对客户端的请求进行响应,这是命令连接。在数据连接层面则主要负责完成数据传输会话的建立,维持和断开。
数据连接的工作模式又分为两种类型:
-
主动模式(PORT)
服务器向客户端发起数据传输请求,连接建立后开始传输数据。但是客户端可能有防火墙设置,而不让服务器主动向其端口发送连接请求,从而连接无法建立,数据传输失败。在这种模式中服务器端使用tcp的20端口连接客户端的端口,客户端端口为命令连接发起端口+1的端口,依次往后找找,直到找到一个可用的端口。 -
被动模式(Passive)
客户端向服务器发送数据传输请求,服务器侧的端口半随机选择。在命令连接建立后的回复消息中,服务器会将数据连接要使用的端口以两个数字的形式告诉客户端,一般形为(123,221),客户端通过公式:123*256+221得到31709,从而与服务器的31709端口建立数据连接开始传输数据。这一端口信息在Linux中通过ftp工具连接服务器时即可看到,形如:227 Entering Passive Mode (192,168,1,200,103,163)
,这里的服务器侧的端口即为26531。
数据传输格式一般有ASCII和Binary两种,但一般最好让客户端和服务端自协商确实,不要在客户端强制设置,除非确定要传输的数据的格式,避免数据传输过程中出现乱码。
FTP的用户类型
FTP是给不同的用户提供文件传输服务的,每一个或每一类用户都可以设置不同的权限,他们的资源默认也都存储在他们各自的家目录中。FTP的用户分为以下三种类型:
-
匿名用户
这类用户在ftp上可以统称为anonymous,只要FTP允许匿名登录,在登录时输入用户名:anonymous,提示输入密码时留空,然后即可登录到FTP服务器上。FTP默认允许匿名用户登录。匿名用户一般被映射至某固定的系统用户,如ftp,其家目录为/var/ftp,登录后pwd显示为/,非系统的根,而是指ftp资源的根。 -
本地用户
本地用户即是指/etc/passwd中存在的用户。他们登录系统以后会位于自己的家目录中。默认情况下除了列于/etc/vsftpd/user_list中的用户之外的本地用户都可以登录ftp。 -
虚拟用户
虚拟用户的用户名不存在于/etc/passwd中,它的实现需要借助于pam_mysql这一模块,让vsftpd可以去mysql数据库中读取ftp用户的信息(用户名和密码)。默认情况下虚拟用户的权限等同于匿名用户。
vsftp的安装(CentOS 7)
-
vsftp安装前准备
-
关闭系统防火墙:(不关闭的话,若懂得如何放行ftp通信也完全可以_)
systemctl stop firewalld.service
systemctl disable firewalld.service
#关闭防火墙开机自启 -
确认SELinux的状态
getenforce
,非enforcing即可。setenforce 0
#立即关闭SELinux,重启失效 -
安装vsftp
yum -y install vsftpd
-
检查安装结果
rpm -ql vsftpd
列出vsftpd包安装后系统中生成的文件,包含文件的执行程序(如/usr/sbin/vsftpd),配置文件(如/etc/vsftpd/vsftpd.conf),参考手册,还有用于匿名用户访问的/var/ftp及/var/ftp/pub目录等。systemctl start vsftpd.service
启动vsftpd服务ss -tnlp
查看21端口是否处于监听状态,且占用进程为vsftpd。 -
验证匿名用户是否可登录
使用ftp
或者lftp
指令匿名登录,ftp
工具在(ftp127.0.0.1)后出现提示询问用户名时输入:anonymous,密码留空即可。lftp
工具指令( lftp -u anonymous, 127.0.0.1)即不用单独在输入用户名和密码。
借助pam_mysql实现虚拟用户机制
ftp的虚拟用户机制实际是指给不同的用户创建不同的用户名,他们有各自的密码,但这些用户名统一映射为一个自定义的虚拟用户,这个虚拟用户实际存在于/etc/passwd中但无需配置密码,针对这些不同的用户的认证都借助于存储在mysql数据库中的用户名和密码来实现。具体实现步骤如下:
-
先下载pam_mysql源码安装包
pam_mysql-0.7RC1.tar.gz
常用搜索引擎即可找到其下载页面。 -
准备编译安装的环境
yum groupinstall "Development Tools" "Server Platform Development"
#这些是系统全局编译需要安装的包yum -y install mariadb-server mariadb-devel openssl-devel pam-devel
#这些是编译pam_mysql源码依赖的包 -
在mariadb中创建用于存储虚拟用户账户的数据库及表
systemctl status mariadb.service
#启用mariadb server服务systemctl enable mariadb.service
#设置mariadb server开机自启create database vsftpd;
#创建名为vsftpd的数据库use vsftpd
#切换到vsftpd数据库中create table users ( id int AUTO_INCREMENT NOT NULL PRIMARY KEY,
name char(30) NOT NULL, password char(48) binary NOT NULL );
#指定表的内容包含id(整形数字,自动递增,不能为空,设为主键),name(长度不超过30且不区分大小写,非空字符),password(长度不超过48的区分大小写的非空字符)。创建完成后可使用如下指令,查看表的结构:
desc users;
-
在表中创建若干虚拟用户
INSERT INTO users(name,password) VALUES ('tom',password('mageedu'))
#添加用户tom,密码为mageeduINSERT INTO users(name,password) VALUES ('jerry',password('mageedu.com'));
#添加用户jerry,密码为mageedu.comselect * from users;
#查看表中的所有信息GRANT select ON vsftpd.* TO vsftpd@'localhost' IDENTIFIED BY 'mageedu';
#授权“vsftpd@localhost”,可以使用密码mageedu访问数据库vsftpd的所有表GRANT select ON vsftpd.* TO vsftpd@'127.0.0.1' IDENTIFIED BY 'mageedu';
#授权“vsftpd@127.0.0.1”,可以使用密码mageedu访问数据库vsftpd的所有表flush privileges;
#刷新mariadb的权限表
然后使用刚授权的vsftpd用户直接在mariadb上登录,然后查看users表的内容,以确认mariadb部分的配置无误。 -
编译安装pam_mysql模块
这里是源码安装的通用三步,只是在configure时需要指定一些选项,以便编译成功。./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
make && make install
编译安装成功后会在/lib64/security
中生成pam_mysql.so
和pam_mysql.la
文件。 -
在系统中创建用于虚拟用户映射的用户
useradd -s /sbin/nologin -d /ftproot vuser
#创建一个名为vuser的用户,并指定其shell为nologin,家目录为/ftproot,这样所有的虚拟用户登录ftp后系统中都将其映射为vuser这一用户,初始都位于/ftproot目录中。 -
去掉刚创建的用户家目录的写权限
chmod -w /ftproot
#如果不做这一步后面在登录ftp时会出现如下错误提示:500 OOPS: vsftpd: refusing to run with writable root inside chroot()
#去掉相应用户家目录的写权限即可。 -
创建pam_mysql的配置文件
这一文件的目的是告诉vsftp在验证用户信息时使用pam_mysql
模块去mariadb数据库中查找用户信息以及查找方法。
这一配置文件需要新建,它应放置于/etc/pam.d/
目录下,直接vim vsftpd.mysql
在文件中放置如下两行内容,注意把以下内容放到两行:auth required /usr/lib64/security/pam_mysql.so user=vsftpd
passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2account required /usr/lib64/security/pam_mysql.so user=vsftpd
passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2auth
开头的是一行,它表示认证需要使用后面的内容,/usr/lib64/security/pam_mysql.so
指定pam_mysql.so文件的位置;通过user
和passwd
两项指定连接数据库的用户名和密码;host
指定连接数据库的主机,localhost即表示本机之意;db
和table
一起指定去哪个数据库哪个表中查找用户信息,usercolumn
和passwdcolumn
指定表中哪列数据对应用户名,哪列数据对应密码;crypt
指明表中密码的加密方式,2
表示使用的mysql自带的password函数加密的。account
开头的是另一行,它和auth一起完成用户的认证和审计工作。 -
在vsftpd中启用基于pam_mysql的虚拟用户机制
在vsftpd默认的配置文件/etc/vsftpd/vsftpd.conf
中增加如下内容:guest_enable=YES
#允许此项,所有非匿名用户都被视作来宾,来宾用户被重新映射为一个guest usernameguest_username=vuser
#指定guest username的名称,之前我们已新建了vuser,用来将所有虚拟用户映射成为vuserpam_service_name=vsftpd.mysql
#指定vsftp要使用哪种类型的pam服务,此前我们已安装和建立了名为vsftpd.mysql的服务类型systemctl restart vsftpd.service
#修改了服务配置文件后重启服务,以使改动生效。
修改服务配置文件前先做好备份,任何配置错误都将导致服务重启失败
实现不同用户使用不同的配置文件
在vsftp中支持给不同的用户使用不同的配置文件,从而实现不同的用户具有不同的权限,如有的用户能上传,有的用户不能上传,特别是在使用虚拟用户时,虽然它们都映射成同一账户但依然支持使用基于用户的配置文件。
实现方式:
-
全局启用针对用户配置目录的配置
在/etc/vsftpd/vsftpd.conf
中加入如下一项:user_config_dir=/etc/vsftpd/users.conf.d/
#将所有需要特别定制的用户配置文件放置于此目录中,若某用户在此目录中没有针对他的配置文件,则使用全局配置,有则相应配置文件中的条目最终生效。 -
创建针对用户的配置文件
在/etc/vsftpd/users.conf.d/
目录中创建和虚拟用户名一致的配置文件,vim username
,按全局配置文件的格式将相应的指令添加进去,如全局启用了anon_upload_enable=YES
但不想某用户具备上传的权限则可以在文件中直接写上anon_upload_enable=NO
然后保存退出。
最后重新启动vsftpd服务,登录验证是否符合需求即可。
原创文章,作者:N24_lantian,如若转载,请注明出处:http://www.178linux.com/66062