用vsftpd和mysql创建一个虚拟用户ftp服务器

运维 系统运维
当前有这样的一个需求,我需要批量创建一个网站,比如我要创建一个foo.com的网站,我就会在/web/目录下创建一个foo.com的目录,WEB服务器(我这里用的是nginx)已经自动设置好解析。同时,我需要有一个对应的ftp账号来管理这个网站,用vsftpd做FTP服务器,用MySQL做后端数据库,两者通过pam-mysql插件联系起来。

当前有这样的一个需求,我需要批量创建一个网站,比如我要创建一个foo.com的网站,我就会在/web/目录下创建一个foo.com的目录,WEB服务器(我这里用的是nginx)已经自动设置好解析。同时,我需要有一个对应的ftp账号来管理这个网站,但是我不希望使用系统账号,一来网站多了,系统账号必然多,而来我不希望管理网站的账号能通过ssh登陆,虽然ssh也可以配置哪些账号不允许登陆。但是不创建系统账号显然是最安全的做法。

于是这就是有了标题的做法,用vsftpd做FTP服务器,用MySQL做后端数据库,两者通过pam-mysql插件联系起来。配置步骤简述如下:

  1. 我的系统是CentOS 6.2,因此现用yum工具安装好所需要的软件,包括mysql-server,vsftpd,pam-mysql等。
  2. 编辑/etc/vsftpd/vsftpd.conf文件,增加或者修改如下几项:
  1. anonymous_enable=NO 
  2. virtual_use_local_privs=YES 
  3. guest_enable=YES 
  4. user_sub_token=$USER  
  5. local_root=/web/$USER  
  6. chroot_local_user=YES 
  7. hide_ids=YES 
  8. guest_username=nginx 

guest_username 表示当用户登陆成功后,其uid映射到系统哪个账号上,我这里为了和WEB管理相结合,因此用了nginx这个账号。

3.创建数据库表,我们创建一个名为vsftpd的数据库,在其下创建一个users表,同时授权给vsftpd账号登陆,创建过程类似如下:

  1. mysql> create database vsftpd;  
  2. Query OK, 1 row affected (0.00 sec)  
  3.         
  4. mysql> use vsftpd  
  5. Database changed  
  6. mysql> create table users(username varchar(30) not null primary key,password varchar(41) not null);  
  7. Query OK, 0 rows affected (0.04 sec)  
  8. mysql> grant usage  on vsftpd.users to vsftpd@localhost identified by 'abc123';  
  9. Query OK, 0 rows affected (0.00 sec)  
  10. mysql> insert into users values('foo.com',password('test'));  
  11. Query OK, 1 row affected (0.00 sec)  
  12.         
  13. mysql> select * from users;  
  14. +----------+-------------------------------------------+  
  15.       | username | password                                  |  
  16. +----------+-------------------------------------------+  
  17.       | foo.com  | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 |  
  18. +----------+-------------------------------------------+  
  19.       1 row in set (0.00 s 

我这里对密码使用password加密函数,因为要和WEB结合,因为username使用了和域名相同的名字,这样我就可以通过username来同时获知域名,从而将账号的主目录锁定在对应的域名目录下。

编辑/etc/pam.d/vsftpd文件,***类似如下:

  1. auth required pam_mysql.so user=vsftpd passwd=abc123 host=localhost db=ftpd table=users usercolumn=username passwdcolumn=password crypt=2 
  2. account required pam_mysql.so user=vsftpd passwd=abc123 host=localhost db=ftpd table=users usercolumn=username passwdcolumn=password crypt=2 

user和passwd指的是连接MySQL的账号和密码,crypt指的加密方式,0表示明文;不加密;1表示用crypt方式加密;2表示用MySQL的password函数加密;3表示用md5加密;4表示用sha1加密。

创建对应的目录 当用foo.com登陆,且验证通过后,根据之前vsftpd的配置,它将以nginx的身份把/web/foo.com作为其主目录,因此要保证其目录存在,而且其身份有访问权限。

测试,直接可以在本地测试,看看能否登陆,如果不能登陆,/var/log/secure里又看不到更多的信息,那你可以选择在/etc/pam.d/vsftpd的配置文件里加上verbose模式,也就是在user=vsftpd那里加上一个verbose=1的选项,这样它就会把详细的信息打印到/var/log/secure文件里。看看是哪里的报错。
其实,上述只是一个最简单的配置,pam-mysql还可以让你配置得更复杂,比如记录登录日志,根据特定条件查询过滤用户信息等,pam-mysql软件包自带的README有详细的说明,大家可以按照那个说明来配置一个符合你需求的灵活的认证方式。

责任编辑:黄丹 来源: 博客
相关推荐

2011-03-04 10:03:44

VSFTPD虚拟服务器

2011-02-23 15:32:39

vsftpd

2011-02-23 09:01:37

2010-08-25 16:28:04

2011-02-23 13:52:07

vsftpd

2011-03-02 16:49:53

Pureftpdmysql

2010-05-18 14:34:41

IIS服务器

2014-04-14 15:54:00

print()Web服务器

2011-02-25 16:14:09

proftpdftp

2010-05-20 12:57:38

2018-06-15 10:25:43

Python HTTPFTP服务器

2018-12-06 09:23:33

2010-02-23 14:35:48

CentOS vsft

2011-03-04 10:05:10

Vsftpd虚拟用户

2011-02-22 14:19:28

vsFTPd启动关闭

2011-02-24 09:57:40

vsFTPd启动关闭

2019-02-26 16:20:52

FTP服务器

2015-08-25 14:34:20

LinuxvsftpdFTP

2011-03-04 10:00:56

Vsftpd配置服务器

2023-03-30 13:22:45

nginxweb服务器
点赞
收藏

51CTO技术栈公众号