找回密码
 注册
查看: 1162|回复: 1

vsftpd的一个问题卡了2周了,实在没法了,求助!

[复制链接]
发表于 2004-9-22 16:08:20 | 显示全部楼层 |阅读模式
我做了1种私人FTP服务器的设计:2种用户能登录服务器:标准匿名用户和admin虚拟用户.  匿名用户,可以下载FTP内一切资源,但只在upload目录内可以上传.对整个FTP任何目录无任何破坏性权限.  admin虚拟用户对FTP下资源拥有一切权限,用于远程管理。
配置文件如下:
# Standalone mode
listen=YES
# Access rights (username:anonymous)
no_anon_password=YES         
local_enable=YES
anon_upload_enable=YES        #给匿名用户足够的权限,
anon_mkdir_write_enable=YES   #让它可以在整个FTP目录内"写",
write_enable=YES             #但我们会限制这个些权限只在upload目录实现.
anon_umask=022                #让匿名用户上传的东东自动改权限为755.
# Security
connect_from_port_20=YES
hide_ids=YES                  
pasv_min_port=30000         
pasv_max_port=30999           
chroot_local_user=YES
# Features
async_abor_enable=YES
# Performance
idle_session_timeout=120     
data_connection_timeout=300   
accept_timeout=60            
connect_timeout=60
max_clients=200
max_per_ip=15
anon_max_rate=15000000000      
#banner
ftpd_banner=Welcome to daidong's FTP server (MSN:daidong2000@hotmail.com,QQ:51774541,未婚...)
当配置文件是这样的时候,匿名用户所需要的功能全部实现了。
然后我实现虚拟用户admin的功能。
在配置文件里加入:
chown_uploads=YES
chown_username=admin     #让admin对匿名用户上传的文件有写权限
#admin (virtual user)
guest_enable=YES               #启用用于管理的虚拟用户admin
guest_username=admin
user_config_dir=/etc/vsftpd_user_conf
再配置admin的配置文件,让admin成为FTP里的上帝。
anon_upload_enable=YES
anon_mkdir_write_enable=YES
write_enable=YES
anon_other_write_enable=yes
chroot_local_user=YES
anon_world_readable_only=NO
anon_umask=022
我的FTP下有个upload目录,ls一下,大致如下情况:
rwx-r-x-r-x   admin    ftp     upload
(我的admin不属于ftp组)。
我测试的时候发现我预期的FTP服务器功能都实现了,只剩一各问题,大问题:
我的匿名用户在upload目录上传的东西属性是600,即rw----------,这样,匿名用户上传的文件无法被下载。虽然配置文件中有anon_umask=022,但却在我在配置文件中chow_uploads,chown_username后失效!!去掉这两句后重新生效!!原因不明。
我查遍了官方资料,没发现这几个配置存在冲突。chown_uploads,chown_username又不能不加,否则匿名用户上传的文件,admin无写权限!
这个问题卡了我2周的时间了。实在很头疼。希望论坛里的高手能解答。
 楼主| 发表于 2004-9-22 16:17:39 | 显示全部楼层
这是答应风,要发的帖子,但是测试到最后却不能通过,就是被以上的问题卡住了。你可以看看我的这个帖子,了解我的思路,看我究竟哪里做错了:
======================
VSFTPD:V2.0.1源码包
FC2 kernel:2.6.5-1.358

首先建议下载源码包,因为里面自带官方的安装方法,配置介绍,例子,FAQ等。非常权威。
但安装VSFTPD的时候建议用RPM包安装。如果用源码安装,VSFTPD服务不会自动注册。
即如果要用用service vsftpd start,或者/etc/rc.d/init.d/vsftpd start启动,需手工修改某些文件。


