天天看点

vsftp通过pam集成mysql身份验证

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>&amp;&amp; </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>&lt;add&gt; &lt;ftpname&gt; &lt;ftppasswd&gt;</code>

<code>       </code><code>/usr/bin/vsftpcli</code> <code>&lt;remove&gt; &lt;ftpname&gt;</code>

<code>       </code><code>/usr/bin/vsftpcli</code> <code>&lt;rename&gt; &lt;oldusername&gt; &lt;newusername&gt;</code>

<code>       </code><code>/usr/bin/vsftpcli</code> <code>&lt;chpasswd&gt; &lt;ftpname&gt; &lt;ftppasswd&gt;</code>

<code>       </code><code>/usr/bin/vsftpcli</code> <code>&lt;print&gt;</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,如需转载请自行联系原作者