上次介绍的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。