以下是源码包的安装方法和软件配置,RPM包的安装过程也差不多:
一:安装VSFTPD (详见包内INSTALL文件)
1.进入安装目录,builds VSFTPD
cd /vsftpd2.0.1
make
//然后要建立VSFTPD安装需要的环境:建立nobody,ftp用户和相应目录。你可以把它当作在WIN下装些软件前
先要装WIN SP4来理解。有些情况下,这些用户和目录会已经在系统中存在,你就可以省略某些步骤。
2.建立VSFTPD需要的nobody用户
[root@localhost root]# useradd nobody
3.建立VSFTPD默认配置所需要empty目录
[root@localhost root]# mkdir /usr/share/empty/
4.对于匿名FTP,需要建立用户“ftp"和它的home目录。但此目录不属于ftp,也不授予其写权限。
home目录可以是你的ftp的根目录。
[root@localhost root]# mkdir /var/ftp/
[root@localhost root]# useradd -d /var/ftp ftp
[root@localhost root]# chown root.root /var/ftp
[root@localhost root]# chmod og-w /var/ftp
5.进入VSFTPD安装目录,输入make install,回车.
6.推荐以下几步,让你的VSFTPD使用更加方便。如果这些还没有实现的话。
cp vsftpd /usr/local/sbin/vsftpd
cp vsftpd.conf.5 /usr/local/man/man5
cp vsftpd.8 /usr/local/man/man8
7.拷贝默认配置以运行VSFTPD,根据系统版本不同,配置文件位置可能不同,这样做可以双保险。
cp vsftpd.conf /etc          //这应该是老版本的配置文件位置
cp vsftpd.conf /etc/vsftpd   //新版本环境下的位置
VSFTPD的官方FAQ:
***********
Q) Help! I've put settings in /etc/vsftpd.conf, but they are not taking
effect!

A) This is affecting some RedHat users - some RedHat versions put the config
file in /etc/vsftpd/vsftpd.conf.
***********
8.推荐修改vsftpd.conf,加入以下配置行
listen=YES    //启动standalone运行方式。
注:VSFTPD可以以2种方式启动。一种是standalone,一种是通过inetd(xinetd)来启动。
前一种独立运行方式应该是绝大部分正规FTP服务器的选择,启动后持续服务。
inetd(xinetd)方式可以认为是有FTP请求时才激活FTP服务器提供服务。
官方推荐standalone启动方式。
9.配置已经完成。
10.测试服务器,
以root登录,并确认无其他FTP服务在运行(否则会出现500错误,提示无法绑定IPV4监听套接字,也就是说FTP端口被占用了。因为VSFTPD有可能自动运行。在命令行下输入ntsysv,然后看下vsftpd是否选中?如果是,取消它。),输入
vsftpd &         (最保险的启动方式)
或者
service vsftpd start (如果你是RPM包安装的话)
或者
/etc/rc.d/init.d/vsftpd start (如果你是RPM包安装的话)
都可以启动服务。
[root@Nortel vsftpd]# ftp nortel.com
Connected to nortel.com (127.0.0.1).    //登录本机

220 Welcome to daidong's FTP server

Name (nortel.com:root): ftp

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>
有类似以上输入输出就说明FTP服务器起来了。

二.VSFTPD的用户账号
我认为VSFTD里有2种登录方式,一是本地用户登录。一是匿名用户。
匿名用户又分2类,一是标准的匿名用户(anonymous),一是有用户名字和密码的虚拟用户(virtual user).
因为为虚拟用户分配各权限的输入和配置标准匿名用户一样,所以我把虚拟用户看做特殊的匿名用户(你配置虚拟用户的时候更容易理解这个判断).
不推荐使用本地用户登录,虽然可以用nologin方法让它不能登录系统,但用户毕竟系统中存在,始终是安全隐患。本文不介绍本地用户的配置方法了。
虚拟用户即只可以在FTP中使用的用户。
附上虚拟用户的官方解释:
A virtual user is a user login which does not exist as a real login on the
system. Virtual users can therefore be more secure than real users, beacuse
a compromised account can only use the FTP server.

