上次介绍的vsftpd的配置是官方文档,这次是COPY来的,相对也是比较方便的,而且改动也很少。
只是需要libpam-mysql,mysql-dev等包。如果是基于ubuntu,那就实在是方便多了。都可以apt回来。。
OK,还是来原文吧,内容有点长,慢慢看就OK了:http://www.extmail.org/forum/thread-5427-1-1.html
   VSFTP+MySQL虚拟用户配置
   参考 
       [url]http://www.mysql-china.com/bbs/archiver/?tid-114.html[/url]
       [url]http://blog.chinaunix.net/u1/39544/showart_310591.html[/url]
    VSFTPD是一种在UNIX/Linux中非常安全且快速的FTP服务器,目前已经被许多大型站点所采用。VSFTPD支持将用户名和口令保存在数据库文件或数据库服务器中。VSFTPD称这种形式的用户为虚拟用户。相对于FTP的本地(系统)用户来说,虚拟用户只是FTP服务器的专有用户,虚拟用户只能访问FTP服务器所提供的资源,这大大增强系统本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取FTP服务器中的文件,增加了对用户和下载的可管理性。对于需要提供下载服务,但又不希望所有人都可以匿名下载;既需要对下载用户进行管理,又考虑到主机安全和管理方便的FTP站点来说,虚拟用户是一种极好的解决方案。
    环境:
       操作系统: centos 4
       流程图:   user --> vsftpd-2.0.1 --> pam_mysql-0.71 --> mysql-server-4.1
1,初始化centos升级服务器.
# vi /etc/yum.repos.d/CentOS-Base.repo
=============== 代码 { ================================================
[base]
name=CentOS-4 - Base
baseurl=http://mirror.be10.com/centos/4/os/i386/
gpgcheck=1
#released updates
[update]
name=CentOS-4 - Updates
baseurl=http://mirror.be10.com/centos/4/updates/i386/
gpgcheck=1
#packages used/produced in the build but not released
[addons]
name=CentOS-4 - Addons
baseurl=http://mirror.be10.com/centos/4/addons/i386/
gpgcheck=1
#additional packages that may be useful
[extras]
name=CentOS-4 - Extras
baseurl=http://mirror.be10.com/centos/4/extras/i386/
gpgcheck=1
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-4 - Plus
baseurl=http://mirror.be10.com/centos/4/centosplus/i386/
gpgcheck=1
enabled=0
#contrib - packages by Centos Users
[contrib]
name=CentOS-4 - Contrib
baseurl=http://mirror.be10.com/centos/4/contrib/i386/
gpgcheck=1
enabled=0
#packages in testing
[testing]
name=CentOS-4 - Testing
baseurl=http://mirror.be10.com/centos/4/testing/i386/
gpgcheck=1
enabled=0 
=============== 代码 } =================================================
# rpm -import [url]http://mirror.be10.com/centos/RPM-GPG-KEY-CentOS-4[/url]
2.安装所要软件包:
   # yum -y install mysql-server*
   # yum -y install vsftpd
   # yum -y install vim*
3.建立系统用户,用户ftp登录时访问目录权限.但用户不允许登录.
   # useradd vsftpdguest
   # vi /etc/passwd
============= 代码 { =====================================
vsftpdguest:x:501:501::/home/vsftpdguest:/bin/nologin
============= 代码 } =====================================
4.将虚拟用户保存在MySQL数据库服务器中 
      建立数据库vsftpdvu,表users,字段name和passwd用于保存虚拟用户的用户名和口令,增加两个虚拟用户q和ftp1。
# service mysqld start
    # mysql
mysql> create database vsftpdvu; 
mysql> use vsftpdvu; 
mysql> create table users(name char(16) binary,passwd char(16) binary); 
mysql> insert into users (name,passwd) values ('q','q'); 
mysql> insert into users (name,passwd) values ('ftp1','success8'); 
mysql> quit 
    
      授权vsftpdguest可以读vsftpdvu数据库的users表。执行以下命令: 
# mysql -u root mysql -p 
mysql> grant select on vsftpdvu.users to vsftpdguest@localhost identified by 'i52serial0'; 
mysql> quit;
       
       验证刚才的操作是否成功可以执行下面命令: 
