vsftpd基于pam_mysql的虚拟用户机制

一、虚拟用户概述

vsftpd使用虚拟用户时,需要为所有的虚拟用户创建一个系统用户,因为无论vsftpd使用的是哪一种用户类型(匿名用户、系统用户、虚拟用户),最终都是要映射为操作系统上的一个用户,而每一个文件资源都有各自的权限,只有操作系统上的用户才能根据权限模型判断是否能够访问该文件资源。这里仅介绍vsftpd基于pam_mysql的虚拟用户机制的使用。

二、vsftpd基于pam_mysql的虚拟用户机制

1、编译安装pam_mysql

(1) 编译pam_mysql前要提供开发环境,并安装其依赖的程序包的开发包

[[email protected] ~]# yum -y groupinstall "Development Tools" "Server Platform Development"
[[email protected] ~]# yum -y install pam-devel openssl-devel mariadb-devel

(2) 下载pam_mysql的源码压缩包

#在pam_mysql官网上下载其压缩包

(3) 解压缩后进行编译安装

[[email protected] ~]# tar xf pam_mysql-0.7RC1.tar.gz
[[email protected] ~]# cd pam_mysql-0.7RC1/
[[email protected] pam_mysql-0.7RC1]# 
[[email protected] pam_mysql-0.7RC1]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
[[email protected] pam_mysql-0.7RC1]# make && make install

2、使用mysql创建用于存放用户账号密码的表

(1)启动mysql服务,并设置为开机自动启动

[[email protected] ~]# systemctl start mariadb.service
[[email protected] ~]# systemctl enable mariadb.service

(2)创建数据库vsftpd和表users

[[email protected] ~]# 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 [email protected] IDENTIFIED BY ‘mageedu‘;
mysql> GRANT SELECT ON vsftpd.* TO [email protected]‘127.0.0.1‘ IDENTIFIED BY ‘mageedu‘;
mysql> FLUSH PRIVILEGES;

3、创建一个pam配置文件

[[email protected] ~]# 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、创建系统用户,作为所有虚拟用户的映射用户

[[email protected] ~]#  useradd -s /sbin/nologin -d /ftproot vuser
[[email protected] ~]# ll -d /ftproot/
drwx------. 4 vuser vuser 87 Jun  9 21:48 /ftproot/    # 组用户和其它用户是没有任何权限的
[[email protected] ~]# chmod go+rx /ftproot/    # 为组用户和其他用户添加读和执行权限
[[email protected] ~]# chmod -w /ftproot        # 映射用户vuser的家目录不能有写权限
[[email protected] ~]# mkdir /ftproot/{pub,upload}    # 如果要想有写权限,可在家目录下创建具有写权限的子目录

5、编辑vsftpd配置文件,修改相关配置