三.我做了2种私人FTP服务器的设计,适用于长时间开放的个人FTP服务器或者是小群体服务器.

(如果要建立更强大安全的FTP服务器,例如企业级或者大下载量的网站使用的,就要看个人或者团队的道行了,^^)



2种设计方案如下:
NO.1:3种用户能登录服务器:匿名用户,upload虚拟用户和admin虚拟用户.

     匿名用户登录后只可以下载服务器里供下载的一切资源,包括网友上传的upload目录内的文件,但无任何可能造成破坏的权限(删除,改名等).
     upload虚拟用户专门上传.但只能锁定在upload目录内.可以下载此目录下一切资源.但无任何造成破坏的权限.
     admin虚拟用户对FTP下的资源拥有一切权限,用于远程管理.

NO.2:2种用户能登录服务器:标准匿名用户和admin虚拟用户.

      匿名用户,可以下载FTP内一切资源,但只在upload目录内可以上传.对整个FTP任何目录无任何破坏性权限.
     (在这里,匿名用户整合了NO.1方案里的匿名用户和upload用户的功能)
     admin虚拟用户对FTP下资源拥有一切权限,用于远程管理.
以上是很常用的私人或小群体架设的公共FTP服务器的方式.而且第2种方式是近乎理想状态的.

(需要不同的用户名字和密码才能登录服务器的方式也在广泛使用,便于管理,虽然经常不受下载者的欢迎...本文不介绍这种方式,因为VSFTPD的网管功能本身就不方便直观,但你可以根据虚拟用户的配置方法来推导出这种配置方式.)

====================
以下主要介绍第2种服务器方案的实现过程.其它方式,可以类推.
实现步骤如下(vsftpd.conf配置内容与更多设置请参考安装包内的vsftpd.conf.5):
提醒:建议配置文件内的配置项如果和默认值一样的话,尽量别写入vsftpd.conf,否则容易影响你进行troubshooting.
1.修改vsftpd.conf文件如下,让匿名用户对FTP拥有充足的读写权限
# Standalone mode
listen=YES
# Access rights (username:anonymous)
no_anon_password=YES          #匿名用户密码不重要,干脆不要输入了
local_enable=YES
anon_upload_enable=YES        #给匿名用户足够的权限,
anon_mkdir_write_enable=YES   #让它可以在整个FTP目录内"写",
write_enable=YES              #但我们会限制这个些权限只在upload目录实现.
anon_umask=022                #让匿名用户上传的东东自动改权限为755. 777-022=755. 这里很重要.
                              #否则可能出现上传的文件没有下载的权限的问题.
# Security
connect_from_port_20=YES
hide_ids=YES                  
pasv_min_port=30000           #如果你系统中存在一个防火墙,
pasv_max_port=30999           #那这个设置很有好处.
chroot_local_user=YES
# Features
async_abor_enable=YES
# Performance
idle_session_timeout=120      #这几个项目和默然值一样,
data_connection_timeout=300   #但为了方便随时调整,
accept_timeout=60             #所以把它们明确写出来了.
connect_timeout=60
max_clients=200
max_per_ip=15
anon_max_rate=15000000000      #没人能不晕倒....(根据实际情况自己调整,我或许真的能提供这么高的下载速度...^^)
#banner
ftpd_banner=Welcome to daidong's FTP server (MSN:daidong2000@hotmail.com,QQ:51774541,未婚...)
#admin (virtual user)
guest_enable=YES               #启用用于管理的虚拟用户admin
guest_username=admin
user_config_dir=/etc/vsftpd_user_conf #这个目录下存放admin的配置文件


2.FTP根目录/var/ftp,假设下有2个目录:pub,upload,现在修改文件夹权限
chown root.root pub    //这个目录里放这FTP服务器的所有资源,只能下载,不能写入
chmod 555 pub          //虽然VSFTPD.CONF容许匿名用户写入,但LINUX系统不容许,结果就是NO.
chown ftp.ftp upload   //这个目录让用户上传,
chmod 755 upload       //VSFTPD.CONF里设置的匿名用户写权限在此实现了.与系统无冲突.
注:至此实现了匿名用户可下载一切FTP资源,但只能在指定目录上传的目的.

