vsftpd使用mysql进行虚拟用户认证

2013年7月25日 发表评论 阅读评论

一、相关软件安装

1、vsftp、mysql服务的安装

[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 站点下载源码进行安装,安装步骤如下

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

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

二、创建表及mysql用户

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

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

创建vsftpd使用的用户表

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

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

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

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

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

vsftpd.conf文件配置如下 :

# 拒绝 ANONYMOUS 用户
anonymous_enable=NO
# 允许拥有写入权限(0755)的本地用户
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
# 如果你想记录 vsftpd 的动静,请除去 log_ftp_protocol 的注释
# log_ftp_protocol=YES
connect_from_port_20=YES
# 如果你没有采用以上的 log_ftp_protocol 行,请除去 xferlog_file 及
# xferlog_std_format 的注释 —— 它们是互相排除的
# 当 xferlog_enable=YES 及 xferlog_std_format=YES 时所采用的文件名称
# 警告 —— 更改这个文件名影响 /etc/logrotate.d/vsftpd.log
#xferlog_file=/var/log/xferlog
#
# xferlog_std_format 切换记录是放进 vsftpd_log_file 还是 xferlog_file 文件内。
# NO 写入 vsftpd_log_file,YES 写入 xferlog_file
# xferlog_std_format=YES
#
# 你可以更改工作阶段闲置时限的缺省值(以秒计算)。
#idle_session_timeout=600
#
# 你可以更改连接时限的缺省值(以秒计算)。
#data_connection_timeout=120
#
# 请为指定一个在系统上是完全被隔离、没有特权、及可供 ftp 服务器使用的用户。
nopriv_user=vsftpd
chroot_local_user=YES
listen=YES
# 在这里我们采用 vsftpd 的凭证模块来检查用户名称及口令
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# 在这里 vsftpd 会允许 vsftpd 这个用户登录 /home/vsftpd/$USER 这个目录
guest_enable=YES
guest_username=vsftpd
local_root=/home/vsftpd/$USER
user_sub_token=$USER
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf 

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

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

四、pam 文件配置

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

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

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

#%PAM-1.0
 session       optional        pam_keyinit.so       force revoke
 auth required pam_mysql.so user=vsftpd passwd=vsftpdpassword  host=localhost db=vsftpd table=accounts usercolumn=username   passwdcolumn=pass crypt=3
 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 文件,其中有以下内容:

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

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

#%PAM-1.0
session         optional        pam_keyinit.so    force revoke
#第一步认证首先使用数据库认证,如果通过不再检查下面其它认证,直接登陆,通不过就使用下面的认证
auth            sufficient      /usr/lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdpasswdcolumn=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      /usr/lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdpasswdcolumn=passwd crypt=2
account         include         password-auth
session         required        pam_loginuid.so
session         include         password-auth 

五、创建ftp用户

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

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

查询验证如下:

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

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

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

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

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

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

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

# connect_from_port_20=YES
connect_from_port_20=NO 




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.