网络文件共享服务(二)----vsftpd虚拟账户

网络文件共享服务(一)

vsftpd 虚拟用户

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

虚拟用户帐号的存储方式:
文件:编辑文本文件,此文件需要被编码为hash格式,db格式。需要把文本转化成 .db后缀文件
奇数行为用户名,偶数行为密码

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

关系型数据库中的表中:实时查询数据库完成用户认证
vsftpd 支持mysql库:pam要依赖于pam-mysql

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

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

创建用户数据库文件

vim /etc/vsftpd/vusers.txt      #放虚拟用户文件
kaivi
kaivipass
duanxi
duanxinpass
cd /etc/vsftpd/
db_load -T -t hash -f vusers.txt vusers.db
chmod 600 vusers.db   #为了安全加600权限

创建用户和访问FTP目录

useradd -d /data/ftproot -s /sbin/nologin -r vuser  #超级用户账号
mkdir -pv /data/ftproot/upload
setfacl -m u:vuser:rwx /data/ftproot/upload
#chmod a=rx /data/ftproot/ 如果自动创建家目录,需修改权限 如果有写权限则登入不上根共享文件

创建pam配置文件

vim /etc/pam.d/vsftpd.db     #调用文件
auth required pam_userdb.so db=/etc/vsftpd/vusers           #这里实际读的时vusers.db
account required pam_userdb.so db=/etc/vsftpd/vusers
[root@centos8mini ~]#man pam_userdb

在这里插入图片描述

指定pam配置文件

vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=vuser            #所有虚拟用户映射成vuser
pam_service_name=vsftpd.db      #从那个文件读虚拟用户

虚拟用户建立独立的配置文件

#指定各个用户配置文件存放的路径
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/
#创建各个用户配置文件存放的路径
mkdir /etc/vsftpd/vusers.d/
cd /etc/vsftpd/vusers.d/
#创建各用户自已的配置文件,允许kaivi用户可读写,其它用户只读
vim kaivi
anon_upload_enable=YES            #匿名允许上传
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#创建各用户自已的配置文件
vim duanxin
#登录目录改变至指定的目录
local_root=/data/ftproot2        #默认访问目录/data/ftproot

实验操作

实验环境:关闭防火墙和selinux的centos8最小安装linux系统 IP:192.168.32.8

[root@centos8 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:a5:39:58 brd ff:ff:ff:ff:ff:ff
    inet 192.168.32.8/24 brd 192.168.32.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever

[root@centos8 ~]#firewall-cmd --state
not running

[root@centos8 ~]#getenforce 
Disabled

[root@centos8 ~]#cat /etc/redhat-release 
CentOS Linux release 8.0.1905 (Core) 
[root@centos8 ~]#
[root@centos8 ~]#cat /etc/passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
kaivi:x:1000:1000:kaivi:/home/kaivi:/bin/bash         #kaivi账号
duanxin:x:1001:1001::/home/duanxin:/bin/bash          #duanxin账号
[root@centos8 ~]#

[root@centos8 ~]#dnf install vsftpd -y
......
Total                                                                              145 kB/s | 180 kB     00:01     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                   1/1 
  Installing       : vsftpd-3.0.3-28.el8.x86_64                                                        1/1 
  Running scriptlet: vsftpd-3.0.3-28.el8.x86_64                                                        1/1 
  Verifying        : vsftpd-3.0.3-28.el8.x86_64                                                        1/1 

Installed:
  vsftpd-3.0.3-28.el8.x86_64                                                                                       

Complete!
                                                            

创建用户数据库文件

[root@centos8 ~]#vim /etc/vsftpd/vuser.txt 
[root@centos8 ~]#cat /etc/vsftpd/vuser.txt
kaivi
centos
duanxin
centos

[root@centos8 ~]#db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db
[root@centos8 ~]#file /etc/vsftpd/vuser.db       #查看格式信息
/etc/vsftpd/vuser.db: , created: Thu Jan  1 00:34:08 1970

[root@centos8 ~]#cd /etc/vsftpd/
[root@centos8 vsftpd]#ll
total 36
-rw------- 1 root root   125 May 14  2019 ftpusers
-rw------- 1 root root   361 May 14  2019 user_list
-rw------- 1 root root  5098 May 14  2019 vsftpd.conf
-rwxr--r-- 1 root root   348 May 14  2019 vsftpd_conf_migrate.sh
-rw-r--r-- 1 root root 12288 Dec 18 13:09 vuser.db           #大小比较不一样
-rw-r--r-- 1 root root    29 Dec 18 13:07 vuser.txt          #大小比较不一样

#为了安全,这里设置一些权限
[root@centos8 vsftpd]#chmod 600 vuser.db 
[root@centos8 vsftpd]#ll vuser.db 
-rw------- 1 root root 12288 Dec 18 13:09 vuser.db

创建用户和访问FTP目录

[root@centos8 vsftpd]#useradd -d /data/ftproot -s /sbin/nologin -r vuser
[root@centos8 vsftpd]#mkdir /data/ftproot
[root@centos8 vsftpd]#ll -d /data/ftproot
drwxr-xr-x 2 root root 6 Dec 18 13:18 /data/ftproot
[root@centos8 vsftpd]#

创建pam配置文件

[root@centos8 vsftpd]#cd /etc/pam.d/
[root@centos8 pam.d]#ls
config-util       login   password-auth  remote     smartcard-auth    su      su-l          vlock
crond             other   polkit-1       runuser    sshd              sudo    system-auth   vmtoolsd
fingerprint-auth  passwd  postlogin      runuser-l  sssd-shadowutils  sudo-i  systemd-user  vsftpd
#这里有一个默认的vsftpd,这里我们重新建立一个新文件,然后修改pam调用文件路径。

[root@centos8 pam.d]#vim vsftpd.db
[root@centos8 pam.d]#cat vsftpd.db 
auth required pam_userdb.so db=/etc/vsftpd/vuser        #验证账号,需要在虚拟账号文件中的才有效       
account required pam_userdb.so db=/etc/vsftpd/vuser     #验证有效性 
#这里最后读取的文件/etc/vsftpd/vuser.db 这里把后缀.db省略了
[root@centos8 pam.d]#
[root@centos8 pam.d]#ls /etc/vsftpd/vuser.db 
/etc/vsftpd/vuser.db          #文件带db,配置文件中不需要写.db

指定pam配置文件

[root@centos8 pam.d]#vim /etc/vsftpd/vsftpd.conf  #主配置文件最后面
# Make sure, that one of the listen options is commented !!
listen_ipv6=YES

#pam_service_name=vsftpd          #默认pam认证文件为vsftpd,注释掉
userlist_enable=YES

pam_service_name=vsftpd.db        #添加pam认证文件为vsftpd.db
guest_enable=YES                  #开启映射功能
guest_username=vuser              #全部都映射为vuser

如果现在没有什么特殊的要求,基本配置已经完成。

启动对应的vsftpd服务

[root@centos8 pam.d]#cd
[root@centos8 ~]#ss -ntl
State         Recv-Q         Send-Q                  Local Address:Port                  Peer Address:Port         
LISTEN        0              128                           0.0.0.0:22                         0.0.0.0:*            
LISTEN        0              128                              [::]:22                            [::]:*            
[root@centos8 ~]#systemctl start vsftpd
[root@centos8 ~]#ss -ntl
State         Recv-Q         Send-Q                  Local Address:Port                  Peer Address:Port         
LISTEN        0              128                           0.0.0.0:22                         0.0.0.0:*            
LISTEN        0              32                                  *:21                               *:*            
LISTEN        0              128                              [::]:22                            [::]:*            
[root@centos8 ~]#

在centos7中做访问连接操作:

[root@centos7 ~]#ftp
ftp> exit
[root@centos7 ~]#ftp 192.168.32.8
Connected to 192.168.32.8 (192.168.32.8).
220 (vsFTPd 3.0.3)
Name (192.168.32.8:root): kaivi
331 Please specify the password.
Password:
230 Login successful.       #登入成功
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is the current directory
ftp> ls
227 Entering Passive Mode (192,168,32,8,254,160).
150 Here comes the directory listing.
226 Directory send OK.
ftp> 
访问的根是哪一个,可以在centos8中新建一个文件来确认

centos8中操作:

[root@centos8 ~]#cd /data/ftproot/
[root@centos8 ftproot]#touch ftproot1.txt   #新建一个文件,给远程FTP访问,确认根目录
[root@centos8 ftproot]#

在centos7中做访问连接操作:

[root@centos7 ~]#ftp 192.168.32.8
Connected to 192.168.32.8 (192.168.32.8).
220 (vsFTPd 3.0.3)
Name (192.168.32.8:root): kaivi    #登入账号kaivi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is the current directory
ftp> ls
227 Entering Passive Mode (192,168,32,8,255,71).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 05:37 ftproot1.txt   #在/data/ftproot/ftproot1.txt文件
226 Directory send OK.
ftp> 

这时候我们用第二个虚拟账号duanxin访问一下centos8:192.168.32.8。发现由于映射的原因访问的根文件目录是一致的
在centos7中做访问连接操作:

[root@centos7 ~]#ftp 192.168.32.8
Connected to 192.168.32.8 (192.168.32.8).
220 (vsFTPd 3.0.3)
Name (192.168.32.8:root): duanxin   #登入账号duanxin
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is the current directory
ftp> ls
227 Entering Passive Mode (192,168,32,8,203,108).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 05:37 ftproot1.txt #和之前的kaivi账户访问的是同一个根目录
226 Directory send OK.
ftp> 

在centos7中尝试用系统用户登入系统。但是无法登入,因为系统不在之前的pam验证模块的vuser.db中
如何实现不同的虚拟账户访问不同的文件目录。而且实现不同的虚拟账户对应的权限也不一致。

这里用虚拟用户建立独立的配置文件的形式就能实现。具体实现如下

虚拟用户建立独立的配置文件

[root@centos8 ~]#mkdir /etc/vsftpd/vusers.d/
[root@centos8 ~]#vim /etc/vsftpd/vsftpd.conf 
user_config_dir=/etc/vsftpd/vusers.d/     #在配置文件的最后添加即可

[root@centos8 ~]#cd /etc/vsftpd/vusers.d/
[root@centos8 vusers.d]#ls        #现在是空文件

[root@centos8 vusers.d]#vim kaivi

[root@centos8 vusers.d]#cat kaivi 
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#创建各用户自已的配置文件,允许kaivi用户可读写,其它用户只读(duanxin)
[root@centos8 vusers.d]#
[root@centos8 vusers.d]#cd /data/ftproot/
[root@centos8 ftproot]#mkdir upload
[root@centos8 ftproot]#ll
total 0
-rw-r--r-- 1 root root 0 Dec 18 13:37 ftproot1.txt
drwxr-xr-x 2 root root 6 Dec 18 14:00 upload
[root@centos8 ftproot]#setfacl -m u:vuser:rwx upload/    #不能对共享根目录有写权限只能新建一个子文件夹
#这里由于映射原因都是给到vuser用户权限即可
[root@centos8 ftproot]#

[root@centos8 vusers.d]#systemctl restart vsftpd

centos7中操作测试

[root@centos7 ~]#ftp 192.168.32.8
Connected to 192.168.32.8 (192.168.32.8).
220 (vsFTPd 3.0.3)
Name (192.168.32.8:root): kaivi   #登入账户
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is the current directory
ftp> ls
227 Entering Passive Mode (192,168,32,8,21,41).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 05:37 ftproot1.txt
drwxrwxr-x    2 0        0               6 Dec 18 06:00 upload         #新建文件夹
226 Directory send OK.
ftp> cd upload      #进入到文件夹中才能上传
250 Directory successfully changed.
ftp> put anaconda-ks.cfg       #上传本机的anaconda-ks.cfg文件
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,32,8,98,126).
150 Ok to send data.
226 Transfer complete.         #上传成功
1612 bytes sent in 0.0193 secs (83.41 Kbytes/sec)
ftp> 

