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包
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>