3.虚拟用户admin的启用 (具体请参见安装包内的EXAMPLE目录下VIRTUAL_USER和VIRTUAL_USER_2目录)
步骤如下(如果你的系统的实际情况,需要相应改变到相关的目录进行操作):
A.在和配置文件VSFTPD.CONF同一目录下,创建一个用户/密码表,如admin.txt
  里面按用户名字,密码顺序竖直写一排,如:
  admin  //用户名字
  admin  //密码
B.(以root用户登录,)根据admin文件,建立认证数据库文件,
  db_load -T -t hash -f admin.txt /etc/vsftpd_login.db
  chmod 600 /etc/vsftpd_login.db
  注:这要求你Berkeley db程序已经安装过了(默认是已经装好了的).
C.使用这个db文件创建一个PAM文件,可以在安装包内COPY一个过来,叫vsftpd.pam.也应该可以自己建立.
 文件内包含以下内容:
 auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
 account required /lib/security/pam_userdb.so db=/etc/vsftpd_login
 然后把PAM文件拷贝到/etc/pam.d下并改名字为ftp.
cp vsftpd.pam /etc/pam.d/ftp
D.添加虚拟用户并设置home目录
 useradd -d /var/ftp admin
 ls -ld /var/ftp
 (which should give):
 drwx------    3 admin  admin      4096 Jul 30 00:39 /var/ftp
E.建立虚拟用户admin的配置文件
  mkdir /etc/vsftpd_user_conf      //建立虚拟用户配置文件目录
  cd /etc/vsftpd_user_conf
  touch admin                      //配置文件名字要和虚拟用户名字一致
  vi admin                         //输入admin的配置文件
***************
  问:如果虚拟用户配置文件内容和/etc/vsftpd/vsftpd.conf冲突会如何?
  答:配置文件的原则我总结的是:后面的配置项目将覆盖前面的配置项目,除非前面的配置项目已经实行,如banner.
  具体也见官方文档FAQ。
***************
  admin配置文件如下:
  # Access rights (username:anonymous)
  anon_upload_enable=YES
  anon_mkdir_write_enable=YES
  # Security
  write_enable=YES
  anon_other_write_enable=yes
  #upload (username:upload)
  chroot_local_user=YES
  anon_world_readable_only=NO
  anon_umask=022
F.修改目录权限。让admin可写入PUB目录。
  chown -R admin.root pub        (pub下的文件只能被COPY进这个目录,而不能被mount --bind的方式进入,否则不能chown -R)
  chown admin.ftp upload
  
G.至此,NO.2方案已经实现。

要实现NO.1的方案,微调以上配置。将虚拟用户home目录指定到/var/ftp/upload,这样就不需要修改upload目录
权限,做法虽然没有NO.2方法灵活,但更加标准。

如果要临时提供某些资源的下载,官方建议用mount --bind方式。
例如:mount -o ro --bind /mnt/e/mp3 /var/ftp/pub
这样,WIN下的E盘就以只读方式挂在LINUX下的/var/ftp/pub目录下了。

如果要使用企业用的FTP,请将upload目录单独移出匿名用户不可达处。甚至可以禁用匿名登录,全部使用虚拟用户,
而且可以分配不同的权限,只要在/etc/vsftpd_user_conf下增加不同的用户配置文件即可。

最后,唯一没有给出例子的是本地用户登录,有兴趣的朋友请参考官方文档。但提醒一下,那样不够安全。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2021-10-28 07:31 , Processed in 0.045148 second(s), 17 queries .

© 2021 Powered by Discuz! X3.4.

快速回复 返回顶部 返回列表