由于其他的账户(duanxin)没有授权,所以上传文件会失败

[root@centos7 ~]#ftp 192.168.32.8
Connected to 192.168.32.8 (192.168.32.8).
220 (vsFTPd 3.0.3)
Name (192.168.32.8:root): duanxin   #登入账号
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,32,8,127,63).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 05:37 ftproot1.txt
drwxrwxr-x    2 0        0              29 Dec 18 06:04 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,32,8,251,184).
550 Permission denied.         #权限拒绝  上传失败
ftp> 

这里单独建立一个新的文件夹,只能够单独给duanxin这里虚拟用户访问
也就是说账号kaivi访问/data/ftproot1
账号duanxin访问 /data/ftproot2

[root@centos8 ~]#
[root@centos8 ~]#mkdir /data/ftproot2
[root@centos8 ~]#touch /data/ftproot2/ftproot2.txt
[root@centos8 ~]#
[root@centos8 ~]#vim /etc/vsftpd/vusers.d/duanxin

[root@centos8 ~]#cat /etc/vsftpd/vusers.d/duanxin
local_root=/data/ftproot2     #登录目录改变至指定的目录

[root@centos8 ~]#ll /etc/vsftpd/vusers.d/
total 8
-rw-r--r-- 1 root root 27 Dec 18 14:13 duanxin
-rw-r--r-- 1 root root 80 Dec 18 13:56 kaivi
[root@centos8 ~]#
[root@centos8 ~]#systemctl restart vsftpd

