本文参考了vsftpd安装文档,vsftpd的EXAMPLE及网上众多网友的文章。 在REDhat9+vsftpd1.1.3+mysql3.2上测试通过。 本文不适用于使用mysql4的用户。 请注意:不要直接copy我这里的配置文件,可以造成ftp启动不正常,所以还是多费点事,自己输入吧 本文对本地用户、虚拟用户目录进行了限制,每个用户拥有自己独立的目录。 本文中所使用的参数具体意义请参数回贴。 配置不外就是修改vsftpc.conf,并指定用户目录,权限等。 对虚拟用户则用pam验证方式。 另:mkdir建立目录,chown更改权限。vi编辑文件。这些命令请参考man文档 vsftpd类别: 1、PORT FTP 首先会建立控制频道,默认值是port 21,也就是跟port 21 建立联机,并透过此联机下达指令。 第二,由FTP server 端会建立数据传输频道,默认值为20,也就是跟port 20 建立联机,并透过port 20 作数 据的传输。 2、PASVFTP 首先会建立控制频道,默认值是port 21,也就是跟port 21 联机,并透过此联机下达指令。 第二,会由client 端做出数据传输的请求,包括数据传输port 的数字。 3、差别: PORT FTP 当中的数据传输port 是由FTP server 指定, 而PASV FTP 的数据传输port 是由FTP client 决定。 通常我们使用PASV FTP,是在有防火墙的环境之下,透过client 与server 的沟通,决定数据传输的port。 vsftpd安装篇: 1、rpm安装: 代码: [root@Linux_win vsftpd]#rpm -ivh vsftpd-1.1.3-8.i386.rpm 2、tar.gz的安装 解压后查看README和INSTALL文档 安装前的条件: 进入vsftpd目录 编辑 "builddefs.h"文件,里面定义了pam功能,tcp_wrappers功能,ssl功能,根据需要定义pam或tcpwrapper功能,以消ssl功能 然后键入 "make" .将编译出相应的二进制文件,你可以用以下命令查看 [chris@localhost vsftpd]$ ls -l vsftpd -rwxrwxr-x 1 root root 61748 Sep 27 00:26 vsftpd a、增加“nobody”用户。在系统中添加此用户,如果用户已经存在,useradd命令有相应提示。 代码: [root@Linux_win vsftpd]# useradd nobody useradd: user nobody exists b、建立“/usr/share/empty”目录。在系统中此目录,如果目录已经存在,mkdir命令有相应提示。 代码: [root@hpe45 root]# mkdir /usr/share/empty/ mkdir: cannot create directory '/usr/share/empty': File exists c、匿名服务帐号:“ftp”用户和一个有效的匿名目录(默认为/var/ftp)。 代码: [root@Linux_win vsftpd]# mkdir /var/ftp/ [root@Linux_win vsftpd]# useradd -d /var/ftp ftp d、更改目录的所有者为root,并让ftp用户对自己的主目录不可写 代码: [root@Linux_win vsftpd]# chown root.root /var/ftp [root@Linux_win vsftpd]# chmod og-w /var/ftp 编译VSFTPD 代码: [root@Linux_win vsftpd]# tar zxvf vsftpd-1.2.0.tar.gz [root@Linux_win vsftpd]# cd vsftpd-1.2.0 [root@Linux_win vsftpd]# make 安装编译好的VSFTPD 执行“make,make install”将编译好的二进制文件、手册等复制到相应目录。可能需要手动执行以下复制: 代码: [root@Linux_win vsftpd]# cp vsftpd /usr/local/sbin/vsftpd [root@Linux_win vsftpd]# cp vsftpd.conf.5 /usr/local/share/man/man5 [root@Linux_win vsftpd]# cp vsftpd.8 /usr/local/share/man/man8 如果不存在man5和man8目录,要先建立这两个目录 代码: [root@Linux_win vsftpd]#mkdir /usr/local/share/man/man5 [root@Linux_win vsftpd]#mkdir /usr/local/share/man/man8 make不会自己copy配置文件,如果make install有错,则必须手工更改 [root@hpe45 vsftpd-1.2.0]# cp vsftpd.conf /etc 为本地用户设置PAM 如果允许本地用户登录VSFTPD,执行以下操作: 代码: [root@Linux_win vsftpd]# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd 3、pam_mysql安装 如果使用mysql的二进制包,那么必须加个开始包,且要修改Makefile文件,指定mysql的lib位置。 代码: [root@Linux_win vsftpd]# tar xvzf pam_mysql-0.5.tar.gz [root@Linux_win vsftpd]# cd pam_mysql [root@Linux_win vsftpd]# make [root@Linux_win vsftpd]# cp pam_mysql.so /bli/security 4、mysql安装。请查看其它文档 vsftpd启动篇 vsftpd 有两种运行方式,一种是standalone 一种是 via an inetd (或者 inetd or xinetd). 1、如何启动 1)系统自带的 代码: [root@Linux_win software]# service vsftpd restart 2)源包安装: [root@Linux_win software]# /安装路径/vsftpd & 代码: [root@Linux_win vsftpd]# /sbin/service xinetd restart 或 [root@Linux_win vsftpd]# /usr/local/sbin/vsftpd & 2、standlone启动 具体的运行方式由参数listen决定。当listen参数值为YES时,VSFTPD单独运行,我们可以使用脚本/etc/rc.d/init.d/vsftpd来启动、关闭以及重启VSFTPD。命令如下: 代码: /etc/rc.d/init.d/vsftpd start|stop|restart 3、xinetd启动,首先要将vsftpd.conf配置文件中的listen参数值改为NO。 其次,生成一个/etc/xinetd.d/vsftpd文件 代码: [root@Linux_win vsftpd]#vi /etc/vsftpd/vsftpd.conf或vi /etc/vsftp.conf listen=NO 代码: [root@Linux_win vsftpd]vi /etc/xinetd.d/vsftpd 内容如下: service vsftpd { disable = no socket_type = stream wait = no user = root server = /usr/sbin/vsftpd port = 21 log_on_suclearcase/" target="_blank" >ccess += PID HOST DURATION log_on_failure += HOST } 通过修改disable值为no或yes,并重新启动xinetd,从而启动或停止VSFTPD。 配置安全匿名服务器 所要做的就是用vi修改vsftpd.conf文件 代码: [root@Linux_win vsftpd]#vi /etc/vsftpd.conf或/etc/vsftpd/vsftpd.conf 修改后的vsftpd.conf文件看附件: 引用: #使用单独模式,并指定监听的IP地址 listen_address=ip address #只允许匿名访问,不允许本地用户访问 anonymous_enable=YES local_enable=NO #取消写权限 write_enable=NO anon_upload_enable=NO anon_mkdir_write_enable=NO anon_other_write_enable=NO #启用详细的日志记录格式,设定记录传输日志的文件名。默认值为/var/log/vsftpd.log。 xferlog_enable=YES xferlog_file=/var/log/vsftp.log #对连接进行控制,还有超时时间,那就根据具体情况再说了。 connect_from_port_20=YES pasv_min_port=50000 pasv_max_port=60000 #控制FTP最大并发数,限定每个IP地址的并发数。 max_clients=numerical value max_per_ip=numerical value #限定下载速度 anon_max_rate=80000 #使用ftpd_banner取代VSFTPD默认的欢迎词,免得泄漏相关信息 ftpd_banner=Welcome to this FTP Server #只让匿名用户浏览可阅读的文件,不可以浏览整个系统 anon_world_readable_only=YES #隐藏文件的所有者和组信息,匿名用户看到的文件的所有者和组全变为ftp hide_ids=YES 代码: 附:vsftpd.conf [root@Linux_win vsftpd]# cat vsftpd.conf listen=YES listen_address=192.168.1.2 anonymous_enable=YES local_enable=NO write_enable=NO anon_root=/home anon_upload_enable=NO anon_other_write_enable=NO anon_mkdir_write_enable=NO anon_world_readable_only=YES #dirmessage_enable=YES ftpd_banner=welcome to this FTP server xferlog_enable=YES #xferlog_file=/var/log/vsftpd.log connect_from_port_20=YES #pasv_mix_port=50000 #pasv_max_port=60000 #xferlog_std_format=YES max_clients=10 max_per_ip=10 hide_ids=YES #chroot_list_enable=YES #chroot_list_file=/etc/vsftpd/chroot_list #chroot_local_user=NO #pam_service_name=/etc/pam.d/vsftpd #guest_enable=YES #guest_username=vsftpdvirtual #virtual_use_local_privs=NO #user_config_dir=/etc/vsftpd/vsftpd_user_conf 配置可上传匿名服务器 [root@Linux_win vsftpd]#vi /etc/vsftpd/vsftpd.conf 修改文件,改后如下 代码: [root@Linux_win ftp]# cat /etc/vsftpd/vsftpd.conf listen=YES listen_address=192.168.1.2 anonymous_enable=YES local_enable=NO write_enable=YES #anon_root= anon_upload_enable=YES anon_other_write_enable=YES anon_mkdir_write_enable=YES #anon_world_readable_only=YES #dirmessage_enable=YES ftpd_banner=welcome to this FTP server xferlog_enable=YES #xferlog_file=/var/log/vsftpd.log connect_from_port_20=YES #pasv_mix_port=50000 #pasv_max_port=60000 #xferlog_std_format=YES max_clients=10 max_per_ip=10 hide_ids=YES #chroot_list_enable=YES #chroot_list_file=/etc/vsftpd/chroot_list #chroot_local_user=NO #pam_service_name=/etc/pam.d/vsftpd #guest_enable=YES #guest_username=vsftpdvirtual #virtual_use_local_privs=NO #user_config_dir=/etc/vsftpd/vsftpd_user_conf 代码: [root@Linux_win ftp]# mkidr /var/ftp/upload [root@Linux_win ftp]# chmod o+w /var/ftp/upload anon_root参数指定的目录或默认的/var/ftp主目录,ftp匿名用户不可有写权限,否则会出错。 办法是在/var/ftp下建立一个新目录,使得该目录对ftp匿名用户可写。才能上传。 或不用匿名上传,而使用本地用户或虚拟用户 。 配置本地用户 修改vsftpd.conf 代码: [root@Linux_win vsftpd]# cat /etc/vsftpd/vsftpd.conf listen=YES listen_address=192.168.1.2 anonymous_enable=NO local_enable=YES #local_root= write_enable=YES #anon_root= #anon_upload_enable=YES #anon_other_write_enable=YES #anon_mkdir_write_enable=YES #anon_world_readable_only=YES #anon_umask=777 #dirmessage_enable=YES ftpd_banner=welcome to this FTP server xferlog_enable=YES #xferlog_file=/var/log/vsftpd.log connect_from_port_20=YES #pasv_mix_port=50000 #pasv_max_port=60000 #xferlog_std_format=YES max_clients=10 max_per_ip=10 hide_ids=YES #limit all users in it's owner dir #chroot_local_user=YES #or limit some chroot_local_user=NO chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list #use ownwer conf file user_config_dir=/etc/vsftpd/vsftpd_user_conf pam_service_name=/etc/pam.d/vsftpd #guest_enable=YES #guest_username=vsftpdvirtual #virtual_use_local_privs=NO 由于上面了用户列表,因此须建立chroot_list文件, 代码: [root@Linux_win vsftpd]# touch /etc/vsftpd/chroot_list 并加入以下内容,查看chroot_list文件内容,结果如下 代码: [root@Linux_win vsftpd]# cat /etc/vsftpd/chroot_list sam gem 配置文件中指定了用户配置文件,因此建立此文件 代码: [root@Linux_win vsftpd]# mkdir /etc/vsftpd/vsftpd_user_conf 并根据用户名建立文件 代码: [root@Linux_win vsftpd]# touch sam [root@Linux_win vsftpd]# touch gem [root@Linux_win vsftpd]# ls -l /etc/vsftpd/vsftpd_user_conf 总用量 8 -rw-r--r-- 1 root root 21 1月 8 00:25 sam -rw-r--r-- 1 root root 25 1月 8 00:17 gem 并在sam,gem文件加加入以下内容,可用vi编辑并保存,下面的虚拟用户也一样,不过只须更改文件内容就可以了 代码: [root@Linux_win vsftpd]# cat /etc/vsftpd/vsftpd_user_conf/sam local_root=/home/sam 代码: [root@Linux_win vsftpd]# cat /etc/vsftpd/vsftpd_user_conf/gem local_root=/home/gem 本地用户验证要用pam文件,内容是默认的。 代码: [root@Linux_win vsftpd]# cat /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 配置虚拟用户(mysql) VSFTPD的本地用户本身是系统的用户,除了可以登录FTP服务器外,还可以登录系统使用其他系统资源,而 VSFTPD的虚拟用户则是FTP服务的专用用户,虚拟用户只能访问FTP服务器资源。对于只需要通过FTP对系统有读 写权限,而不需要其他系统资源的用户或情况来说,采用虚拟用户方式是很适合的。 VSFTPD的虚拟用户采用单独的用户名/口令保存方式,与系统账号(passwd/shadow)分离,这大大增强了 系统的安全性。VSFTPD可以采用数据库文件来保存用户/口令,如hash;也可以将用户/口令保存在数据库服务器 中,如MySQL等。VSFTPD验证虚拟用户,则采用PAM方式。由于虚拟用户的用户名/口令被单独保存,因此在验证 时,VSFTPD需要用一个系统用户的身份来读取数据库文件或数据库服务器以完成验证,这就是guest用户,这正 如同匿名用户也需要有一个系统用户ftp一样。当然,guest用户也可以被认为是用于映射虚拟用户。 配置虚拟用户分为几部分:guest用户的创建、用户/口令的保存、PAM认证配置、vsftpd.conf文件设置等 。在后面的例子中,假定存在虚拟用户win和wingger. 1、在系统中添加vsftpdvirtual用户,作为虚拟用户在系统中的代表。 代码: [root@Linux_win vsftpd]# useradd vsftpdvirtual 当虚拟用户登录后,所在的位置为vsftpdvirtual的自家目录/home/vsftpdvirtual。 2、配置文件vsftpd.conf: 加入以下内容 guest_enable=YES guest_username=vsftpdvirtual virtual_use_local_privs=YES|NO 3、虚拟用户的权限配置。 virtual_use_local_privs参数, 当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。所有虚拟用户的权限使用local参数。 当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限,所有虚拟用户的权限使用anon参数。 这两者种做法相比,后者更加严格一些,特别是在有写访问的情形下。默认情况下此参数是关闭的(NO)。 由于本人的vsftpd为1.1.3,只好用virtual_use_local_privs=NO了: 因此匿名用户的设置即是虚拟用户的设置,在改参数权限时,同时也要修改目录权限 如:让用户不能浏览目录,但仍可以对文件操作且虚拟用户目录的权限改为只能由vsftpdvirtual操作: 代码: [root@Linux_win vsftpd]# chown vsftpdvirtual.vsftpdvirtual /home/vsftpdvirtual [root@Linux_win vsftpd]# chmod 700 /home/vsftpdvirtual 由于这些设置对匿名用户生效。最好是禁止匿名用户登录。 在VSFTPD-1.2.0以上版本,当virtual_use_local_privs=YES时,只需write_enable=YES,虚拟用户就可以就拥 有写权限。应该与本地用户使用相同,有兴趣的可以去验证。 如果不同用户使用不同的目录,须加入权限 代码: chown vsftpdvirtual.vsftpdvirtual /home/win chown vsftpdvirtual.vsftpdvirtual /home/wingger 4、用MySQL保存虚拟用户 1、虚拟用户的用户名/口令的保存。这部分在MySQL数据库中完成。 首先,创建数据库vsftpdvirtual以及表users,并插入虚拟用户win、wingger。执行以下命令: 代码: [root@Linux_win vsftpd]# #mysql -uroot -p mysql>create database vsftpdvirtual; mysql>use vsftpdvirtual; mysql>create table users(name char(16) binary,passwd char(16) binary); mysql>insert into users (name,passwd) values ('win',password('123456')); mysql>insert into users (name,passwd) values ('wingger',password('123456')); mysql>quit 然后,授权vsftpdvirtual只能读vsftpdvirtual数据库的users表。执行以下命令: 代码: [root@Linux_win vsftpd]# mysql -u root mysql -p mysql>grant select on vsftpdvirtual.users to vsftpdvirtual@localhost identified by '123456'; mysql>quit 验证刚才的操作是否成功可以执行下面命令: 代码: [root@Linux_win vsftpd]# mysql -u vsftpdvirtual -p123456 ftpdvirtual mysql>select * from users; 如果成功,将会列出wing、wingger和加密后的密码。 如下所示: 引用: mysql> select * from users; +---------+------------------+ | name | passwd | +---------+------------------+ | win | 23932fe477657768 | | wingger | 23932fe477657768 | +---------+------------------+ 2 rows in set (0.00 sec) 2、设置PAM认证。这里我们要用到一个利用mysql进行pam验证的开源项目(http://sourceforge.net/proj ects/pam-mysql/)。首先从网站下载它的程序包pam_myql-0.5.tar.gz。在编译安装之前,要确保mysql-devel 的RPM包已经安装在你的机器上,如果没有请从RHL安装光盘中安装该包。然后,执行以下命令: 代码: [root@Linux_win vsftpd]# tar xvzf pam_mysql-0.5.tar.gz [root@Linux_win vsftpd]# cd pam_mysql [root@Linux_win vsftpd]# make [root@Linux_win vsftpd]# cp pam_mysql.so /bli/security 接下来,我们要设置vsftpd的PAM验证文件。打开/etc/pam.d/vsftpd文件,加入以下内容: 引用: auth required pam_mysql.so user=vsftpdvirtual passwd=123456 host=localhost db=vsftpdvirtual table=users usercolumn=name passwdcolumn=passwd crypt=2 account required pam_mysql.so user=vsftpdvirtual passwd=123456 host=localhost db=vsftpdvirtual table=users usercolumn=name passwdcolumn=passwd crypt=2 具体可查看vsftpd源包里的EXAMPLE中的例子。 附:虚拟用户文档 1、vsftpd.conf配置文件 代码: [root@Linux_win vsftpd]# cat vsftpd.conf listen=YES listen_address=192.168.1.2 anonymous_enable=NO local_enable=YES write_enable=YES #anon_root= anon_upload_enable=YES anon_other_write_enable=YES anon_mkdir_write_enable=YES #anon_world_readable_only=YES #anon_umask=777 #dirmessage_enable=YES ftpd_banner=welcome to this FTP server xferlog_enable=YES #xferlog_file=/var/log/vsftpd.log connect_from_port_20=YES #pasv_mix_port=50000 #pasv_max_port=60000 #xferlog_std_format=YES max_clients=10 max_per_ip=10 hide_ids=YES #limit all users in it's owner dir #chroot_local_user=YES #or limit some chroot_local_user=NO chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list #use ownwer conf file user_config_dir=/etc/vsftpd/vsftpd_user_conf pam_service_name=/etc/pam.d/vsftpd guest_enable=YES guest_username=vsftpdvirtual #virtual_use_local_privs=NO 代码: 2、[root@Linux_win vsftpd]# cat /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 /lib/security/pam_mysql.so user=vsftpdvirtual passwd=123456 host=localhost db=vsftpdvirtual table=users usercolumn=name passwdcolumn=passwd crypt=2 account required /lib/security/pam_mysql.so user=vsftpdvirtual passwd=123456 host=localhost db=vsftpdvirtual table=users usercolumn=name passwdcolumn=passwd crypt=2 代码: 3、[root@Linux_win vsftpd]# cat /etc/vsftpd/chroot_list win wingger 代码: 4、[root@Linux_win vsftpd]# ls -l /etc/vsftpd/vsftpd_user_conf 总用量 8 -rw-r--r-- 1 root root 21 1月 8 00:25 win -rw-r--r-- 1 root root 25 1月 8 00:17 wingger 代码: 5、[root@Linux_win vsftpd]# cat /etc/vsftpd/vsftpd_user_conf/win local_root=/home/win [root@Linux_win vsftpd]# cat /etc/vsftpd/vsftpd_user_conf/wingger local_root=/home/wingger 代码: 6、drwx------ 6 vsftpdvirtual vsftpdvirtual 4096 1月 8 00:16 vsftpdvirtual drwxrwxrwx 5 vsftpdvirtual vsftpdvirtual 4096 1月 8 01:47 win drwxrwxrwx 3 vsftpdvirtual vsftpdvirtual 4096 1月 8 20:19 wingger 7、版本:(vsFTPd 1.1.3)、pam_mysql-0.5.tar.gz、mysql3.23.54 8、[root@Linux_win vsftpd]# mysql -u vsftpdvirtual -pchenwy vsftpdvirtual mysql> select * from users; +---------+------------------+ | name | passwd | +---------+------------------+ | win | 23932fe477657768 | | wingger | 23932fe477657768 | +---------+------------------+ 2 rows in set (0.00 sec)