Vsftpd 登录验证之 PAM_MYSQL 模式
Linux 2017-02-01 3095
本文主要讲解如何使用 pam_msyql 来配置 vsftpd 的验证登录,对于 Vsftpd 和 MySQL 的安装配置不做讲解,不过可以通过以下文章去学习:

▪ MySQL 的安装、配置请参考《Linux 之源码编译安装 MySQL 5.5
▪ Vsftpd 的安装、用户设置请参考《Linux 之源码编译安装 vsftpd

1. 安装 pam_mysql
  # cd /usr/local/src
  # wget http://www.lengdo.com/uploads/software/pam_mysql-0.7RC1.tar.gz
  # tar -zxvf pam_mysql-0.7RC1.tar.gz
  # cd pam_mysql-0.7RC1

  # ./configure --with-openssl --with-mysql=[MySQL安装目录]
  # make && make install

  安装成功后,检查 /lib/security 下是否存在pam_mysql.so,如果存在那么说明按照成功了
  如果你是 64 位的操作系统,需要将 /lib/security/pam_mysql.so 移动到 /lib64/security/pam_mysql.so

2. 创建 MySQL 数据库
  2.1 创建数据库
  mysql > CREATE DATABASE ftp

  2.2 创建 FTP 虚拟用户数据表
  mysql>CREATE TABLE `ftp_user` (
          `id` mediumint(8) UNSIGNED NOT NULL COMMENT '标识',
          `username` varchar(50) NOT NULL COMMENT 'FTP账号',
          `password` char(32) NOT NULL COMMENT 'FTP密码',
          `insert_time` int(10) UNSIGNED NOT NULL COMMENT '添加时间'
      ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='FTP用户表';

  2.3 创建 FTP 日志数据表
  mysql> CREATE TABLE `ftp_log` (
          `pid` int(10) UNSIGNED NOT NULL COMMENT '进程ID',
          `client` char(32) NOT NULL DEFAULT '' COMMENT '客户端IP',
          `server` char(32) NOT NULL DEFAULT '' COMMENT '服务器端IP',
          `content` varchar(255) NOT NULL DEFAULT '' COMMENT '日志内容',
          `username` varchar(50) NOT NULL COMMENT 'FTP账号',
          `insert_time` int(10) UNSIGNED NOT NULL COMMENT '添加时间'
      ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='FTP 日志表';

3. 配置 PAM 认证
  3.1 经典方式
    新建 /etc/pam.d/vsftpd.mysql(vsftpd.mysql 这个文件名是可以任意取的,只用在 vsftpd 的配置文件中指明即可)。在该文件中添加以下配置信息:
auth required pam_mysql.so user=root passwd=123456 host=127.0.0.1 db=ftp table=ftp_user usercolumn=username passwdcolumn=password crypt=3 sqllog=1 logtable=ftp_log logmsgcolumn=content logusercolumn=username logpidcolumn=pid loghostcolumn=server logrhostcolumn=client logtimecolumn=insert_time verbose=1
account required pam_mysql.so user=root passwd=123456 host=127.0.0.1 db=ftp table=ftp_user usercolumn=username passwdcolumn=password crypt=3 sqllog=1 logtable=ftp_log logmsgcolumn=content logusercolumn=username logpidcolumn=pid loghostcolumn=server logrhostcolumn=client logtimecolumn=insert_time verbose=1

  3.2 文件方式
    新建 /etc/pam.d/vsftpd.mysql(vsftpd.mysql 这个文件名是可以任意取的,只用在vsftpd的配置文件中指明即可)。在该文件中添加以下配置信息:
auth required pam_mysql.so config_file=/etc/security/pam_mysql.conf
account required pam_mysql.so config_file=/etc/security/pam_mysql.conf

    新建 /etc/security/pam_mysql.conf(根据个人配置,自行决定该文件的位置,编辑 pam_mysql 认证的配置信息
    注:pam_mysql源码中的 README 写得很清楚,这里我就只写出我的配置内容:
users.host=127.0.0.1
users.database=ftp
users.db_user=root
users.db_passwd=123456
users.table=ftp_user
users.user_column=username
users.password_column=password
users.password_crypt=3
verbose=1
log.enabled=1
log.table=log
log.message_column=content
log.pid_column=pid
log.user_column=username
log.host_column=server
log.rhost_column=client
log.time_column=insert_time

    注:host 使用 127.0.0.1 而不要使用 localhost
    使用 localhost, 那么 pam_mysql 将查找 MySQL 的 /var/lib/mysql/mysql.sock 文件连接数据库,而如果 mysql.sock不存在,那么将出错
    使用 127.0.0.1,那么 pam_mysql 将采用MySQL的 3306 端口进行连接数据库,不使用 socket 文件进行连接

4. 配置
  按照《Linux 之源码编译安装 vsftpd》的文章,vsftpd 的配置文件存储在 /usr/local/vsftpd/conf/vsftpd.conf
  编辑配置文件,将 pam_service_name=vsftpd 改为 pam_service_name=vsftpd.mysql,重启 vsftpd 即可


X. 其他错误
  1. FTP登录时出现错误:libgcc_s.so.1 must be installed for pthread_cancel to work
    64位CentOS,安装vsftpd version 3.0.2 版本,使用 pam_mysql.so 连接 MySQL 进行FTP用户认证。编译正常,但是FTP客户端连接服务器提示:
    libgcc_s.so.1 must be installed for pthread_cancel to work。

    解决:
    修改 vsftpd 的源码文件 defs.h 中,VSFTP_AS_LIMIT 的值 100UL * 1024 * 1024 改为 400UL * 1024 * 1024
    重新编译、部署,解决了这个问题。
    方案参考:http://askubuntu.com/questions/126625/libgcc-s-so-1-must-be-installed-for-pthread-cancel-to-work