centos7中操作测试

[root@centos7 ~]#ftp 192.168.32.8
Connected to 192.168.32.8 (192.168.32.8).
220 (vsFTPd 3.0.3)
Name (192.168.32.8:root): duanxin    #登入账号
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is the current directory
ftp> ls
227 Entering Passive Mode (192,168,32,8,117,140).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 06:10 ftproot2.txt #访问的是/data/ftproot2
226 Directory send OK.
ftp> 

[root@centos7 ~]#ftp 192.168.32.8
Connected to 192.168.32.8 (192.168.32.8).
220 (vsFTPd 3.0.3)
Name (192.168.32.8:root): kaivi  #登入账号
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is the current directory
ftp> ls
227 Entering Passive Mode (192,168,32,8,249,74).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 05:37 ftproot1.txt #访问的是/data/ftproot1
drwxrwxr-x    2 0        0              29 Dec 18 06:04 upload
226 Directory send OK.
ftp> 

最终实现不同虚拟账户访问不同的目录文件,kaivi账号具有上传功能,但是duanxin账号没有上传功能。

**缺点:**虚拟账户都是在文本文件中,增加或者减少用户都需要重新生成新的.db的数据库文件存放。
所以这里可以把账户,口令文件放到数据库中。

实现基于MYSQL验证的vsftpd虚拟用户

环境准备
本实验在两台CentOS主机上实现,一台做为FTP服务器,一台做数据库服务器

在数据库服务器上安装mysql数据库

数据库版本都可以

yum –y install mariadb-server
systemctl enable --now mariadb.service

数据库服务上配置数据库支持vsftpd服务

#建立存储虚拟用户数据库和表
mysql> CREATE DATABASE vsftpd;
mysql> USE vsftpd;
mysql> CREATE TABLE users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name CHAR(50) BINARY NOT NULL,
password CHAR(48) BINARY NOT NULL  #BINARY ,表示用户名密码区分大小写。数据库中默认不区分大小写
);
#添加虚拟用户,为了安全应该使用PASSWORD函数加密其密码后存储
mysql> INSERT INTO users(name,password) values('kaivi',password('centos'));
mysql> INSERT INTO users(name,password) values('duanxin',password('centos'));
#创建连接的数据库用户
mysql> GRANT SELECT ON vsftpd.* TO vsftpd@'192.168.32.%' IDENTIFIED BY 'centos';
mysql> FLUSH PRIVILEGES;

在FTP服务器上安装vsftpd 和 pam_mysql包

Pam_mysql源码包下载

yum install vsftpd -y

在FTP服务器上安装 pam_mysql

对于 centos 6:pam_mysql由EPEL的源中提供

yum install pam_mysql -y

对于 centos7 和 8:无对应rpm包,需手动编译安装

pam-mysql源码进行编译

#安装相关包
yum install vsftpd gcc gcc-c++ make mariadb-devel pam-devel
#下载pam-mysql源码进行编译
wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
#https://github.com/NigelCunningham/pam-MySQL/archive/v0.8.1.tar.gz

tar xvf pam_mysql-0.7RC1.tar.gz

cd pam_mysql-0.7RC1/

./configure --with-pam-mods-dir=/lib64/security   #默认放置pam模块的路径
#如果上面命令不指定 --with-pam-mods-dir=/lib64/security 会报以下错误
#checking if the second argument of pam_conv.conv() takes const pointer... no
configure: error: Your system doesn't appear to be configured to use PAM.
Perhaps you need to specify the correct location where the PAM modules reside.

make && make install
[root@vsftpd ~]#ll /lib64/security/pam_mysql*
-rwxr-xr-x 1 root root 882 Dec 17 14:34 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 141712 Dec 17 14:34 /lib64/security/pam_mysql.so

在FTP服务器上建立pam认证所需文件

vim /etc/pam.d/vsftpd.mysql    #文件名叫什么不重要,重要为下面内容
#添加如下两行
auth required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver db=vsftpd
table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver
db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

