1 前言php
须要解决由FTP上传的文件自动以某个应用程序的身份保存的惟一方式是使用VSFTP的虚拟用户,因为笔者对MySQL比较熟悉,因此利用PAM_MySQL模块将VSFTP与MySQL集成。另外,本文不但整理了CentOS6与CentOS7的安装配置方法,并且同时涵盖了RPM包与编译两种安装方法。html
2 理论基础
mysql
2.1 PAM模块的介绍linux
所谓虚拟用户,即经过pam模块将vsftp与数据库集成,将vsftp的传统身份验证方式变成经过数据库中保存的账号密码验证,用户的身份并不是系统用户,而需由pam模块虚拟出来的用户,故称虚拟用户。c++
2.2 PAM模块的加载web
vim /etc/pam.d/vsftpd
注:经过编辑pam.d目录下的规则实现加载
sql
2.3 PAM模块的选项shell
配置例子:
数据库
auth optional pam_mysql.so user=root passwd=password account required pam_mysql.so user=root passwd=password
其余选项apache
-- 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 安装配置工具
yum install -y wget vim
3.1.2 安装编译工具包(可选,编译安装才须要)
yum install -y gcc gcc-c++ make expat-devel
3.1.3 MySQL安装
1)配置MySQL的源
vim /etc/yum.repos.d/mysql56-community.repo
输入以下内容:
# 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)安装数据库相关包
yum install -y mysql-community-server mysql-community-devel mysql-community-client
3.1.4 安装相关包
yum install -y vsftpd pam-devel httpd
3.1.5 下载pam模块(可选,编译安装才须要)
wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
3.1.6 开启防火墙端口
In CentOS 6:
vim /etc/sysconfig/iptables
加入以下行:
-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
重启防火墙服务:
/etc/init.d/iptables restart
In CentOS 7:
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
setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
3.2 安装pam模块
3.2.1 yum方式安装
In CentOS 6:
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:
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)解压安装包
tar -xf pam_mysql-0.7RC1.tar.gz
2)编译并安装
cd pam_mysql-0.7RC1 ./configure --with-mysql=/usr/bin/mysql_config make && make install
若是提示错误如下错误:
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.
可增长参数解决:
./configure --with-mysql=/usr/bin/mysql_config --with-pam-mods-dir=/usr/lib64/security
3.3 配置数据库
3.3.1 启动服务并配置自动启动
In CentOS 6:
/etc/init.d/mysqld start chkconfig mysqld on
In CentOS 7:
systemctl start mysqld systemctl enable mysqld
3.3.2 初始化数据库
mysql_secure_installation
向导以下:
[...] 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 建立验证数据库
mysql -uroot -p create database vsftpd;
3.3.4 建立验证数据表
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 添加测试数据
insert into vsftpd.users(name,passwd) values ('test1',password('123456'));
查询数据库中的帐号:
select * from vsftpd.users;
3.3.6 配置验证帐号
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 测试验证帐号
mysql -uvsftpd -pabc123
3.4 配置vsftp
3.4.1 备份配置文件
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.defalut vim /etc/vsftpd/vsftpd.conf
输入以下配置:
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
重要代码解析:
第9行声明调用PAM_MySQL模块 第11行决定上传代码的属主是apache,也能够映射到其余本地用户,请灵活运用 第12行限制用户chroot,限制FTP用户浏览其余非权限目录 第13和14行根据登陆的帐号动态指定用户根目录 第15行向FTP用户显示属主和属组为FTP
3.4.2 配置pam
确认pam_mysql.so的位置:
find / -name \*pam_mysql.so\*
假设显示以下:
/lib/security/pam_mysql.so
加载认证模块:
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.defautl vim /etc/pam.d/vsftpd
修改配置以下:
#%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 建立用户配置文件目录
mkdir -p /var/www/test1
3.4.4 配置映射用户目录权限
查询映射用户的家目录
cat /etc/passwd | grep apache
显示以下:
apache:x:48:48:Apache:/var/www:/sbin/nologin
修改映射用户的属主
chown apache:apache /var/www/test1
3.4.5 重启服务
In CentOS 6:
/etc/init.d/vsftpd restart
In CentOS 7:
systemctl restart vsftpd
3.5 测试并调试
3.5.1 监视日志
tail -f /var/log/secure tail -f /var/log/vsftpd.log
注:若是登录成功secure中没有任何日志,但vsftpd.log中会有登录成功的提示,这时候不管是否能正常使用都表示PAM_MySQL模块已经配置好,请检查VSFTP的配置。
3.5.2 尝试登录
ftp://10.168.0.51/
注:若是登录不成功请根据监视日志的提示信息排错。
4 用户管理工具的使用
4.1 工具的下载
http://down.51cto.com/data/2298015
注:该工具是笔者本身写的,请按照本身的需求肯定是否使用。
4.2 安装配置
4.2.1 部署工具
tar -xf vsftpcli.tar cp vsftpcli /usr/bin/ chmod 700 /usr/bin/vsftpcli
4.2.2 工具的常量定义
vim /usr/bin/vsftpcli
修改如下常量:
mysql_user='root' #数据库链接的帐号 mysql_pass='abc123' #数据库链接的密码 mysql_host='localhost' #数据库主机 mysql_host='3306' #数据库的端口 basedir='/var/www' #网站的根目录 localuser='apache' #网站的属主 localgroup='apache' #网站的属组
4.3 工具的使用
4.3.1 获取帮助
vsftpcli
显示以下:
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 增长用户
vsftpcli add user1 123456 vsftpcli add user2 123456 vsftpcli add user3 123456
4.3.3 打印用户
vsftpcli print
4.3.4 删除用户
vsftpcli remove user2
4.3.5 重命名用户
vsftpcli rename user3 user2
4.3.6 更改用户密码
vsftpcli chpasswd user2 456789
参阅地址:
==================================
PAM-MySQL:
http://pam-mysql.sourceforge.net
http://pam-mysql.sourceforge.net/Documentation/
VSFTPD: