一、相关软件安装
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