注意:以上参考 README文档

crypt 加密方式:
0表示不加密
1表示crypt(3)加密
2表示使用mysql password()函数加密
3表示md5加密
4表示sha1加密

配置字段说明
auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后
面为给此模块传递的参数
user=vsftpd为登录mysql的用户
passwd=magedu 登录mysql的的密码
host=mysqlserver mysql服务器的主机名或ip地址
db=vsftpd 指定连接msyql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密

建立相应用户和修改vsftpd配置文件

#建立虚拟用户映射的系统用户及对应的目录
useradd -s /sbin/nologin -d /data/ftproot -r vuser
#centos7 需除去ftp根目录的写权限
chmod 555 /data/ftproot
mkdir -pv /data/ftproot/{upload,pub}
setfacl –m u:vuser:rwx /data/ftproot/upload
也可以把对应的文件夹的所有者改为映射的虚拟账户

#确保/etc/vsftpd.conf中已经启用了以下选项
anonymous_enable=YES
#添加下面两项
guest_enable=YES
guest_username=vuser
#修改下面一项,原系统用户无法登录
pam_service_name=vsftpd.mysql
启动vsftpd服务
systemctl enable --now vsftpd

在FTP服务器上配置虚拟用户具有不同的访问权限

vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户
的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其
路径及名称即可

#配置vsftpd为虚拟用户使用配置文件目录
vim /etc/vsftpd/vsftpd.conf

#添加如下选项
user_config_dir=/etc/vsftpd/vusers.d/
#创建所需要目录,并为虚拟用户提供配置文件
mkdir /etc/vsftpd/vusers.d/
cd /etc/vsftpd/vusers.d/
touch kaivi duanxin
#配置虚拟用户的访问权限
#虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如要让用户kaivi具有上传文件的权
限,可修改/etc/vsftpd/vusers.d/kaivi文件,在里面添加如下选项并设置为YES即可,只读则设为NO
#注意:需确保对应的映射用户对于文件系统有写权限
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}

#登录目录改变至指定的目录
local_root=/data/ftproot2
mkidr /data/ftproot2

实验操作实现

实验环境:

三台主机,一台为FTP服务器,一台为MYSQL数据库服务器,一台为客户端,用来访问测试。

FTP服务器:centos7:192.168.32.7
MYSQL数据库服务器:centos8:192.168.32.8
客户端:centos6:192.168.32.6
都是最小化安装系统,其中防火墙以及selinux都处于关闭状态。

在数据库服务器上安装mysql数据库

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

[root@MYSQL ~]#systemctl enable --now mariadb.service
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
[root@MYSQL ~]#ss -ntl
State         Recv-Q         Send-Q                  Local Address:Port                  Peer Address:Port         
LISTEN        0              128                           0.0.0.0:22                         0.0.0.0:*            
LISTEN        0              128                              [::]:22                            [::]:*            
LISTEN        0              80                                  *:3306                             *:*            
[root@MYSQL ~]#

这里可以让数据库安全加固

[root@MYSQL ~]#mysql_secure_installation 

实验方便这里暂时不加了。

创建数据库以及存储虚拟用户数据库和表

[root@MYSQL ~]#mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.11-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

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

MariaDB [(none)]> use vsftpd
Database changed
MariaDB [vsftpd]> CREATE TABLE users (
    -> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    -> name CHAR(50) BINARY NOT NULL,
    -> password CHAR(48) BINARY NOT NULL
    -> );
Query OK, 0 rows affected (0.026 sec)

MariaDB [vsftpd]> 
MariaDB [vsftpd]> desc users;
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment |
| name     | char(50) | NO   |     | NULL    |                |
| password | char(48) | NO   |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.000 sec)

MariaDB [vsftpd]> insert into users(name,password) values("kaivi",password("centos"));
Query OK, 1 row affected (0.001 sec)

MariaDB [vsftpd]> insert into users(name,password) values("duanxin",password("centos"));
Query OK, 1 row affected (0.002 sec)

MariaDB [vsftpd]> 
MariaDB [vsftpd]> select * from users;
+----+---------+-------------------------------------------+
| id | name    | password                                  |
+----+---------+-------------------------------------------+
|  1 | kaivi   | *128977E278358FF80A246B5046F51043A2B1FCED |
|  2 | duanxin | *128977E278358FF80A246B5046F51043A2B1FCED |
+----+---------+-------------------------------------------+
2 rows in set (0.000 sec)

