vsftp通过pam集成mysql身份验证

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

1 前言

需要解决由FTP上传的文件自动以某个应用程序的身份保存的唯一方式是使用VSFTP的虚拟用户,由于笔者对MySQL比较熟悉,所以利用PAM_MySQL模块将VSFTP与MySQL集成。另外,本文不但整理了CentOS6与CentOS7的安装配置方法,而且同时涵盖了RPM包与编译两种安装方法。

2 理论基础

2.1 PAM模块的介绍

所谓虚拟用户,即通过pam模块将vsftp与数据库集成,将vsftp的传统身份验证方式变成通过数据库中保存的帐号密码验证,用户的身份并非系统用户,而需由pam模块虚拟出来的用户,故称虚拟用户。

2.2 PAM模块的加载

1
vim  /etc/pam .d /vsftpd

注:通过编辑pam.d目录下的规则实现加载

2.3 PAM模块的选项

配置例子:

1
2
auth       optional     pam_mysql.so user=root  passwd =password
account    required     pam_mysql.so user=root  passwd =password

其他选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- verbose 设置为1则显示详细的调试信息,默认0
-- debug 开启调试模式
-- user mysql数据库认证的用户名
--  passwd  mysql数据库认证的密码
-- host mysql数据库的主机名称或IP
-- db 包含验证信息的数据库名称
-- table 包含验证信息的数据库表名称
-- update_table 包含密码更高的数据库表名称,不配置默认赋予table的值
-- usercolumn 包含验证的用户名列
-- passwdcolumn 包含验证的密码列
-- statcolumn 标记用户状态的列
   --- 0表示用户已经过期;
   --- 1表示要求用户更改密码
-- crypt 密码加密方式,
   --- 0无加密,默认为此值;
   --- 1使用crypt(3)函数加密;
   --- 2使用MySQL的PASSWORD函数加密;
   --- 3使用普通十六进制md5加密;
   --- 4使用普通十六机制SHA1加密;
-- md5 使用md5进行crypt(3)哈希,当crypt设置为“Y”才有效,默认 false
-- use_323_passwd 使用MySQL版本3风格的加密功能(兼容迁移),默认 false
-- where 查询的附加条件如 [where=Host.name= "web"  AND User.active=1]
-- sqllog 设置为“ true ”或“ yes ”,则启用SQL日志记录,默认 false
-- logtable 存储日志的表名称
-- logmsgcoumn 该列存储日志的消息
-- logusercolumn 该列存储产生日志的用户名
-- logpidcolumn 该列存储产生日志的进程PID

注:以上是本人对原文的理解翻译(详细请参阅源码包的README文件),如果有误欢迎指正。

3 实践部分

3.1 环境配置

3.1.1 安装配置工具

1
yum  install  -y wget vim

3.1.2 安装编译工具包(可选,编译安装才需要)

1
yum  install  -y gcc gcc-c++  make  expat-devel

3.1.3 MySQL安装


1)配置MySQL的源

1
vim  /etc/yum .repos.d /mysql56-community .repo

输入如下内容:

1
2
3
4
5
6
7
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http: //repo .mysql.com /yum/mysql-5 .6-community /el/7/ $basearch/
enabled=1
gpgcheck=1
gpgkey=http: //repo .mysql.com /RPM-GPG-KEY-mysql

2)安装数据库相关包

1
yum  install  -y mysql-community-server mysql-community-devel mysql-community-client

3.1.4 安装相关包

1
yum  install  -y vsftpd pam-devel httpd

3.1.5 下载pam模块可选,编译安装才需要)

1
wget http: //prdownloads .sourceforge.net /pam-mysql/pam_mysql-0 .7RC1. tar .gz

3.1.6 开启防火墙端口

In CentOS 6:

1
vim  /etc/sysconfig/iptables

加入如下行:

1
2
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 50000:60000 -j ACCEPT

重启防火墙服务:

1
/etc/init .d /iptables  restart

In CentOS 7:

1
2
3
4
firewall-cmd --permanent --add-service  ftp
firewall-cmd --permanent --add-port 50000-60000 /tcp
firewall-cmd --reload
firewall-cmd --list-all

3.1.7 关闭selinux

1
2
setenforce 0
sed  -i  's/SELINUX=enforcing/SELINUX=disabled/g'  /etc/selinux/config

3.2 安装pam模块

3.2.1 yum方式安装

In CentOS 6:

1
yum  install  -y http: //dl .fedoraproject.org /pub/epel/6/i386/pam_mysql-0 .7-0.12.rc1.el6.i686.rpm

注:下载页面,

http://dl.fedoraproject.org/pub/epel/6/i386/

In CentOS 7:

1
yum  install  -y  ftp : //ftp .pbone.net /mirror/archive .fedoraproject.org /fedora/linux/releases/20/Everything/x86_64/os/Packages/p/pam_mysql-0 .7-0.16.rc1.fc20.x86_64.rpm

注:下载页面,

http://rpm.pbone.net/index.php3/stat/4/idpl/25165183/dir/fedora_20/com/pam_mysql-0.7-0.16.rc1.fc20.x86_64.rpm.html

3.2.2 编译安装方式可选,编译安装才需要)

1)解压安装包

1
tar  -xf pam_mysql-0.7RC1. tar .gz

2)编译并安装

1
2
3
cd  pam_mysql-0.7RC1
. /configure  --with-mysql= /usr/bin/mysql_config
make  &&  make  install

如果提示错误以下错误:

1
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.

可增加参数解决:

1
. /configure  --with-mysql= /usr/bin/mysql_config  --with-pam-mods- dir = /usr/lib64/security

3.3 配置数据库

3.3.1 启动服务并配置自动启动

In CentOS 6:

1
2
/etc/init .d /mysqld  start
chkconfig mysqld on

In CentOS 7:

1
2
systemctl start mysqld
systemctl  enable  mysqld

3.3.2 初始化数据库

1
mysql_secure_installation

向导如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[...]
Enter current password  for  root (enter  for  none):
OK, successfully used password, moving on...
[...]
Set root password? [Y /n ] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
  ... Success!
[...]
Remove anonymous  users ? [Y /n ] y
  ... Success!
[...]
Disallow root login remotely? [Y /n ] n
  ... skipping.
[...]
Remove  test  database and access to it? [Y /n ] y
  - Dropping  test  database...
  ... Success!
  - Removing privileges on  test  database...
  ... Success!
[...]
Reload privilege tables now? [Y /n ] y
  ... Success!
[...]

3.3.3 创建验证数据库

1
2
mysql -uroot -p
create database vsftpd;

3.3.4 创建验证数据表

1
2
3
4
5
6
7
use vsftpd;
create table  users  (
   id  int auto_increment not null,
   name char(20) not null unique key,
   passwd  char(48) not null,
   primary key( id )
);

3.3.5 添加测试数据

1
insert into vsftpd. users (name, passwd ) values ( 'test1' ,password( '123456' ));

查询数据库中的账号:

1
select  * from vsftpd. users ;

3.3.6 配置验证账号

1
2
3
grant  select  on vsftpd.* to vsftpd@localhost identified by  'abc123' ;
grant  select  on vsftpd.* to vsftpd@127.0.0.1 identified by  'abc123' ;
flush privileges;

3.3.7 测试验证账号

1
  mysql -uvsftpd -pabc123

3.4 配置vsftp

3.4.1 备份配置文件

1
2
cp  /etc/vsftpd/vsftpd .conf  /etc/vsftpd/vsftpd .conf.defalut
vim  /etc/vsftpd/vsftpd .conf

输入如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
listen=YES
anonymous_enable=NO
local_enable=YES
virtual_use_local_privs=YES
write_enable=YES
connect_from_port_20=YES
pasv_min_port=50000
pasv_max_port=60000
pam_service_name=vsftpd
guest_enable=YES
guest_username=apache
chroot_local_user=YES
allow_writeable_chroot=YES
user_sub_token=$USER
local_root= /var/www/ $USER
hide_ids=YES
xferlog_enable=YES
xferlog_file= /var/log/vsftpd .log

重要代码解析:

1
2
3
4
5
第9行声明调用PAM_MySQL模块
第11行决定上传代码的属主是apache,也可以映射到其他本地用户,请灵活运用
第12行限制用户chroot,限制FTP用户浏览其他非权限目录
第13和14行根据登录的账号动态指定用户根目录
第15行向FTP用户显示属主和属组为FTP

3.4.2 配置pam

确认pam_mysql.so的位置:

1
find  / -name \*pam_mysql.so\*

假设显示如下:

1
/lib/security/pam_mysql .so

加载认证模块:

1
2
cp  /etc/pam .d /vsftpd  /etc/pam .d /vsftpd .defautl
vim  /etc/pam .d /vsftpd

