一、相关软件安装

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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