MariaDB [vsftpd]> 
MariaDB [vsftpd]> grant all on vsftpd.* to vsftpd@'192.168.32.%' identified by 'centos';
Query OK, 0 rows affected (0.000 sec)

MariaDB [vsftpd]> 

在centos7:192.168.32.7中安装数据库的客户端,验证是否能够成功访问centos8:192.168.32.8的数据库
在centos7:192.168.32.7中操作:

[root@FTP ~]#yum install mariadb -y

[root@FTP ~]#mysql -uvsftpd -pcentos -h192.168.32.8
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.3.11-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| vsftpd             |
+--------------------+
2 rows in set (0.00 sec)

MariaDB [(none)]> select * from vsftpd.users;
+----+---------+-------------------------------------------+
| id | name    | password                                  |
+----+---------+-------------------------------------------+
|  1 | kaivi   | *128977E278358FF80A246B5046F51043A2B1FCED |
|  2 | duanxin | *128977E278358FF80A246B5046F51043A2B1FCED |
+----+---------+-------------------------------------------+
2 rows in set (0.00 sec)

MariaDB [(none)]> exit
Bye

能够成功访问数据库。

在FTP服务器上安装vsftpd 和 pam_mysql包

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

[root@FTP ~]#yum install wget -y

[root@FTP ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
--2019-12-18 15:55:28--  http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
Resolving prdownloads.sourceforge.net (prdownloads.sourceforge.net)... 216.105.38.13
Connecting to prdownloads.sourceforge.net (prdownloads.sourceforge.net)|216.105.38.13|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://downloads.sourceforge.net/project/pam-mysql/pam-mysql/0.7RC1/pam_mysql-0.7RC1.tar.gz [following]
--2019-12-18 15:55:30--  http://downloads.sourceforge.net/project/pam-mysql/pam-mysql/0.7RC1/pam_mysql-0.7RC1.tar.gz
Resolving downloads.sourceforge.net (downloads.sourceforge.net)... 216.105.38.13
Reusing existing connection to prdownloads.sourceforge.net:80.
HTTP request sent, awaiting response... 302 Found
Location: https://jaist.dl.sourceforge.net/project/pam-mysql/pam-mysql/0.7RC1/pam_mysql-0.7RC1.tar.gz [following]
--2019-12-18 15:55:31--  https://jaist.dl.sourceforge.net/project/pam-mysql/pam-mysql/0.7RC1/pam_mysql-0.7RC1.tar.gz
Resolving jaist.dl.sourceforge.net (jaist.dl.sourceforge.net)... 150.65.7.130, 2001:df0:2ed:feed::feed
Connecting to jaist.dl.sourceforge.net (jaist.dl.sourceforge.net)|150.65.7.130|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 335240 (327K) [application/x-gzip]
Saving to: ‘pam_mysql-0.7RC1.tar.gz’

100%[=========================================================================>] 335,240      752KB/s   in 0.4s   

2019-12-18 15:55:32 (752 KB/s) - ‘pam_mysql-0.7RC1.tar.gz’ saved [335240/335240]

[root@FTP ~]#ls
anaconda-ks.cfg  ifcfg-eth0  init.sh  pam_mysql-0.7RC1.tar.gz
[root@FTP ~]#

pam-mysql源码进行编译

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

[root@FTP ~]#tar xvf pam_mysql-0.7RC1.tar.gz
[root@FTP ~]#ll
total 352
-rw-------. 1 root  root    1612 Dec  5 21:45 anaconda-ks.cfg
-rw-r--r--  1 root  root     155 Dec  5 22:10 ifcfg-eth0
-rw-r--r--. 1 root  root   11537 Nov  7 17:24 init.sh
drwxrwxrwx  2 kaivi kaivi   4096 Jan  9  2006 pam_mysql-0.7RC1
-rw-r--r--  1 root  root  335240 Jan  9  2006 pam_mysql-0.7RC1.tar.gz
[root@FTP ~]#cd pam_mysql-0.7RC1
[root@FTP pam_mysql-0.7RC1]#ls
acinclude.m4  config.guess  configure     CREDITS     ltmain.sh    missing        pam_mysql.c        pkg.m4
aclocal.m4    config.h.in   configure.in  INSTALL     Makefile.am  mkinstalldirs  pam_mysql.spec     README
ChangeLog     config.sub    COPYING       install-sh  Makefile.in  NEWS           pam_mysql.spec.in  stamp-h.in
[root@FTP pam_mysql-0.7RC1]#./configure --with-pam-mods-dir=/lib64/security
......
checking md5.h presence... no
checking for md5.h... no
checking if md5.h is Solaris's... no
checking for md5.h... (cached) no
checking for MD5Data... no
checking for crypt in -lcrypt... yes
checking for crypt... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating pam_mysql.spec
config.status: creating config.h
config.status: executing default-1 commands
[root@FTP pam_mysql-0.7RC1]#
[root@FTP pam_mysql-0.7RC1]#make && make install
......

[root@FTP pam_mysql-0.7RC1]#cd

[root@FTP ~]#ll /lib64/security/pam_mysql*
-rwxr-xr-x 1 root root    882 Dec 18 16:00 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 141768 Dec 18 16:00 /lib64/security/pam_mysql.so
[root@FTP ~]#

pam认证所需文件查看:

[root@FTP pam_mysql-0.7RC1]#pwd
/root/pam_mysql-0.7RC1
[root@FTP pam_mysql-0.7RC1]#cat README  #参考README文件

在FTP服务器上建立pam认证所需文件

[root@FTP pam_mysql-0.7RC1]#cd /etc/pam.d/
[root@FTP pam.d]#ls
chfn              fingerprint-auth-ac  password-auth-ac  runuser            smtp.postfix  su-l            vmtoolsd
chsh              login                polkit-1          runuser-l          sshd          system-auth     vsftpd
config-util       other                postlogin         smartcard-auth     su            system-auth-ac
crond             passwd               postlogin-ac      smartcard-auth-ac  sudo          systemd-user
fingerprint-auth  password-auth        remote            smtp               sudo-i        vlock

[root@FTP pam.d]#vim vsftpd.mysql

[root@FTP pam.d]#cat vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=centos host=192.168.32.8 db=vsftpd 
table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=centos host=192.168.32.8 db=vsftpd 
table=users usercolumn=name passwdcolumn=password crypt=2
[root@FTP pam.d]#

建立相应用户和修改vsftpd配置文件

[root@FTP ~]#useradd -s /sbin/nologin -d /data/ftproot -r vuser #创建系统账户,用于映射

[root@FTP ~]#mkdir /data/ftproot/upload -pv   #建立访问家目录,同时建立一个子文件夹用来给用户上传数据
mkdir: created directory ‘/data/ftproot’
mkdir: created directory ‘/data/ftproot/upload’

[root@FTP ~]#ll -d /data/ftproot/
drwxr-xr-x 3 root root 20 Dec 18 16:13 /data/ftproot/

[root@FTP ~]#ll -d /data/ftproot/upload/
drwxr-xr-x 2 root root 6 Dec 18 16:13 /data/ftproot/upload/

[root@FTP ~]#setfacl -m u:vuser:rwx /data/ftproot/upload/   #授权给映射账户rwx权限用于上传数据
[root@FTP ~]#
[root@FTP ~]#vim /etc/vsftpd/vsftpd.conf      #修改配置文件
#pam_service_name=vsftpd                #默认访问的是vsftpd,注释掉
pam_service_name=vsftpd.mysql          #新增把pam调用用户数据指向vsftpd.mysql
userlist_enable=YES    
tcp_wrappers=YES

anonymous_enable=YES            #允许匿名访问,不然可能密码都不给机会输入就拒绝访问
guest_enable=YES                #开启映射功能
guest_username=vuser            #开启映射都指向vuser账户

[root@FTP ~]#systemctl start vsftpd         #开启对应的vsftpd服务
[root@FTP ~]#ss -ntl                        #21端口
State       Recv-Q Send-Q            Local Address:Port                           Peer Address:Port              
LISTEN      0      128                           *:22                                        *:*                  
LISTEN      0      100                   127.0.0.1:25                                        *:*                  
LISTEN      0      32                           :::21                                       :::*                  
LISTEN      0      128                          :::22                                       :::*                  
LISTEN      0      100                         ::1:25                                       :::*                  
[root@FTP ~]#

自此,基本的基于数据库的共享vsftpd服务搭建成功,但是每个用户访问以及权限都是一致的,访问的目录文件夹也是一样的。

建立一些测试数据:

[root@FTP ~]#touch /data/ftproot/ftproot1.txt
[root@FTP ~]#

在测试客户端centos6:192.168.32.6中访问测试

用账号kaivi进行测试:

[root@Client ~]#ftp 192.168.32.7
Connected to 192.168.32.7 (192.168.32.7).
220 (vsFTPd 3.0.2)
Name (192.168.32.7:root): kaivi     #登入用户
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (192,168,32,7,199,2).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 08:23 ftproot1.txt  #访问到/data/ftproot
drwxrwxr-x    2 0        0               6 Dec 18 08:13 upload
226 Directory send OK.
ftp> 
ftp> !ls              #查看本机的数据
anaconda-ks.cfg  init.sh  install.log  install.log.syslog
ftp> put anaconda-ks.cfg        #上传数据       
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,32,7,217,1).   
550 Permission denied.          #失败,权限被拒绝
ftp>  

