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
|
注:下载页面,
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
|