目录
本文的配置方法不使用系统用户而采用 vsftpd 的虚拟用户来操作 ftp,虚拟用户在操作系统中并不存在,只用于登录管理 ftp,但虚拟用户登录成功后需要使用本地帐号来管理系统上的文件。关于 vsftpd 虚拟用户的介绍可以看看 kangzye 的文章《为vsftpd 建立虚拟用户》中开头的介绍。
正文
虚拟用户登录成功后会使用它的权限来管理系统上的文件,此用户不需要登录,所以“/sbin/nologin”,以用户名 ftpvser 为例:
useradd -d /home/ftpvuser -s /sbin/nologin ftpvuser
让 ftpvuser 对 ftp 根目录 /var/ftp 有读写权限:
chown ftpvuser.ftpvuser /var/ftp chmod 700 /var/ftp
如果需要 apache 对此目录有操作权限,可以:
usermod -G ftpvuser apache chmod 770 /var/ftp
主配置文件为 /etc/vsftpd/vsftpd.conf,需要关闭匿名用户、开启虚拟用户及其它一些设置。
配置参考:(见文末)点击这里转到
第一步:安装组件(用于使用其 db_load 命令生成虚拟用户数据库):
yum -y install db4-utils db4-devel
第二步:建立虚拟用户表:
创建用户表文件 /etc/vsftpd/vusers.txt (其实就是一个文本文档),内容为(一行用户名,下一行用户的密码,依次类推):
demoer demoerPasswd user1 user1Passwd
第三步:生成虚拟用户数据库
将第二步中创建的用户表生成为用户数据库文件(扩展名为“.db”)并设置权限为 600:
db_load -T -t hash -f /etc/vsftpd/vusers.txt /etc/vsftpd/vusers.db chmod 600 /etc/vsftpd/vusers.db
第四步:删除虚拟用户表文件
最终需要的是生成的虚拟用户数据库文件,为了安全可以将 /etc/vsftpd/vusers.txt 删除:
rm -f /etc/vsftpd/vusers.txt
或将此文件修改为其他人不可读:
chmod 600 /etc/vsftpd/vusers.txt
建立用户控制文件夹 /etc/vsftpd/vusers,其下为以用户名命名的文件。创建文件 /etc/vsftpd/vusers/demoer,文件名必须与用户名相同,用于配置虚拟用户 demoer 的权限,内容:
local_root=/var/ftp/demoer # 用户 demoer 登录的主目录 anon_umask=022 # 如果需要 apache 也操作,为:002 write_enable=YES # 目录可写 anon_world_readable_only=NO # 不详 anon_upload_enable=YES # 启用上传 anon_mkdir_write_enable=YES # 允许修改 anon_other_write_enable=YES # 允许写之外的操作,比如“删除”
参考以上,为 user1 设置权限:(略)
五、修改 vsftpd 认证关系:
清空(记得先备份) /etc/pam.d/vsftpd,添加以下两行(后边的用户数据库文件不要加“.db”):
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vusers account required /lib/security/pam_userdb.so db=/etc/vsftpd/vusers
重启 vsftpd 服务可以使用这两个办法的一个:
service vsftpd restart /etc/init.d/vsftpd restart
0、列表错误
原因:检查是不是SELinux的问题,可以先关闭SELinux试试。
1、登录后怎么设置目录列表都为空
原因:local_root 指定的本地目录没有可执行权限,目录的 x 权限用于浏览目录,如果没有此权限用户就不可以将该目录下的文件列出来,所以就空了。参考命令:chmod 777 /var/ftp/demoer。
2、为用户设置了写权限,可依旧拒绝访问
原因:除了在 user_config_dir 设置的目录中为定义用户权限外,还需要在系统中为用户的 local_root 指定的目录设置好权限,如果本地系统都没权限 ftp user 无论如何也不会有权限的。
3、vsftp 和 apache 不能相互编辑、删除各自的文件
原因:apche 生成的、ftp 上传的文件和目录默认umask 为022,其他人是不能操作的。解决文件互操作最简单的办法是让 vsftpd 以 apache 的身份运行(vsftpd.conf 中 guest_username=apache)。
<完>
使用时请将行后的注释删除。
#### 匿名用户:#### anonymous_enable=NO # 关闭匿名用户 anon_upload_enable=NO # 关闭匿名用户权限,下同 anon_mkdir_write_enable=NO anon_other_write_enable=NO anon_world_readable_only=NO chown_uploads=NO # 不更改上传文件的属主 #chown_username=whoever # 修改上传文件的为用户 whoerer 所有 anon_max_rate=5120000 # 匿名用户上传速度 #### 虚拟用户:#### pam_service_name=vsftpd guest_enable=YES # 启用虚拟用户 guest_username=ftpvuser # 虚拟用户使用哪个本地帐号的权限 virtual_use_local_privs=NO user_config_dir=/etc/vsftpd/vusers # 保存虚拟用户权限的目录 #### 本地帐户:#### local_enable=YES # 启用本地用户,虚拟用户需要其为YES local_umask=022 userlist_enable=YES userlist_file=/etc/vsftpd/user_list chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list local_max_rate=5120000 #### 帐户常规配置:#### write_enable=YES chroot_list_enable=NO chroot_local_user=YES secure_chroot_dir=/usr/share/empty text_userdb_names=YES ftpd_banner=Welcome to FTP service. dirmessage_enable=YES message_file=.message #### 系统配置: #### nopriv_user=ftpvuser listen=YES listen_port=22212 # ftp 端口号,默认为 21 use_localtime=YES ls_recurse_enable=NO idle_session_timeout=600 data_connection_timeout=120 accept_timeout=60 connect_timeout=60 tcp_wrappers=YES max_clients=100 max_per_ip=10 connect_from_port_20=YES pasv_enable=YES #pasv_promiscuous=NO pasv_min_port=5000 # 被动模式最小端口号(用于设置防火墙) pasv_max_port=5010 # 被动模式最大端口号(用于设置防火墙) port_enable=YES #port_promiscuous=NO #### 日志:######## xferlog_enable=YES xferlog_std_format=NO log_ftp_protocol=YES xferlog_file=/var/log/ftpvuser.log #### 文件传输:#### async_abor_enable=NO ascii_upload_enable=YES ascii_download_enable=YES
防火墙规则参考:
# 添加规则,22212为vsftpd服务端口,5000:5010为 ftp 被动模式时使用的端口范围 iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22212 -j ACCEPT iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 5000:5010 -j ACCEPT iptables -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT # 保存防火墙规则 service iptables save # 重启防火墙 service iptables restart
<End>