用账号duanxin进行测试:

[root@Client ~]#ftp 192.168.32.7
Connected to 192.168.32.7 (192.168.32.7).
220 (vsFTPd 3.0.2)
Name (192.168.32.7:root): duanxin     #登入账号
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (192,168,32,7,75,27).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 08:23 ftproot1.txt #访问到/data/ftproot
drwxrwxr-x    2 0        0               6 Dec 18 08:13 upload
226 Directory send OK.
ftp> 
ftp> !ls
anaconda-ks.cfg  init.sh  install.log  install.log.syslog
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,32,7,80,179).
550 Permission denied.            # 也失败,权限被拒绝
ftp> 

接下来需要实现不同的权限设置,单独让kaivi账号能上传文件。

[root@FTP ~]#vim /etc/vsftpd/vsftpd.conf 
user_config_dir=/etc/vsftpd/vusers.d/        #新增命令,让不同的用户访问不同的目录文件

[root@FTP ~]#cd /etc/vsftpd/
[root@FTP vsftpd]#ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh

[root@FTP vsftpd]#mkdir vusers.d/

[root@FTP vsftpd]#cd vusers.d/

[root@FTP vusers.d]#vim kaivi

[root@FTP vusers.d]#cat kaivi 
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#这里只对kaivi账户单独建立一个管理文件夹,并且给与了上传数据的授权
[root@FTP vusers.d]#systemctl restart vsftpd

