一、虚拟用户概述
vsftpd使用虚拟用户时,需要为所有的虚拟用户创建一个系统用户,因为无论vsftpd使用的是哪一种用户类型(匿名用户、系统用户、虚拟用户),最终都是要映射为操作系统上的一个用户,而每一个文件资源都有各自的权限,只有操作系统上的用户才能根据权限模型判断是否能够访问该文件资源。这里仅介绍vsftpd基于pam_mysql的虚拟用户机制的使用。
二、vsftpd基于pam_mysql的虚拟用户机制
1、编译安装pam_mysql
(1) 编译pam_mysql前要提供开发环境,并安装其依赖的程序包的开发包
[root@ftp ~]# yum -y groupinstall "Development Tools" "Server Platform Development"
[root@ftp ~]# yum -y install pam-devel openssl-devel mariadb-devel
(2) 下载pam_mysql的源码压缩包
#在pam_mysql官网上下载其压缩包
(3) 解压缩后进行编译安装
[root@ftp ~]# tar xf pam_mysql-0.7RC1.tar.gz
[root@ftp ~]# cd pam_mysql-0.7RC1/
[root@ftp pam_mysql-0.7RC1]#
[root@ftp pam_mysql-0.7RC1]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
[root@ftp pam_mysql-0.7RC1]# make && make install
2、使用mysql创建用于存放用户账号密码的表
(1)启动mysql服务,并设置为开机自动启动
[root@ftp ~]# systemctl start mariadb.service
[root@ftp ~]# systemctl enable mariadb.service
(2)创建数据库vsftpd和表users
[root@ftp ~]# mysql
mysql> CREATE DATABASE vsftpd;
mysql> use vsftpd;
mysql> CREATE TABLE users (
id INT AUTO_INCREMENT NOT NULL PIRMARY KEY,
name CHAR(30) NOT NULL,
password CHAR(48) BINARY NOT NULL );
# mysql使用password()函数加密后的结果有48个字符
mysql> DESC users;
+----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(30) | NO | | NULL | |
| password | binary(48) | NO | | NULL | |
+----------+------------+------+-----+---------+----------------+
(3)为表插入数据
mysql> INSERT INTO usrs(name,password) VALUES ('tom',password('mageedu')),('jerry',password('mageedu.com'));
(4)授权
mysql> GRANT SELECT ON vsftpd.* TO vsftpd@localhost IDENTIFIED BY 'mageedu';
mysql> GRANT SELECT ON vsftpd.* TO vsftpd@'127.0.0.1' IDENTIFIED BY 'mageedu';
mysql> FLUSH PRIVILEGES;
3、创建一个pam配置文件
[root@ftp ~]# vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=mageedu host=localhost db=vsftpd table=users
usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=mageedu host=localhost db=vsftpd table=users
usercolumn=name passwdcolumn=password crypt=2
4、创建系统用户,作为所有虚拟用户的映射用户
[root@ftp ~]# useradd -s /sbin/nologin -d /ftproot vuser
[root@ftp ~]# ll -d /ftproot/
drwx------. 4 vuser vuser 87 Jun 9 21:48 /ftproot/ # 组用户和其它用户是没有任何权限的
[root@ftp ~]# chmod go+rx /ftproot/ # 为组用户和其他用户添加读和执行权限
[root@ftp ~]# chmod -w /ftproot # 映射用户vuser的家目录不能有写权限
[root@ftp ~]# mkdir /ftproot/{pub,upload} # 如果要想有写权限,可在家目录下创建具有写权限的子目录
5、编辑vsftpd配置文件,修改相关配置
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES # 是否允许来宾账号访问
guest_username=vuser # 把所有来宾账号都映射为系统用户vuser
pam_service_name=vsftpd.mysql # 修改对应的pam配置文件
6、启动服务
[root@ftp ~]# systemctl start vsftpd.service
[root@ftp ~]# ss -tnl | grep :21
LISTEN 0 32 :::21 :::*
7、测试
(1)测试虚拟用户tom
[root@ftp ~]# ftp 192.168.10.99
Connected to 192.168.10.99 (192.168.10.99).
220 (vsFTPd 3.0.2)
Name (192.168.10.99:root): tom # 输入虚拟用户tom
331 Please specify the password.
Password: # 输入虚拟用户tom的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
ftp> ls
227 Entering Passive Mode (192,168,10,99,223,134).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 6 Jun 09 13:35 pub
drwxr-xr-x 2 1000 0 64 Jun 09 14:25 upload
226 Directory send OK.
(2)测试虚拟用户jerry
[root@ftp ~]# ftp 192.168.10.99
Connected to 192.168.10.99 (192.168.10.99).
220 (vsFTPd 3.0.2)
Name (192.168.10.99:root): jerry # 输入虚拟用户jerry
331 Please specify the password.
Password: # 输入虚拟用户jerry的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,10,99,251,69).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 6 Jun 09 13:35 pub
drwxr-xr-x 2 1000 0 64 Jun 09 14:25 upload
226 Directory send OK.
测试成功。
三、其它需求
1、如何让虚拟用户具有上传文件的权限?
(1)确保vsftpd配置中匿名用户具有写权限
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES # 这一项需要启用,因为虚拟用户也是匿名用户
(2)确保虚拟用户的系统映射用户vuer对文件系统具有写权限
[root@ftp ~]# chown vuser /ftproot/upload
(3)测试
#测试虚拟用户tom
[root@ftp ~]# ftp 192.168.10.99
Connected to 192.168.10.99 (192.168.10.99).
220 (vsFTPd 3.0.2)
Name (192.168.10.99:root): tom # 输入虚拟用户tom
331 Please specify the password.
Password: # 输入虚拟用户tom的密码
ftp>
ftp> cd upload # 切换至有用户具有写权限的目录
ftp> lcd /etc # 外部shell切换至/etc目录
ftp> put fstab # 上传文件fstab
local: fstab remote: fstab
227 Entering Passive Mode (192,168,10,99,213,217).
150 Ok to send data.
226 Transfer complete. # 传输完成
541 bytes sent in 0.000189 secs (2862.43 Kbytes/sec)
ftp> ls
-rw------- 1 1000 1000 541 Jun 09 15:08 fstab
226 Directory send OK.
#测试虚拟用户jerry
[root@ftp ~]# ftp 192.168.10.99
Connected to 192.168.10.99 (192.168.10.99).
220 (vsFTPd 3.0.2)
Name (192.168.10.99:root): jerry # 输入虚拟用户jerry
331 Please specify the password.
Password: # 输入虚拟用户jerry的密码
ftp>
ftp> cd upload # 切换至有用户具有写权限的目录
ftp> lcd /etc # 外部shell切换至/etc目录
ftp> put issue # 上传文件issue
local: issue remote: issue
227 Entering Passive Mode (192,168,10,99,169,197).
150 Ok to send data.
226 Transfer complete. # 传输完成
23 bytes sent in 5.8e-05 secs (396.55 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,10,99,144,240).
150 Here comes the directory listing.
-rw------- 1 1000 1000 541 Jun 09 15:08 fstab
-rw------- 1 1000 1000 23 Jun 09 15:14 issue
226 Directory send OK.
测试成功。
2、虚拟用户tom和jerry都映射为系统上的一个用户vuser,能够设置tom和jerry的权限不一致,例如设置为tom能够上传文件,而jerry不能上传文件?
1、分别为每个虚拟用户添加单独一个配置文件
#vsftpd支持每个虚拟用户单独使用一个配置文件,并且配置文件必须和用户名相同
[root@ftp ~]# mkdir /etc/vsftpd/vuser.conf.d
[root@ftp ~]# cd /etc/vsftpd/vuser.conf.d/
[root@ftp vuser.conf.d]# vim tom
anon_upload_enable=YES # 允许tom上传文件
[root@ftp vuser.conf.d]# vim jerry
anon_upload_enable=NO # 不允许jerry上传文件
2、编辑主配置文件/etc/vsftpd/vsftpd.conf
(1)设置不允许匿名用户上传
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
#anon_upload_enable=YES # 注释掉主配置文件中的该行配置
(2)明确设置加载vusers.conf.d目录中的配置文件
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.conf.d
3、重启vsftpd服务
[root@ftp ~]# systemctl restart vsftpd.service
4、测试
#预期虚拟用户tom能够上传文件,而jerry则不能上传文件
#测试虚拟用户tom
[root@ftp ~]# ftp 192.168.10.99
Connected to 192.168.10.99 (192.168.10.99).
220 (vsFTPd 3.0.2)
Name (192.168.10.99:root): tom # 输入虚拟用户tom
331 Please specify the password.
Password: # 输入虚拟用户tom的密码
ftp>
ftp> cd upload
ftp> lcd /etc/
ftp> put grub2.cfg # 上传文件grub2.cfg
local: grub2.cfg remote: grub2.cfg
227 Entering Passive Mode (192,168,10,99,220,164).
150 Ok to send data.
226 Transfer complete. # 传输成功
4209 bytes sent in 0.000162 secs (25981.48 Kbytes/sec)
#测试虚拟用户jerry
[root@ftp ~]# ftp 192.168.10.99
Connected to 192.168.10.99 (192.168.10.99).
220 (vsFTPd 3.0.2)
Name (192.168.10.99:root): jerry # 输入虚拟用户jerry
331 Please specify the password.
Password: # 输入虚拟用户jerry的密码
ftp>
ftp> cd upload
ftp> lcd /etc/
ftp> put motd # 上传文件motd
local: motd remote: motd
227 Entering Passive Mode (192,168,10,99,188,33).
550 Permission denied. # 权限被拒绝!
测试成功。