一、相关软件安装

1、vsftp、mysql服务的安装

1[root@localhost ~]#yum install vsftpd mysql-server mysql-devel pam-devel -y

2、pam_mysql模块的安装

默认centos的yum源里有一个mod_auth_mysql包,该包和本文讲到的pam_mysql不是同一个包,前者是apache下进行http下的mysql认证使用的包。后者pam_mysql 包的安装方式有两种:一种是通过sourceforge 站点下载源码进行安装,安装步骤如下

1[root@localhost ~]# tar -xf pam_mysql-0.7RC1.tar.gz -C /usr/src/
2[root@localhost ~]# cd /usr/src/pam_mysql-0.7RC1
3[root@localhost pam_mysql-0.7RC1]# ./configure --with-mysql=/usr/bin/mysql_config
4[root@localhost pam_mysql-0.7RC1]# make && make install

另一种是通过使有epel 源或者直接从源里下载rpm包安装 。如果配有该源,可以使用yum -y install pam_mysql 指令进行安装 。

二、创建表及mysql用户

出于安全的考虑,这里创建了一个名为vsftpd,密码为vsftpdpassword的mysql用户,避免直接使用mysql 的root用户,当有多个库时,便于进行权限控制 。

1mysql> CREATE DATABASE vsftpd;
2mysql> GRANT SELECT ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY  'vsftpdpassword';
3mysql> FLUSH PRIVILEGES; 

创建vsftpd使用的用户表

1mysql> USE vsftpd;
2mysql> CREATE TABLE `accounts` (
3 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
4 `username` VARCHAR( 30 ) NOT NULL ,
5 `pass` VARCHAR( 50 ) NOT NULL ,
6 UNIQUE (`username`)
7 ) ENGINE = MYISAM ;

注意pass字段的字符长度,后面也会提到,太短的话使用md5、sha1进行认证时不足以存储,这也是很多人只能成功使用明文认证,而无法使用md5、sha1加密认证的原因。UNIQUE 字段为避免有重名用户的出现。后面的引擎类型也可以选择INNODB。

三、创建物理用户及vsftpd配置文件

虚拟用户对应的都有一个物理用户,出于安全考虑,该用户一般不具备进行shell 登录的权限。具体如下:

1# useradd -G users -s /bin/false -d /home/vsftpd  vsftpd
2# cp -v /etc/vsftpd/vsftpd.conf   /etc/vsftpd/vsftpd.conf-orig
3# > /etc/vsftpd/vsftpd.conf
4# vi /etc/vsftpd/vsftpd.conf

vsftpd.conf文件配置如下 :

 1# 拒绝 ANONYMOUS 用户
 2anonymous_enable=NO
 3# 允许拥有写入权限(0755)的本地用户
 4local_enable=YES
 5write_enable=YES
 6local_umask=022
 7dirmessage_enable=YES
 8xferlog_enable=YES
 9# 如果你想记录 vsftpd 的动静,请除去 log_ftp_protocol 的注释
10# log_ftp_protocol=YES
11connect_from_port_20=YES
12# 如果你没有采用以上的 log_ftp_protocol 行,请除去 xferlog_file 及
13# xferlog_std_format 的注释 —— 它们是互相排除的
14# 当 xferlog_enable=YES 及 xferlog_std_format=YES 时所采用的文件名称
15# 警告 —— 更改这个文件名影响 /etc/logrotate.d/vsftpd.log
16#xferlog_file=/var/log/xferlog
17#
18# xferlog_std_format 切换记录是放进 vsftpd_log_file 还是 xferlog_file 文件内。
19# NO 写入 vsftpd_log_file,YES 写入 xferlog_file
20# xferlog_std_format=YES
21#
22# 你可以更改工作阶段闲置时限的缺省值(以秒计算)。
23#idle_session_timeout=600
24#
25# 你可以更改连接时限的缺省值(以秒计算)。
26#data_connection_timeout=120
27#
28# 请为指定一个在系统上是完全被隔离、没有特权、及可供 ftp 服务器使用的用户。
29nopriv_user=vsftpd
30chroot_local_user=YES
31listen=YES
32# 在这里我们采用 vsftpd 的凭证模块来检查用户名称及口令
33pam_service_name=vsftpd
34userlist_enable=YES
35tcp_wrappers=YES
36# 在这里 vsftpd 会允许 vsftpd 这个用户登录 /home/vsftpd/$USER 这个目录
37guest_enable=YES
38guest_username=vsftpd
39local_root=/home/vsftpd/$USER
40user_sub_token=$USER
41virtual_use_local_privs=YES
42user_config_dir=/etc/vsftpd/vsftpd_user_conf

当然使用user_config_dir 也可以为每个用户进行定制化的设置,这里以361way用户为例:

1# mkdir /etc/vsftpd/vsftpd_user_conf
2# vi /etc/vsftpd/vsftpd_user_conf/361way
3并将设置放在其中:
4dirlist_enable=YES
5download_enable=YES
6# 361way 可访问的完整目录路径,请按你所需作出修改
7local_root=/home/users/361way
8write_enable=YES

四、pam 文件配置

vsftpd 的 PAM 设置放置在 /etc/pam.d/vsftpd。请照以下方法将它备份并如下创建一个新文件:

1# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd-orig
2# cat /dev/null > /etc/pam.d/vsftpd
3# vi /etc/pam.d/vsftpd

需要注意的是ftp的pam配置文件要与vsftpd.conf里的pam_service_name项后面指定的值一致,如指定的vsftp_mysql,对应的pam文件名是/etc/pam.d/vsftp_mysql 。pam文件内容如下:

1#%PAM-1.0
2 session       optional        pam_keyinit.so       force revoke
3 auth required pam_mysql.so user=vsftpd passwd=vsftpdpassword  host=localhost db=vsftpd table=accounts usercolumn=username   passwdcolumn=pass crypt=3
4 account required pam_mysql.so user=vsftpd passwd=vsftpdpassword  host=localhost db=vsftpd table=accounts usercolumn=username  passwdcolumn=pass crypt=3

crypt 指定了加密类型,这里使用的3 ,即为md5认证。有关crypt 部分,如果使用的epel 里的rpm包安装的话,可以查看/usr/share/doc/pam_mysql-0.7/README 文件,其中有以下内容:

 1crypt (plain)
 2    The method to encrypt the user's password:
 3       0 (or "plain") = No encryption.  Passwords stored in plaintext.
 4                        HIGHLY DISCOURAGED.
 5       1 (or "Y")     = Use crypt(3) function.
 6       2 (or "mysql") = Use MySQL PASSWORD() function. It is possible
 7                        that the encryption function used by PAM-MySQL
 8                        is different from that of the MySQL server, as
 9                        PAM-MySQL uses the function defined in MySQL's
10                        C-client API instead of using PASSWORD() SQL function
11                        in the query.
12       3 (or "md5")   = Use plain hex MD5.
13       4 (or "sha1")  = Use plain hex SHA1.

需要注意的是,以上pam配置仅支持mysql 认证,在特别情况下有需要既可以使用mysql数据库中的用户认证,也可以使用系统用户认证。该情况下可以使用如下配置:

 1#%PAM-1.0
 2session         optional        pam_keyinit.so    force revoke
 3#第一步认证首先使用数据库认证,如果通过不再检查下面其它认证,直接登陆,通不过就使用下面的认证
 4auth            sufficient      /usr/lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdpasswdcolumn=passwd crypt=2
 5#数据库认证通不过,就采用vsftp默认的其余认证方法
 6auth            required        pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
 7auth            required        pam_shells.so
 8auth            include         password-auth
 9#授权和认证也是一样的
10account         sufficient      /usr/lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdpasswdcolumn=passwd crypt=2
11account         include         password-auth
12session         required        pam_loginuid.so
13session         include         password-auth

五、创建ftp用户

这里创建 361way 这个虚拟用户,并设置 secret 这个口令(它会被 MySQL 的 MD5 函式来加密然后存储):

1mysql> USE vsftpd;
2mysql> INSERT INTO accounts (username, pass) VALUES('361way', md5('secret'));

查询验证如下:

1mysql> select * from accounts;
2 +----+-----------+----------------------------------+
3 | id | username  | pass                             |
4 +----+-----------+----------------------------------+
5 |  1 | 361way    | 5ebe2294ecd0e0f08eab7690d2a6ee69 |
6 +----+-----------+----------------------------------+
7 1 rows in set (0.00 sec)
8mysql> exit;

上面的pass值可以与以下SQL语句执行的md5加密后的值进行比对,如果比下面的少了一部分,很可能是创建表时,指定的pass 字段的长度过小:

1SELECT ENCRYPT('secret'), PASSWORD('secret'), MD5('secret');

需要指出的是,如果/home/vsftpd/361way用户如果不存在,还需进行创建并赋权:

1# mkdir /home/vsftpd/user1
2# chown vsftpd:users /home/vsftpd/user1

完成后,通过/sbin/service vsftpd restart执行重启vsftpd服务并生效,然后可以通过ftp 127.0.0.1进行验证。

注:上面引述的配置文件同时用 21 及 20 号 FTP 端口(作操控及数据连接);有些网络设置(早期 Windows 有关静态 FTP 的 互联网选项;某些 NAT 的设计;某些代理服务器)不能通过第二个端口。若是如此,配置文件便须要有以下修订,而 FTP 服务器须要重新引导:

1# connect_from_port_20=YES
2connect_from_port_20=NO