在测试客户端centos6:192.168.32.6中访问测试

用账号kaivi进行测试:

[root@Client ~]#ftp 192.168.32.7
Connected to 192.168.32.7 (192.168.32.7).
220 (vsFTPd 3.0.2)
Name (192.168.32.7:root): kaivi
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,32,7,243,231).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 08:23 ftproot1.txt
drwxrwxr-x    2 0        0               6 Dec 18 08:13 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg          #上传文件
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,32,7,196,125).
150 Ok to send data.
226 Transfer complete.            #上传成功
957 bytes sent in 0.0566 secs (16.92 Kbytes/sec)
ftp> 
但是这里由于账号duanxin没有设置,所以默认duanxin账号依旧没有上传文件的权限

实现不同的用户账号访问不同的目录文件。即:

kaivi访问文件目录是/data/ftproot1
duanxin访问文件目录是/data/ftproot2

[root@FTP vusers.d]#pwd
/etc/vsftpd/vusers.d
[root@FTP vusers.d]#mkdir /data/ftproot2        #创建一个新的文件夹

[root@FTP vusers.d]#touch /data/ftproot2/ftproot2.txt    #创建一个单独文件,用来区分访问目录
[root@FTP vusers.d]#
[root@FTP vusers.d]#vim duanxin

[root@FTP vusers.d]#cat duanxin
local_root=/data/ftproot2        #添加访问的目录

在测试客户端centos6:192.168.32.6中访问测试

用账号duanxin进行测试:

[root@Client ~]#ftp 192.168.32.7
Connected to 192.168.32.7 (192.168.32.7).
220 (vsFTPd 3.0.2)
Name (192.168.32.7:root): duanxin     #登入账号
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,32,7,165,14).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 08:42 ftproot2.txt  #表示访问的是/data/ftproot2
226 Directory send OK.
ftp> 

用账号kaivi进行测试:

[root@Client ~]#ftp 192.168.32.7
Connected to 192.168.32.7 (192.168.32.7).
220 (vsFTPd 3.0.2)
Name (192.168.32.7:root): kaivi        #登入账号
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,32,7,75,90).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 08:23 ftproot1.txt  #表示访问的是/data/ftproot1
drwxrwxr-x    2 0        0              29 Dec 18 08:37 upload
226 Directory send OK.
ftp> 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值