[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES	         # 是否允许来宾账号访问
guest_username=vuser	         # 把所有来宾账号都映射为系统用户vuser
pam_service_name=vsftpd.mysql    # 修改对应的pam配置文件

6、启动服务

[[email protected] ~]# systemctl start vsftpd.service
[[email protected] ~]# ss -tnl | grep :21
LISTEN     0      32          :::21                      :::*

7、测试

(1)测试虚拟用户tom

[[email protected] ~]# 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

[[email protected] ~]# 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配置中匿名用户具有写权限

[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES        # 这一项需要启用,因为虚拟用户也是匿名用户

(2)确保虚拟用户的系统映射用户vuer对文件系统具有写权限

[[email protected] ~]# chown vuser /ftproot/upload

(3)测试

#测试虚拟用户tom

[[email protected] ~]# 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

[[email protected] ~]# 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支持每个虚拟用户单独使用一个配置文件,并且配置文件必须和用户名相同

[[email protected] ~]# mkdir /etc/vsftpd/vuser.conf.d
[[email protected] ~]# cd /etc/vsftpd/vuser.conf.d/
[[email protected] vuser.conf.d]# vim tom
anon_upload_enable=YES    # 允许tom上传文件
[[email protected] vuser.conf.d]# vim jerry
anon_upload_enable=NO    # 不允许jerry上传文件

2、编辑主配置文件/etc/vsftpd/vsftpd.conf

(1)设置不允许匿名用户上传

[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
#anon_upload_enable=YES    # 注释掉主配置文件中的该行配置

(2)明确设置加载vusers.conf.d目录中的配置文件

[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.conf.d

3、重启vsftpd服务

[[email protected] ~]# systemctl restart vsftpd.service

4、测试

#预期虚拟用户tom能够上传文件,而jerry则不能上传文件

#测试虚拟用户tom

[[email protected] ~]# 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

[[email protected] ~]# 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.    # 权限被拒绝!

测试成功。

时间: 2024-08-03 16:34:27

vsftpd基于pam_mysql的虚拟用户机制的相关文章

创建vsftpd的基于pam_mysql的虚拟用户机制

在centos7系统上实现搭建vsftp服务,基于pam_mysql的虚拟用户机制: 编译安装pam_mysql 准备环境: ]# yum -y groupinstall "Development Tools" "server Platform Development" ]# yum -y install pam-devel openssl-devel mariadb-devel mariadb-server ]# yum -y install vsftpd 解压p

vsftpd基于pam_mysql的虚拟用户认证

1.ftp用户 匿名用户:映射到某一个固定的系统用户,例如(ftp,vsftp,/var/ftp) 本地用户:系统用户,root及系统用户(0-999) 虚拟用户:nsswitch: name services switch  名称服务转换 PAM: Plugabl Plugable Authentication Modules  插入式认证模块本文主要讲解vsftpd基于pam_mysql的虚拟用户认证步骤. 2.准备环境 操作系统 主机名 IP地址 环境描述 CentOS 7.1 ch7 1

vsftpd的基于pam_mysql的虚拟用户机制

虚拟用户:是ftp中常用的一种策略,因为ftp服务古老而且不安全,使用匿名用户不能有效的控制权限,而本地用户可以登录操作系统,极为不安全,所以引入了虚拟用户的概念,其只是将多个虚拟用户映射为一个本地用户,此用户可以设置不允许登录,从而加强了系统的安全性,本问主要介绍基于mysql的虚拟用户 配置pam_mysql 下载地址:pam-mysql.sourceforge.net # yum -y  groupinstall  "Development Tools" "Server

vsftpd的基于pam_mysql的虚拟用户机制实现数据传输

vsftpd基于mysql服务实现: 查看是maradb中是否有pam-mysql,在目录/lib64/security/下. 没有就编译安装pam-mysql 步骤: 1. # yum -y  groupinstall  "Development Tools" "Server Platform Development" 2. # yum -y install pam-devel openssl-devel mariadb-devel mariadb-server

vsftpd基于pam_mysql的虚拟用户访问

ftp:File Transfer Protocol,工作在应用层的文件传输协议,监听在tcp的21号端口:而ftp协议的实现有vsftpd.lftp.Filezilla.proftpd等等. ftp的用户一般由三类: 匿名用户:不需要账号和密码就能直接登录 本地用户:当前系统上非系统用户登录,即本地的普通用户 虚拟用户:借助于其他的存储方式系统来远程登录,而非本地用户 由于ftp的文件传输是明文的,不具有安全性:于是就有了一种安全的ftp协议的实现,那就是vsftpd vsftpd是ftp协议

vsftpd基于pam_mysql做虚拟用户认证

(1)下载epel源 [[email protected] ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo  #下载阿里云的epel源 [[email protected] ~]# yum repolist (2)安装所需要的包 [[email protected] ~]# yum -y groupinstall "Development Tools" "Ser

vsftpd的基于pam_mysql的虚拟用户配置示例      

第一步:安装vsftpd和mariadb ~]# yum install mariadb-server ~]# yum install vsftpd 因为中CentOS 7平台上/lib64/security/中没有pam_mysql模块驱动,需要编译安装pam_mysql这个模块. 准备编译环境 安装Development Tools 和 service platform Development这两个包组,另外需要安装依赖到的开发包pam-devel,openssl-devel,mariadb

19、vftpd基于PAM_MYSQL进行虚拟用户的认证且每个用户有自己的独立目录及不同的访问权限

1.vsftp相关介绍FTP 是File Transfer Protocol(文件传输协议)的英文简称 两个连接:命令连接.数据连接(相对服务器来讲)FTP连接支持两种模式:主动模式(Port模式).被动模式(Passive模式)主动模式:服务器端通过20端口主动连接客户端,客户端监听在与服务器端建立命令连接的端口+1上,服务器工作在TCP/20被动模式:客户端使用自己与服务器端建立命令连接的端口+1上连接服务器端的随机端口,该随机端口在建立命令连接的时候已发给客户端 vsftp的用户有三种类型

vsftpd基于mysql做虚拟用户认证

虚拟用户: 用户账号存储于何处? 文件,MySQL,Redis, ... vsftpd的认证功能托管给pam: Pluggable Authencate Module,认证框架,认证库: 通过模块完成认证功能:/usr/lib64/security/ pam_mysql模块: 下载pam_mysql的源码包官方下载http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz (1)准备编译安装环境 [[email pro