一、ftp简要介绍

  ftp是一个很古老的协议了,是一种基于明文传输的C/S架构协议。ftp基于tpc21、20端口,其中21端口为命令端口,20端口为数据端口。ftp命令连接同其他TCP连接一样,不过数据连接有两种模式:

  主动模式,也称作PORT模式:命令请求端口时,服务器端为减少等待,主动将数据发送给客户端:使用本机的20端口请求客户端的端口。这里有个问题:服务器端想要主动连接客户端就需要知道客户端的端口号,可是客户端根本没有启动任何端口给服务器端。协议设计中服务器端根据客户端的命令连接端口(当然它是一个随机端口)+1作为请求数据连接端口,如果被用了,那么就再次+1...。当然这种模式下,客户端防火墙很难做。这样就有了被动模式。

  被动模式,也称为PASV模式:客户端主动请求服务器端口连接传送数据:服务器端启动一个随机端口,并将端口通过命令端口发送到客户端,客户端知道后连接该端口,完成数据传输。这里貌似服务器端口好像做防火墙较难。当然防火墙可以做了,不过这不提,以后会有博文讲解防火墙对ftp被动模式的设置。

  ftp服务的权限认证有三种用户:匿名用户,本地用户,虚拟用户。匿名用户就是将用户权限映射到服务器上的系统用户上,一般默认为ftp用户,默认路径映射路径到/var/ftp。前两种用户不是很复杂,这只了解下基于虚拟用户的设置。

二、基于pam MySQL数据库的vsftpd 虚拟用户认证

  安装vsftd,mysql,这里不做介绍,自行谷歌。

  1.pam_msyql.so的编译安装。这里需要用到pam Mysql的库文件,一般默认安装的pam没有包含该库,需要自行下载编译到pam中,准备好编译环境和必须组件,编译安装它:

安装开发环境: yum -y instal "Development Tools" "Server Plaform Tools"

安装必要的组件:yum -y install openssl-devel  pam-devel mysql-devel

 编译安装:tar xf  pam_mysql-0.7RC1.tar.gz && cd pam*

                  ./configure --with-mysql=/usr --with-openssl=/usr -with-pam=/usr -with-pam-mods-dir=/lib64/security && make && make

安装好后,可以看到库文件安装在/lib64/secuirty/pam_mysql.so;

# ls /lib64/security |grep mysql
pam_mysql.la
pam_mysql.so

  2.建立对应数据库

# msyql -uroot
create database vuser;
use vuser;
create table users(id int auto_increment not null primary key,name char(30) not null,password char(48) not null);
insert into users(name,password) values ('obama',password('magedu'));
insert into users(name,password) values ('changchun',password('magedu'));
grant select on  vuser.* to 'vsftpd'@'%' identified by 'magedu';
flush privileges;

  3.建立pam配置文件

 pam 格式根据模块不同写法,也不同,不过这里写成这样就可以了。
auth required pam_mysql.so user=vuser passwd=magedu host=172.18.29.132 db=vuser table=users usercolumn=name passwdcolumn=password crypt=2  debug
account required pam_mysql.so user=vuser passwd=magedu host=172.18.29.132 db=vuser table=users usercolumn=name passwdcolumn=password  debug

  注意里面的库用户、密码,库名,用户名库中对应行,密码的库中对应行要写。加上debug可以在/var/log/secure看到debug信息。自己看到的给大家提出来。

 4.建立虚拟用户

mkdir /ftproot
useradd -s /sbin/nologin -d /ftproot vuser
chmod go+w /ftproot

 5.修改配置vsftpd.conf文件

anonymous_enable=NO # 匿名用户开关
write_enable=YES    # 全局写权限开关
local_enable=YES    # 非匿名用户开关
listen_ipv6=YES
guest_enable=YES    # 来宾用户(也就是虚拟用户账号)开关
guest_username=vuser    #  来宾用户名称
pam_service_name=vsftpd.mysql # pam认证配置文件

 这样就完成了。可以登录上去看看了,这里截图没什么意义,不再截图。

 三、期间可能遇到的错误,主要需要关闭selinux和对应目录的权限:因为ftp的访问还是基于用户权限控制的,所以无论你是那种用户登录ftp都是映射到一个用户,登录得到的权限就是映射到用户的权限。