1 前言
需要解决由FTP上传的文件自动以某个应用程序的身份保存的唯一方式是使用VSFTP的虚拟用户,由于笔者对MySQL比较熟悉,所以利用PAM_MySQL模块将VSFTP与MySQL集成。另外,本文不但整理了CentOS6与CentOS7的安装配置方法,而且同时涵盖了RPM包与编译两种安装方法。
2 理论基础
2.1 PAM模块的介绍
所谓虚拟用户,即通过pam模块将vsftp与数据库集成,将vsftp的传统身份验证方式变成通过数据库中保存的帐号密码验证,用户的身份并非系统用户,而需由pam模块虚拟出来的用户,故称虚拟用户。
2.2 PAM模块的加载
1
<code>vim </code><code>/etc/pam</code><code>.d</code><code>/vsftpd</code>
注:通过编辑pam.d目录下的规则实现加载
2.3 PAM模块的选项
配置例子:
2
<code>auth optional pam_mysql.so user=root </code><code>passwd</code><code>=password</code>
<code>account required pam_mysql.so user=root </code><code>passwd</code><code>=password</code>
其他选项
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
<code>-- verbose 设置为1则显示详细的调试信息,默认0</code>
<code>-- debug 开启调试模式</code>
<code>-- user mysql数据库认证的用户名</code>
<code>-- </code><code>passwd</code> <code>mysql数据库认证的密码</code>
<code>-- host mysql数据库的主机名称或IP</code>
<code>-- db 包含验证信息的数据库名称</code>
<code>-- table 包含验证信息的数据库表名称</code>
<code>-- update_table 包含密码更高的数据库表名称,不配置默认赋予table的值</code>
<code>-- usercolumn 包含验证的用户名列</code>
<code>-- passwdcolumn 包含验证的密码列</code>
<code>-- statcolumn 标记用户状态的列</code>
<code> </code><code>--- 0表示用户已经过期;</code>
<code> </code><code>--- 1表示要求用户更改密码</code>
<code>-- crypt 密码加密方式,</code>
<code> </code><code>--- 0无加密,默认为此值;</code>
<code> </code><code>--- 1使用crypt(3)函数加密;</code>
<code> </code><code>--- 2使用MySQL的PASSWORD函数加密;</code>
<code> </code><code>--- 3使用普通十六进制md5加密;</code>
<code> </code><code>--- 4使用普通十六机制SHA1加密;</code>
<code>-- md5 使用md5进行crypt(3)哈希,当crypt设置为“Y”才有效,默认</code><code>false</code>
<code>-- use_323_passwd 使用MySQL版本3风格的加密功能(兼容迁移),默认</code><code>false</code>
<code>-- where 查询的附加条件如 [where=Host.name=</code><code>"web"</code> <code>AND User.active=1]</code>
<code>-- sqllog 设置为“</code><code>true</code><code>”或“</code><code>yes</code><code>”,则启用SQL日志记录,默认</code><code>false</code>
<code>-- logtable 存储日志的表名称</code>
<code>-- logmsgcoumn 该列存储日志的消息</code>
<code>-- logusercolumn 该列存储产生日志的用户名</code>
<code>-- logpidcolumn 该列存储产生日志的进程PID</code>
注:以上是本人对原文的理解翻译(详细请参阅源码包的README文件),如果有误欢迎指正。
3 实践部分
3.1 环境配置
3.1.1 安装配置工具
<code>yum </code><code>install</code> <code>-y wget vim</code>
3.1.2 安装编译工具包(可选,编译安装才需要)
<code>yum </code><code>install</code> <code>-y gcc gcc-c++ </code><code>make</code> <code>expat-devel</code>
3.1.3 MySQL安装
1)配置MySQL的源
<code>vim </code><code>/etc/yum</code><code>.repos.d</code><code>/mysql56-community</code><code>.repo</code>
输入如下内容:
<code># Enable to use MySQL 5.6</code>
<code>[mysql56-community]</code>
<code>name=MySQL 5.6 Community Server</code>
<code>baseurl=http:</code><code>//repo</code><code>.mysql.com</code><code>/yum/mysql-5</code><code>.6-community</code><code>/el/7/</code><code>$basearch/</code>
<code>enabled=1</code>
<code>gpgcheck=1</code>
<code>gpgkey=http:</code><code>//repo</code><code>.mysql.com</code><code>/RPM-GPG-KEY-mysql</code>
2)安装数据库相关包
<code>yum </code><code>install</code> <code>-y mysql-community-server mysql-community-devel mysql-community-client</code>
3.1.4 安装相关包
<code>yum </code><code>install</code> <code>-y vsftpd pam-devel httpd</code>
3.1.5 下载pam模块(可选,编译安装才需要)
<code>wget http:</code><code>//prdownloads</code><code>.sourceforge.net</code><code>/pam-mysql/pam_mysql-0</code><code>.7RC1.</code><code>tar</code><code>.gz</code>
3.1.6 开启防火墙端口
In CentOS 6:
<code>vim </code><code>/etc/sysconfig/iptables</code>
加入如下行:
<code>-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT</code>
<code>-A INPUT -p tcp -m state --state NEW -m tcp --dport 50000:60000 -j ACCEPT</code>
重启防火墙服务:
<code>/etc/init</code><code>.d</code><code>/iptables</code> <code>restart</code>
In CentOS 7:
<code>firewall-cmd --permanent --add-service </code><code>ftp</code>
<code>firewall-cmd --permanent --add-port 50000-60000</code><code>/tcp</code>
<code>firewall-cmd --reload</code>
<code>firewall-cmd --list-all</code>
3.1.7 关闭selinux
<code>setenforce 0</code>
<code>sed</code> <code>-i </code><code>'s/SELINUX=enforcing/SELINUX=disabled/g'</code> <code>/etc/selinux/config</code>
3.2 安装pam模块
3.2.1 yum方式安装
<code>yum </code><code>install</code> <code>-y http:</code><code>//dl</code><code>.fedoraproject.org</code><code>/pub/epel/6/i386/pam_mysql-0</code><code>.7-0.12.rc1.el6.i686.rpm</code>
注:下载页面,
<a href="http://dl.fedoraproject.org/pub/epel/6/i386/" target="_blank">http://dl.fedoraproject.org/pub/epel/6/i386/</a>
<code>yum </code><code>install</code> <code>-y </code><code>ftp</code><code>:</code><code>//ftp</code><code>.pbone.net</code><code>/mirror/archive</code><code>.fedoraproject.org</code><code>/fedora/linux/releases/20/Everything/x86_64/os/Packages/p/pam_mysql-0</code><code>.7-0.16.rc1.fc20.x86_64.rpm</code>
<a href="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" target="_blank">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</a>
3.2.2 编译安装方式(可选,编译安装才需要)
1)解压安装包
<code>tar</code> <code>-xf pam_mysql-0.7RC1.</code><code>tar</code><code>.gz</code>
2)编译并安装
<code>cd</code> <code>pam_mysql-0.7RC1</code>
<code>.</code><code>/configure</code> <code>--with-mysql=</code><code>/usr/bin/mysql_config</code>
<code>make</code> <code>&& </code><code>make</code> <code>install</code>
如果提示错误以下错误:
<code>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.</code>
可增加参数解决:
<code>.</code><code>/configure</code> <code>--with-mysql=</code><code>/usr/bin/mysql_config</code> <code>--with-pam-mods-</code><code>dir</code><code>=</code><code>/usr/lib64/security</code>
3.3 配置数据库
3.3.1 启动服务并配置自动启动
<code>/etc/init</code><code>.d</code><code>/mysqld</code> <code>start</code>
<code>chkconfig mysqld on</code>
<code>systemctl start mysqld</code>
<code>systemctl </code><code>enable</code> <code>mysqld</code>
3.3.2 初始化数据库
<code>mysql_secure_installation</code>
向导如下:
<code>[...]</code>
<code>Enter current password </code><code>for</code> <code>root (enter </code><code>for</code> <code>none):</code>
<code>OK, successfully used password, moving on...</code>
<code>Set root password? [Y</code><code>/n</code><code>] y</code>
<code>New password:</code>
<code>Re-enter new password:</code>
<code>Password updated successfully!</code>
<code>Reloading privilege tables..</code>
<code> </code><code>... Success!</code>
<code>Remove anonymous </code><code>users</code><code>? [Y</code><code>/n</code><code>] y</code>
<code>Disallow root login remotely? [Y</code><code>/n</code><code>] n</code>
<code> </code><code>... skipping.</code>
<code>Remove </code><code>test</code> <code>database and access to it? [Y</code><code>/n</code><code>] y</code>
<code> </code><code>- Dropping </code><code>test</code> <code>database...</code>
<code> </code><code>- Removing privileges on </code><code>test</code> <code>database...</code>
<code>Reload privilege tables now? [Y</code><code>/n</code><code>] y</code>
3.3.3 创建验证数据库
<code>mysql -uroot -p</code>
<code>create database vsftpd;</code>
3.3.4 创建验证数据表
<code>use vsftpd;</code>
<code>create table </code><code>users</code> <code>(</code>
<code> </code><code>id</code> <code>int auto_increment not null,</code>
<code> </code><code>name char(20) not null unique key,</code>
<code> </code><code>passwd</code> <code>char(48) not null,</code>
<code> </code><code>primary key(</code><code>id</code><code>)</code>
<code>);</code>
3.3.5 添加测试数据
<code>insert into vsftpd.</code><code>users</code><code>(name,</code><code>passwd</code><code>) values (</code><code>'test1'</code><code>,password(</code><code>'123456'</code><code>));</code>
查询数据库中的账号:
<code>select</code> <code>* from vsftpd.</code><code>users</code><code>;</code>
3.3.6 配置验证账号
<code>grant </code><code>select</code> <code>on vsftpd.* to vsftpd@localhost identified by </code><code>'abc123'</code><code>;</code>
<code>grant </code><code>select</code> <code>on vsftpd.* to [email protected] identified by </code><code>'abc123'</code><code>;</code>
<code>flush privileges;</code>
3.3.7 测试验证账号
<code> </code><code>mysql -uvsftpd -pabc123</code>
3.4 配置vsftp
3.4.1 备份配置文件
<code>cp</code> <code>/etc/vsftpd/vsftpd</code><code>.conf </code><code>/etc/vsftpd/vsftpd</code><code>.conf.defalut</code>
<code>vim </code><code>/etc/vsftpd/vsftpd</code><code>.conf</code>
输入如下配置:
<code>listen=YES</code>
<code>anonymous_enable=NO</code>
<code>local_enable=YES</code>
<code>virtual_use_local_privs=YES</code>
<code>write_enable=YES</code>
<code>connect_from_port_20=YES</code>
<code>pasv_min_port=50000</code>
<code>pasv_max_port=60000</code>
<code>pam_service_name=vsftpd</code>
<code>guest_enable=YES</code>
<code>guest_username=apache</code>
<code>chroot_local_user=YES</code>
<code>allow_writeable_chroot=YES</code>
<code>user_sub_token=$USER</code>
<code>local_root=</code><code>/var/www/</code><code>$USER</code>
<code>hide_ids=YES</code>
<code>xferlog_enable=YES</code>
<code>xferlog_file=</code><code>/var/log/vsftpd</code><code>.log</code>
重要代码解析:
<code>第9行声明调用PAM_MySQL模块</code>
<code>第11行决定上传代码的属主是apache,也可以映射到其他本地用户,请灵活运用</code>
<code>第12行限制用户chroot,限制FTP用户浏览其他非权限目录</code>
<code>第13和14行根据登录的账号动态指定用户根目录</code>
<code>第15行向FTP用户显示属主和属组为FTP</code>
3.4.2 配置pam
确认pam_mysql.so的位置:
<code>find</code> <code>/ -name \*pam_mysql.so\*</code>
假设显示如下:
<code>/lib/security/pam_mysql</code><code>.so</code>
加载认证模块:
<code>cp</code> <code>/etc/pam</code><code>.d</code><code>/vsftpd</code> <code>/etc/pam</code><code>.d</code><code>/vsftpd</code><code>.defautl</code>
修改配置如下:
<code>#%PAM-1.0</code>
<code>session optional pam_keyinit.so force revoke</code>
<code>#数据库认证</code>
<code>auth sufficient </code><code>/lib/security/pam_mysql</code><code>.so user=vsftpd </code><code>passwd</code><code>=abc123 host=localhost db=vsftpd table=</code><code>users</code> <code>usercolumn=name passwdcolumn=</code><code>passwd</code> <code>crypt=2</code>
<code>#vsftp默认的其余认证</code>
<code>auth required pam_listfile.so item=user sense=deny </code><code>file</code><code>=</code><code>/etc/vsftpd/ftpusers</code> <code>onerr=succeed</code>
<code>auth required pam_shells.so</code>
<code>auth include password-auth</code>
<code>#授权和认证也是一样的</code>
<code>account sufficient </code><code>/lib/security/pam_mysql</code><code>.so user=vsftpd </code><code>passwd</code><code>=abc123 host=localhost db=vsftpd table=</code><code>users</code> <code>usercolumn=name passwdcolumn=</code><code>passwd</code> <code>crypt=2</code>
<code>account include password-auth</code>
<code>session required pam_loginuid.so</code>
<code>session include password-auth</code>
注:请根据pam_mysql.so实际路径写,不同的安装方法位置会有所不同。
3.4.3 创建用户配置文件目录
<code>mkdir</code> <code>-p </code><code>/var/www/test1</code>
3.4.4 配置映射用户目录权限
查询映射用户的家目录
<code>cat</code> <code>/etc/passwd</code> <code>| </code><code>grep</code> <code>apache</code>
显示如下:
<code>apache:x:48:48:Apache:</code><code>/var/www</code><code>:</code><code>/sbin/nologin</code>
修改映射用户的属主
<code>chown</code> <code>apache:apache </code><code>/var/www/test1</code>
3.4.5 重启服务
<code>/etc/init</code><code>.d</code><code>/vsftpd</code> <code>restart</code>
<code>systemctl restart vsftpd</code>
3.5 测试并调试
3.5.1 监视日志
<code>tail</code> <code>-f </code><code>/var/log/secure</code>
<code>tail</code> <code>-f </code><code>/var/log/vsftpd</code><code>.log</code>
注:如果登陆成功secure中没有任何日志,但vsftpd.log中会有登陆成功的提示,这时候无论是否能正常使用都表示PAM_MySQL模块已经配置好,请检查VSFTP的配置。
3.5.2 尝试登陆
<code>ftp</code><code>:</code><code>//10</code><code>.168.0.51/</code>
注:如果登陆不成功请根据监视日志的提示信息排错。
4 用户管理工具的使用
4.1 工具的下载
http://down.51cto.com/data/2298015
注:该工具是笔者自己写的,请按照自己的需求确定是否使用。
4.2 安装配置
4.2.1 部署工具
<code>tar</code> <code>-xf vsftpcli.</code><code>tar</code>
<code>cp</code> <code>vsftpcli </code><code>/usr/bin/</code>
<code>chmod</code> <code>700 </code><code>/usr/bin/vsftpcli</code>
4.2.2 工具的常量定义
<code>vim </code><code>/usr/bin/vsftpcli</code>
修改以下常量:
<code>mysql_user=</code><code>'root'</code> <code>#数据库连接的账号</code>
<code>mysql_pass=</code><code>'abc123'</code> <code>#数据库连接的密码</code>
<code>mysql_host=</code><code>'localhost'</code> <code>#数据库主机</code>
<code>mysql_host=</code><code>'3306'</code> <code>#数据库的端口</code>
<code>basedir=</code><code>'/var/www'</code> <code>#网站的根目录</code>
<code>localuser=</code><code>'apache'</code> <code>#网站的属主</code>
<code>localgroup=</code><code>'apache'</code> <code>#网站的属组</code>
4.3 工具的使用
4.3.1 获取帮助
<code>vsftpcli</code>
<code>Usage: </code><code>/usr/bin/vsftpcli</code> <code><add> <ftpname> <ftppasswd></code>
<code> </code><code>/usr/bin/vsftpcli</code> <code><remove> <ftpname></code>
<code> </code><code>/usr/bin/vsftpcli</code> <code><rename> <oldusername> <newusername></code>
<code> </code><code>/usr/bin/vsftpcli</code> <code><chpasswd> <ftpname> <ftppasswd></code>
<code> </code><code>/usr/bin/vsftpcli</code> <code><print></code>
4.3.2 增加用户
<code>vsftpcli add user1 123456</code>
<code>vsftpcli add user2 123456</code>
<code>vsftpcli add user3 123456</code>
4.3.3 打印用户
<code>vsftpcli print</code>
4.3.4 删除用户
<code>vsftpcli remove user2</code>
4.3.5 重命名用户
<code>vsftpcli rename user3 user2</code>
4.3.6 更改用户密码
<code>vsftpcli chpasswd user2 456789</code>
<code></code>
本文转自 tanzhenchao 51CTO博客,原文链接:http://blog.51cto.com/cmdschool/1905678,如需转载请自行联系原作者