FTP工作模式介绍与VFTPD服务


一、FTP基础

FTP(File Transfer Protocol,文件传输协议)网上文章很多,我就不说了,重点说明下,使用FTP协议传输数据时,命令和数据是分开使用不同的端口传输的,例如:使用FTP命令get(下载)一个文件,get这个命令默认是通过TCP 21号端口号来传递的;而数据请求的传递,则通过其他端口来完成。这个用于传递数据的端口,是通过两种工作模式来定义的,不同的工作模式,数据传输的端口是有区别的;但是~命令的传输端口是不会变化的,默认是21。下面来说说FTP两种工作模式。

二、FTP的工作模式

FTP的工作模式有两种,有主动连接和被动连接;所谓主动或被动这是相对于服务器来讲的

第一个:主动模式(POST)
在这个模式下,FTP客户端会通过2个端口来完成此次FTP任务;
第一个端口,用于连接FTP服务端的21端口,一般会任意选择一个高端口,如40001。第二个端口FTP客户端也会监听40002端口(40001+1),默认是用于传输命令的端口+1,如果该端口刚好被占用,则再+1,如此类推,这个端口是用于和服务端进行数据传输的。OK,现在两个端口都准备妥当了,接下来,客户端发送POST请求,该请求携带自己正在监听的40002端口,服务端收到POST请求后,会使用本地20号端口,主动去连接客户端的40002端口,最后客户端返回确定。
主动模式的缺点在于,不容易连接到客户端的端口上,默认大多数的客户端防火墙是禁止外部主机随意访问的,所以出现了被动模式。

第二个:被动模式(PASV)
在被动模式中,命令的传输和数据的传输连接都是由客户端发起的,这样就可以避免客户端的防火墙拒绝了,毕竟用户可能并不知道防火墙是干嘛用的。
客户端使用任意高端口(如40001)发起一个PSAV请求给服务端,服务端收到后,返回一个用于传输数据的端口,如(5678)给客户端,客户端收到后,再使用本地任意端口号再去连接服务器端的5678端口,最后服务返回确认信息。

三、VSFTPD服务

简介
VSFTPD服务网上教程也很多,本地账户认证和匿名认证就不细说了,主要说说MYSQL+PAM+VSFTP的虚拟用户认证实现

实验环境:Centos7_X64

  • VSFTPD服务基础
    安装vsftpd:

    [root@test2 ~]# yum install -y vsftpd

VSFTPD程序环境:

主程序:/usr/sbin/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
数据根目录:/var/ftp
Systemd Unit File: /usr/lib/systemd/system/vsftpd.service

  • 配置VSFTPD
    VFTPD的用户类别:
    VSFTPD的用户类别分为两类,一类是本地用户,一类是虚拟用户;
    本地用户可以是本地的系统用户和普通用户,匿名用户也是系统用户,匿名用户映射到本地系统用户叫ftp;默认登陆ftp后,所处位置是账户对应的家目录,由于ftp用户的家目录在/var/ftp,所以匿名用户登陆后,默认的所处位置则在/var/ftp;默认可以自己有权限访问的所有路径间切换,所以如果使用本地账户登陆ftp,如果全选允许,是可以切换到其他目录上的,如/etc,为了安全,应该禁锢用户于其家目录中。

VSFTPD的配置文件
主配置文件是/etc/vsftpd/vsftpd.conf,配置格式为:
指令 值,注意指令前面不能有多余字符;
配置详细说明能通过man vsftpd.conf来查看。
命令分类:
系统用户命名作用于能通过本地登陆的用户,而匿名用户命令作用与虚拟用户和匿名用户

针对匿名用户的配置:

anonymous_enable=YES    #是否开启匿名用户
anon_upload_enable=YES  #是否运行匿名用户上传文件
anon_mkdir_write_enable=YES #是否允许匿名用户mkdir文件夹
anon_other_write_enable=YES #是否运行匿名用户创建或删除文件
anon_umask=077    #匿名用户创建的文件umask

针对系统用户的配置:

local_enable=YES    #是否开启本地用户登陆
write_enable=YES    #是否允许写入操作
local_umask=022     #创建文件的默认权限

其他配置:

上传下载速率限制:
anon_max_rate=0     #限制匿名用户的速率,0为不限制
local_max_rate=0    #限制本地用户的速率,0为不限制

并发连接数限制:
max_clients=2000    #最大能并发多少个连接
max_per_ip=50       #单个IP最大的连接数,即一个主机最大能建立多少个连接

控制可登录vsftpd服务的用户列表
userlist_enable=YES  #启用/etc/vsftpd/user_list文件来控制可登录用户
userlist_deny=YES|NO    #YES即黑名单,NO即白名单


辅助配置文件
/etc/vsftpd/ftpusers    #列在此文件中的用户 均禁止使用ftp服务

禁锢用户于其家目录中
chroot_local_user=YES   #禁锢所有本地用户 于其家目录;需要事先去除用户对家目录的写权限;
也可以写一个文件,只对文件中的用户做禁锢
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list #禁锢列表中文件存在的用户于其家目录中;需要事先去除用户对家目录的写权限;

传输日志(不常用):
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES  

  • PAM模块简单介绍
    简介:
    PAM,Pluggable Authentication Modules,可插拔认证模块,是一套共享库,如果编写应用时,需要用到身份验证功能时,可以选择自己写认证功能,又或者调用由PAM提供的公共库,完成用户验证,简单来说,程序员可以调用PAM模块实现用户验证功能,而不用自己重新编写,这种方式下,就算升级本地认证机制,也不用修改程序.PAM使用配置/etc/pam.d/下的文件来管理对程序的认证方式,程序员只要在对应目录下创建对应的配置文件,就可以调用本地的认证模块.模块放置在/lib/security下,以加载动态库的形式进行。包括系统登陆的程序login,su命令,也是调用了PAM模块实现用户验证。

VSFTPD的用户身份验证,也是由PAM模块实现的;在/etc/vsftpd/vsftpd.conf这个主配文件中,有1条指令指指明vsftpd的PAM配置文件路径的,如:pam_service_name=vsftpd指明认证时候,读取/etc/pam.d/vsftpd这个配置文件。配置文件内容

[root@test2 ~]# cat /etc/pam.d/vsftpd 
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required pam_shells.so
auth       include  password-auth
account    include  password-auth
session    required     pam_loginuid.so
session    include  password-auth

实现vsftpd通过mysql数据库来完成虚拟用户登陆,只需要配置pam能够支持数据库验证就可以了,默认pam是不支持的,可以通过安装一个第三方模块:pam_mysql,使得pam能够通过mysql是完成用户验证。

VSFTPD+PAM+MYSQL实现步骤:

  1. 安装所需要程序mysql和pam_mysql

    安装mysql

    [root@test2 ~]# yum install mariadb-server
    //配置mysql,新建一个用户vsftpd,和一个数据库vsftpd
    [root@test2 ~]# systemctl restart mariadb
    [root@test2 ~]# mysql 
    
    MariaDB [(none)]> CREATE DATABASE vsftp;
    MariaDB [(none)]> GRANT SELECT ON vsftp.* TO 'vsftp'@'localhost' IDENTIFIED BY '523569';  //给定SELECT权限
    //创建一个用于保存用户密码的表
    MariaDB [vsftp]> CREATE TABLE user(id INT NOT NULL AUTO_INCREMENT,name CHAR(30) NOT NULL,password CHAR(48) NOT NULL,PRIMARY KEY(id));
    
    

//查看表结构
MariaDB [vsftp]> DESC user;
+----------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(30) | NO | | NULL | |
| password | char(48) | NO | | NULL | |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

    //添加2个测试的虚拟用户,根据需要添加所需要的用户,需要说明的是,这里将其密码为了安全起见应该使用PASSWORD函数加密后存储。
MariaDB [vsftp]> INSERT INTO user(name,password)VALUES('tom',password('523569'));
MariaDB [vsftp]> INSERT INTO user(name,password)VALUES('sun',password('523569'));

