vsftpd使用mysql进行虚拟用户认证
一、相关软件安装
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
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/vsftpd-pam-mysqld/4205.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.