修改配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
#数据库认证
auth       sufficient    /lib/security/pam_mysql .so user=vsftpd  passwd =abc123 host=localhost db=vsftpd table= users  usercolumn=name passwdcolumn= passwd  crypt=2
#vsftp默认的其余认证
auth       required     pam_listfile.so item=user sense=deny  file = /etc/vsftpd/ftpusers  onerr=succeed
auth       required     pam_shells.so
auth       include      password-auth
#授权和认证也是一样的
account    sufficient    /lib/security/pam_mysql .so user=vsftpd  passwd =abc123 host=localhost db=vsftpd table= users  usercolumn=name passwdcolumn= passwd  crypt=2
account    include      password-auth
session    required     pam_loginuid.so
session    include      password-auth

注:请根据pam_mysql.so实际路径写,不同的安装方法位置会有所不同。

3.4.3 创建用户配置文件目录

1
mkdir  -p  /var/www/test1

3.4.4 配置映射用户目录权限

查询映射用户的家目录

1
cat  /etc/passwd  grep  apache

显示如下:

1
apache:x:48:48:Apache: /var/www : /sbin/nologin

修改映射用户的属主

1
chown  apache:apache  /var/www/test1

3.4.5 重启服务

In CentOS 6:

1
/etc/init .d /vsftpd  restart

In CentOS 7:

1
systemctl restart vsftpd

3.5 测试并调试

3.5.1 监视日志

1
2
tail  -f  /var/log/secure
tail  -f  /var/log/vsftpd .log

注:如果登陆成功secure中没有任何日志,但vsftpd.log中会有登陆成功的提示,这时候无论是否能正常使用都表示PAM_MySQL模块已经配置好,请检查VSFTP的配置。

3.5.2 尝试登陆

1
ftp : //10 .168.0.51/

注:如果登陆不成功请根据监视日志的提示信息排错。

4 用户管理工具的使用

4.1 工具的下载

http://down.51cto.com/data/2298015

注:该工具是笔者自己写的,请按照自己的需求确定是否使用。

4.2 安装配置

4.2.1 部署工具

1
2
3
tar  -xf vsftpcli. tar
cp  vsftpcli  /usr/bin/
chmod  700  /usr/bin/vsftpcli

4.2.2 工具的常量定义

1
vim  /usr/bin/vsftpcli

修改以下常量:

1
2
3
4
5
6
7
8
mysql_user= 'root'  #数据库连接的账号
mysql_pass= 'abc123'  #数据库连接的密码
mysql_host= 'localhost'  #数据库主机
mysql_host= '3306'  #数据库的端口
 
basedir= '/var/www'  #网站的根目录
localuser= 'apache'  #网站的属主
localgroup= 'apache'  #网站的属组

4.3 工具的使用

4.3.1 获取帮助

1
vsftpcli

显示如下:

1
2
3
4
5
Usage:  /usr/bin/vsftpcli  <add> <ftpname> <ftppasswd>
        /usr/bin/vsftpcli  <remove> <ftpname>
        /usr/bin/vsftpcli  <rename> <oldusername> <newusername>
        /usr/bin/vsftpcli  <chpasswd> <ftpname> <ftppasswd>
        /usr/bin/vsftpcli  <print>

4.3.2 增加用户

1
2
3
vsftpcli add user1 123456
vsftpcli add user2 123456
vsftpcli add user3 123456

4.3.3 打印用户

1
vsftpcli print

4.3.4 删除用户

1
vsftpcli remove user2

4.3.5 重命名用户

1
vsftpcli rename user3 user2

4.3.6 更改用户密码

1
vsftpcli chpasswd user2 456789










本文转自 tanzhenchao 51CTO博客,原文链接:http://blog.51cto.com/cmdschool/1905678,如需转载请自行联系原作者
目录
相关文章
|
关系型数据库 MySQL 数据库
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
981 0
|
缓存 JSON 算法
(三).NET Core WebAPI集成JWT,实现身份验证
前两篇文章给大家介绍了在.NET Core中如何使用Swagger的文章,那今天给大家分享一下JWT 在做接口开发的同学可能都有感受,我的接口如何保护的问题,如果没有身份验证,那不是接口完全暴露在外面,任意使人调用,这显然不是我们想要的一种结果。当然做身份验证的方式有多种,今天给大家讲一种比较流行了,标准的身份验证JWT 什么是JWT?
|
关系型数据库 MySQL
MySQL 8 默认身份验证插件caching_sha2_password
默认身份验证插件caching_sha2_password
356 0
|
前端开发 Java
Shiro框架学习笔记(三)与web集成之后进行简单的身份验证
Shiro框架学习笔记(三)与web集成之后进行简单的身份验证
Shiro框架学习笔记(三)与web集成之后进行简单的身份验证
|
存储 关系型数据库 MySQL
下一篇
无影云桌面