至此,MYSQL配置完成,接下来,则

  1. 安装pam_mysql模块
    下载pam_mysql模块,地址:http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
 [root@test2 ~]# tar -xf pam_mysql-0.7RC1.tar.gz //解压
 [root@test2 ~]# cd pam_mysql-0.7RC1
 [root@test2 pam_mysql-0.7RC1]# ./configure --help  //可以查看安装帮助
 重点以下几项:
 --with-mysql=PREFIX     specify MySQL installation prefix
 //指定mysql的安装路径,我是通过yum安装的,所以默认是在/usr下
 --with-pam=PREFIX       specify PAM installation prefix
 //默认也在/usr下
 --with-pam-mods-dir=DIR specify PAM module installation path
 //指定PAM模块安装的位置,默认在/usr/lib64/security
 
 #下面开始安装pam_mysql
 在开始安装之前,需要安装2个开发包。
 [root@test2 pam_mysql-0.7RC1]# yum install mariadb-devel pam-devel
 //pam.mysql编译需要依赖到这2个包
 
 ./configure安装配置如下:

[root@test2 pam_mysql-0.7RC1]# ./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/usr/lib64/security/
[root@test2 pam_mysql-0.7RC1]# make && make install
[root@test2 pam_mysql-0.7RC1]# ls /usr/lib64/security/pam_mysql.so #安装成功后,可以看到该模块

 
3.  **配置VSFTPD**

1.建立pam认证配置文件,写入配置内容
[root@test2 pam_mysql-0.7RC1]# vim /etc/pam.d/vsftpd_vuse

auth required /lib/security/pam_mysql.so user=vsftp passwd=523569 host=localhost db=vsftp table=user usercolumn=name passwdcolumn=password crypt=2
account required /lib/security/pam_mysql.so user=vsftp passwd=523569 host=localhost db=vsftp table=user usercolumn=name passwdcolumn=password crypt=2

注意:由于mysql的安装方式不同,pam_mysql.so基于unix sock连接mysql服务器时可能会出问题,此时,建议授权一个可远程连接的mysql并访问vsftpd数据库的用户。

2.修改vsftpd配置,配置PAM认证文件为我们新建的PAM配置文件:vsftpd_vuse。
添加以下选项
guest_enable=YES #虚拟用户需要启用来宾账户并映射到一个本地用户
guest_username=vuser #虚拟账户映射到的本地用户

请确保/etc/vsftpd.conf中已经启用了以下选项
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES

配置好后,新建对应用户,并把家目录指定为/var/vsftpd。
[root@test2 pam_mysql-0.7RC1]# useradd -d /var/vsftpd vuser
重启服务
[root@test2 pam_mysql-0.7RC1]# systemctl restart vsftpd
为了不影响实验,关闭防火墙和关闭SELINUX:
[root@test2 pam_mysql-0.7RC1]# systemctl stop firewalld
[root@test2 pam_mysql-0.7RC1]# setenforce 0
修改文件夹权限:

chmod go+rx /var/ftproot

验证
[root@test2 pam_mysql-0.7RC1]# ftp localhost
Name (localhost:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

    
 

4. 配置虚拟用户具有不同的访问权限
    vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。虚拟用户的配置命令和匿名用户命令是一样的
    ```
    1、为虚拟用户定义配置文件目录
    [root@test2 pam_mysql-0.7RC1]# vim /etc/vsftpd/vsftpd.conf     user_config_dir=/etc/vsftpd/vuser_config
    
    2、创建所需要目录,并为虚拟用户提供配置文件
    [root@test2 pam_mysql-0.7RC1]# mkdir /etc/vsftpd/vuser_config
    //创建与用户同名的配置文件
    [root@test2 pam_mysql-0.7RC1]# vim /etc/vsftpd/vuser_config/tom
anon_upload_enable=YES   
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
    //tom用户拥有上传,删除,新建文件夹操作
        

    
    
    ```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容