一、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实现步骤:
-
安装所需要程序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配置完成,接下来,则
-
安装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用户拥有上传,删除,新建文件夹操作
```