vsftp虚拟用户

虚拟用户

所有虚拟用户会统一映射为一个指定的系统帐号,访问共享位置,即为此系统帐号的家目录,各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

虚拟用户帐号的存储方式

文件:

编辑文本文件,此文件需要被编码为hash格式,文本的奇数行为用户名,偶数行为密码
文本编辑完毕后使用db_load将其转换为数据库形式

db_load -T -t hash -f vusers.txt vusers.db  

关系型数据库中的表中:

实时查询数据库完成用户认证
基于mysql数据库的账号存储需要依赖于pam-mysql这个模块,此模块在centos6上存在于epel源,centos7需要编译安装

/lib64/security/pam_mysql.so   
/usr/share/doc/pam_mysql-0.7/README 

基于文件验证的vsftpd虚拟用户

1.安装vsftpd

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

2.创建虚拟账号密码

[root@localhost ~]# cd /etc/vsftpd
[root@localhost vsftpd]# vim vuser_ftp.txt
ftp1    #虚拟账号用户
centos  #虚拟账号密码
ftp2
magedu

3.将文件转换为数据库文件

[root@localhost vsftpd]# db_load -T -t hash -f vuser_ftp.txt vuser_ftp.db

4.修改数据库文件和文本的权限,将其设置为安全的权限

[root@localhost vsftpd]# chmod 600 vuser_ftp.db
[root@localhost vsftpd]# chmod 600 vuser_ftp.txt

5.将ftp1和ftp2映射为操作系统账号
5.1创建映射的账号

[root@localhost vsftpd]# mkdir /data/frproot
[root@localhost vsftpd]# useradd -r -s /sbin/nologin -d /data/ftproot vuser

5.2修改配置文件,改认证为vsftpd.db