# mysql -u vsftpdguest -pi52serial0 vsftpdvu 
mysql> select * from users;
5.设置MySQL的PAM验证(pam_mysql.so)
        利用mysql进行pam验证的开源项目([url]http://sourceforge.net/projects/[/url]),主要目的是生成 pam_mysql.so文件
# tar xvzf pam_mysql-0.5.tar.gz 
# cd pam_mysql 
# make 
# make install 
   make install这一步可能会出现错误,那只好手动将该目录下生成的pam_mysql.so复制到/lib/security目录下。 
   
       设置vsftpd的PAM验证文件。打开/etc/pam.d/vsftpd文件,修改内容: 
    # vi /etc/pam.d/vsftpd
    ======================== 代码 { ======================================
#%PAM-1.0
    #auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers onerr=succeed
    #auth       required    pam_stack.so service=system-auth
    #auth       required    pam_shells.so
    #account    required    pam_stack.so service=system-auth
    #session    required    pam_stack.so service=system-auth
    auth required pam_mysql.so user=vsftpdguest passwd=i52serial0 host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=0
account required pam_mysql.so user=vsftpdguest passwd=i52serial0 host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=0 
    ======================== 代码 { ======================================  
      上面涉及到的参数,只要对应前面数据库的设置就可以明白它们的含义。这里需要说明的是crypt参数。crypt表示口令字段中口令的加密方式:crypt=0,口令以明文方式(不加密)保存在数据库中;crypt=1,口令使用UNIX系统的DES加密方式加密后保存在数据库中;crypt=2,口令经过MySQL的password()函数加密后保存,但是使用了crypt=2时会出错,可能是pam_mysql.so文件问题. 
6.设置vsftpd 登录模式:
    # vi /etc/vsftpd/vsftpd.conf
    ======================= 代码 { ==============================
    local_enable=yes   <--本地用户登录权限,要开启
    pam_service_name=vsftpd  <--验证文件/etc/pam.d/目录下
    anonymous_enable=NO   <--取消匿名登录
    guest_enable=YES      <--除了匿名用户外的所有用户都是guest
    guest_username=vsftpdguest  <--初了匿名用户外的所有用户使用vsftpdguest
    ======================= 代码 } ==============================
7.重启mysql、vsftpd数据库,进行测试:
    # service mysqld restart
    # service vsftpd restart
8.进一步的虚拟用户设置 
      首先,介绍虚拟用户的权限设置。 
       新添了virtual_use_local_privs参数,当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限,这两者种做法相比,后者更加严格一些,特别是在有写访问的情形下。默认情况下此参数是关闭的(NO)。 
      当virtual_use_local_privs=YES时,只需设置write_enable=YES,虚拟用户就可以就拥有写权限。
         当virtual_use_local_privs=NO时,对虚拟用户权限的设置就更多一些更严格一些。 
         控制虚拟用户浏览目录:如果让用户不能浏览目录,但仍可以对文件操作,那么需要执行以下二个步骤:
             第一步骤:配置文件中:
                       anon_world_readable_only=YES 
             允许虚拟用户上传文件:  write_enable=YES
                                    anon_upload_enable=YES 
             允许虚拟用户修改文件名和删除文件:    anon_other_write_enable=YES 
             第二步骤:虚拟用户目录的权限改为只能由vsftpdguest操作: 
                # chown vsftpdguest.vsftpdguest /home/vsftpdguest 
                # chmod 700 /home/vsftpdguest 
         由于以上选项的设置同样会对匿名用户生效。如果不想匿名用户趁机拥有同样的权限,最好是禁止匿名用户登录。 
    其次,由于虚拟用户在系统中是vsftpdguest身份,所以可以访问到系统的其他目录。为了更加安全,我们可以将虚拟用户限制在自家目录下。有两种做法:
          第一种做法:在配置文件中修改
                   chroot_local_user=YES。 
            第二种做法:在配置文件中增加以下选项 
               chroot_local_user=NO 
               chroot_list_enable=YES 
              chroot_list_file=/etc/vsftpd.chroot_list 
              然后,在/etc/vsftpd.chroot_list文件中加入虚拟用户名q和ftp1。 
        经过修改后,虚拟用户登录后其根目录就限制在/home/vsftpdguest下,无法访问其他目录。 
9.虚拟用户个人目录(没有测试)
  登录后所在的目录都是/home/vsftpdguest,即都是guest_username用户的自家目录。为每个虚拟用户建立自家目录。
      首先,在主配置文件中加入以下选项:
           # vi /etc/vsftpd/vsftpd.conf 
                 user_config_dir=/etc/vsftpd/vsftpd_user_conf 
  然后,生成/etc/vsftpd/vsftpd_user_conf目录,并在该目录下建立与特定虚拟用户同名的文件: 
       # mkdir /etc/vsftpd/vsftpd_user_conf 
       # cd /etc/vsftpd/vsftpd_user_conf 
       # touch q 
       以上操作为虚拟用户q建立了个人配置文件/etc/vsftpd/vsftpd_user_conf/q.
      接下来,在q的个人配置文件中将 q虚拟用户的自家目录修改为/home/q,配置选项为: 
       local_root=/home/q
  最后,新建q目录,并将权限设为vsftpdguest: 
      # mkdir /home/q 
      # chown vsftpdguest.vsftpdguest /home/q 
      # chmod 600 /home/q 
    经过以上设置,q登录VSFTPD后,用“pwd”指令就可以发现被自己被定位到自己的“/home/q”目录。 
   从文件系统层次来看,由于“/home/q”目录的权限是属于vsftpdguest的,所以其他的虚拟用户同样也可以访问q的自家目录。
   解决这个问题也很简单,只需要让VSFTPD负责将虚拟用户限制在其自家目录,就可以避免虚拟用户的互相访问。具体做法参照前面第8步中所述。经过以上设置后,虚拟用户就可以拥有属于自己的目录了。
   使用user_config_dir参数,在每个用户独立的配置文件里设定不同的权限和local_root参数就可以了
帮助:
在第5步处可以对程序进行调整:
  # vi /etc/vsftpd/vsftpd.conf  查看ftp连接情况
     log_ftp_protocol=YES
     dual_log_enable=YES
     syslog_enable=YES   
  # vi /etc/pam.d/vsftpd 调试pam_mysql连接情况
     auth   required      /usr/local/lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2 verbose=1
     account  required    /usr/local/lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2 verbose=1
---------
最后,你在上传的时候会发现,文件权限都是600,看vsftpd.conf里,有一个local_umask,上面还有注释,如果要改改成022,大多数Ftpd都是这么配置的。
关于umask为什么是022,可以查看老王的文章:Umask补习班
里面有这么一句:注:权限计算实际上是二进制位的与操作,参考All About the umask and Permissions。