[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf 
pam_service_name=vsftpd.db

5.3在/etc/pam.d下创建vsftpd.db文件
vsftp做验证时读取此文件,然后验证时读文件中的vuser_ftp数据库

[root@localhost vsftpd]# vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/vuser_ftp
account required pam_userdb.so db=/etc/vsftpd/vuser_ftp

5.4修改vsftpd配置将所有用户映射成vuser

[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf 
guest_enable=YES
guest_username=vuser

5.5重启服务

[root@localhost vsftpd]# systemctl restart vsftpd

测试

[root@localhost ~]# ftp 192.168.73.110
Connected to 192.168.73.110 (192.168.73.110).
220 (vsFTPd 3.0.2)
Name (192.168.73.110:root): ftp1
331 Please specify the password.
Password:
230 Login successful.                   #显示登录成功
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

6.修改配置文件为每个用户创建不同的规则
6.1在配置文件中启用虚拟用户配置

[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf 
user_config_dir=/etc/vsftpd/vuser.d/        #虚拟用户相关配置所存放的位置

6.2创建虚拟用户配置目录

[root@localhost vsftpd]# mkdir /etc/vsftpd/vuser.d

6.3为每个虚拟用户创建配置文件

[root@localhost vuser.d]# vim /etc/vsftpd/vuser.d/ftp1
anon_upload_enable=YES                  #启用匿名上传
anon_mkdir_write_enable=YES             #启用匿名创建目录
anon_other_write_enable=YES             #启用匿名删除

6.4在vuser家目录中建立子文件夹
由于用户的家目录是不允许有写权限的所以需要在其下面建一个子文件夹,让vuser对其下的子目录有读写执行权限

[root@localhost vuser.d]# mkdir /data/ftproot/upload
[root@localhost vuser.d]# setfacl -m u:vuser:rwx /data/ftproot/upload   #设置acl权限

6.5测试
使用f1上传文件

[root@localhost ~]# ftp 192.168.73.110
Connected to 192.168.73.110 (192.168.73.110).
220 (vsFTPd 3.0.2)
Name (192.168.73.110:root): ftp1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload
250 Directory successfully changed.
ftp> put f1                                                 #上传文件
local: f1 remote: f1
227 Entering Passive Mode (192,168,73,110,253,245).
150 Ok to send data.
226 Transfer complete.
1104 bytes sent in 8.5e-05 secs (12988.24 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,73,110,177,134).
150 Here comes the directory listing.
-rw-------    1 998      996          1104 May 17 16:36 f1          #成功
226 Directory send OK.
ftp> 

7.每个虚拟用户所能看到的内容不同
7.1修改虚拟用户的配置文件

[root@localhost vuser.d]# vim /etc/vsftpd/vuser.d/ftp1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/data/ftp1

[root@localhost vuser.d]# vim /etc/vsftpd/vuser.d/ftp2
local_root=/data/ftp2

7.2为虚拟用户创建家目录

[root@localhost vuser.d]# mkdir /data/ftp{1,2} -p

7.3在每个家目录中创建个文件用来验证

[root@localhost vuser.d]# touch /data/ftp1/ftp1
[root@localhost vuser.d]# touch /data/ftp2/ftp2

7.4重启服务

[root@localhost vuser.d]# systemctl restart vsftpd

7.5测试
使用ftp2登录查看

[root@localhost ~]# ftp 192.168.73.110
Connected to 192.168.73.110 (192.168.73.110).
220 (vsFTPd 3.0.2)
Name (192.168.73.110:root): ftp2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,73,110,238,6).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 May 17 16:47 ftp2        #显示为f2
226 Directory send OK.
ftp> pwd
257 "/"                                         #显示为/目录

基于MySQL数据库验证的vsftp虚拟用户

准备环境
ftp主机一台,MySQL数据库一台
主机 ip 系统
vsftpd 192.168.73.110 CentOs7.6
mysql 192.168.73.111 Centos7.6

ftp要能连接MySQL依赖一个模块pam_mysql,centos6上epel自带,CentOS7需要自行编译

MySQL服务器操作

1.安装MySQL

[root@localhost ~]# yum install mariadb-server -y

2.启动服务

[root@localhost ~]# systemctl start mariadb 

3.创建vsftp的数据库和相应的表

MariaDB [(none)]> CREATE DATABASE vsftpd;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> CREATE TABLE vsftpd.vuser (id int auto_increment primary key,username char(30),password char(50) binary);
Query OK, 0 rows affected (0.00 sec)

4.添加匿名用户

MariaDB [(none)]> INSERT vsftpd.vuser(username,password)VALUES('ftp1',password('centos')),('ftp2',password('magedu'));
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

5.授权vsftpd来查询的账号

MariaDB [(none)]> GRANT SELECT ON vsftpd.vuser to vsftpd@'192.168.73.7' identified by '111111';
Query OK, 0 rows affected (0.00 sec)

vsftpd服务器上编译安装pam_mysql

1.安装编译所需的必要组件

[root@localhost ~]# yum install gcc-c++ gcc pam-devel mariadb-devel -y

2.解压pam_mysql

[root@localhost ~]# tar xf pam_mysql-0.7RC1.tar.gz 

3.编译pam_msyql

[root@localhost ~]# cd pam_mysql-0.7RC1
[root@localhost pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security
[root@localhost pam_mysql-0.7RC1]# make && make install

4.修改配置文件指定验证的pam模块

[root@localhost pam_mysql-0.7RC1]# vim /etc/vsftpd/vsftpd.conf 
pam_service_name=vsftpd.mysql           #指定调用的pam模块
userlist_enable=YES
tcp_wrappers=YES

guest_enable=YES
guest_username=vuser

user_config_dir=/etc/vsftpd/vuser.d/

5.在/etc/pam.d下创建新的pam模块

[root@localhost pam_mysql-0.7RC1]# vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=111111 host=192.168.73.111 db=vsftpd table=vuser usercolumn=username passwdcolumn=password crypt=2            #验证
account required pam_mysql.so user=vsftpd passwd=111111 host=192.168.73.111 db=vsftpd table=vuser usercolumn=username passwdcolumn=password crypt=2         #确认账户的有效性

6.重启服务

[root@localhost pam_mysql-0.7RC1]# systemctl restart vsftpd

7.测试

[root@localhost ~]# ftp 192.168.73.110
Connected to 192.168.73.110 (192.168.73.110).
220 (vsFTPd 3.0.2)
Name (192.168.73.110:root): ftp1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,73,110,254,51).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 May 17 16:47 ftp1
226 Directory send OK.